Показать сообщение отдельно
Старый 28.07.2004, 18:18   #3  
psv is offline
psv
Участник
 
11 / 10 (1) +
Регистрация: 21.08.2003
Еще один пример бездумного использования хинтов.

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(было у меня и такое).
Возможно, я не совсем правильно понял автора, если призывается вдумчиво использовать подсказки, которые на разных объемах работаю по-разному, то я полностью согласен.На мой взгляд, это последнее средство для оптимизации, прежде всего: правильная структура БД, индексов(для этого запроса напрашиваются кластерные индексы, которых нет, что в общем - моветон) и тд.