Еще один пример бездумного использования хинтов.
1.Применяем хинты и изменяем порядок joinoв
SQL Server Execution Times:
CPU time = 50 ms, elapsed time = 68 ms.
SELECT A.ITEMID,SUM(B.AVAILPHYSICAL),MIN(B.INVENTDIMID),B.ITEMID,C.INVENTLOCATIONID
FROM
[bmssa].INVENTDIM C(INDEX(I_698DIMIDIDX)NOLOCK),
[bmssa].INVENTSUM B (NOLOCK),
[bmssa].INVENTTABLE A(NOLOCK)
WHERE (A.DATAAREAID='dat') AND ((B.DATAAREAID='dat') AND
(A.ITEMID=B.ITEMID)) AND
((C.DATAAREAID='dat') AND (B.INVENTDIMID=C.INVENTDIMID))
GROUP BY A.ITEMID,B.ITEMID,C.INVENTLOCATIONID
ORDER BY A.ITEMID,B.ITEMID,C.INVENTLOCATIONID
OPTION(--FAST 1,
FORCE ORDER)
Table 'INVENTTABLE'. Scan count 50, logical reads 103, physical reads 4, read-ahead reads 0.
Table 'INVENTSUM'. Scan count 8, logical reads 58, physical reads 4, read-ahead reads 0.
Table 'INVENTDIM'. Scan count 1, logical reads 9, physical reads 2, read-ahead reads 0.
SQL Server Execution Times:
CPU time = 10 ms, elapsed time = 92 ms.
------------------------------------------------------------------------------------------------
2. Без хинтов
SQL Server Execution Times:
CPU time = 50 ms, elapsed time = 62 ms.
SELECT A.ITEMID,SUM(B.AVAILPHYSICAL),MIN(B.INVENTDIMID),B.ITEMID,C.INVENTLOCATIONID
FROM [bmssa].INVENTTABLE A(NOLOCK) ,[bmssa].INVENTSUM B(NOLOCK) ,[bmssa].INVENTDIM C(NOLOCK)
WHERE (A.DATAAREAID='dat') AND ((B.DATAAREAID='dat') AND (A.ITEMID=B.ITEMID)) AND
((C.DATAAREAID='dat') AND (B.INVENTDIMID=C.INVENTDIMID))
GROUP BY A.ITEMID,B.ITEMID,C.INVENTLOCATIONID
ORDER BY A.ITEMID,B.ITEMID,C.INVENTLOCATIONID
(50 row(s) affected)
Table 'INVENTTABLE'. Scan count 50, logical reads 103, physical reads 4, read-ahead reads 0.
Table 'INVENTSUM'. Scan count 8, logical reads 58, physical reads 4, read-ahead reads 0.
Table 'INVENTDIM'. Scan count 1, logical reads 9, physical reads 2, read-ahead reads 0.
SQL Server Execution Times:
CPU time = 30 ms, elapsed time = 92 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
Те кол-во чтений тоже, но время выполнения уменьшилось.К сожалению,у меня тестовая БД с меньшим объемом поэтому результаты могут отличаться.
Цитата:
не спорю, но как правило, выдает гораздо чаще, чем не выдает
Именно для этого и нужны хинты, а особенно, когда приходиться бороться с чужой БД, у которой нет исходников клиента. Вылизывание иногда позволяет сократить время выполнения с 30-40 с до 3-7(было у меня и такое).
Возможно, я не совсем правильно понял автора, если призывается вдумчиво использовать подсказки, которые на разных объемах работаю по-разному, то я полностью согласен.На мой взгляд, это последнее средство для оптимизации, прежде всего: правильная структура БД, индексов(для этого запроса напрашиваются кластерные индексы, которых нет, что в общем - моветон) и тд.