Могу ли я доверять планам выполнения? - PullRequest
2 голосов
/ 23 января 2010

У меня есть эти запросы:

With CTE(comno) as
(select distinct comno=ErpEnterpriseId from  company)
select id=Row_number() over(order by comno),comno from cte

select comno=ErpEnterpriseId,RowNo=Row_number() over (order by erpEnterpriseId) from company group by ErpEnterpriseId


SELECT erpEnterpriseId, ROW_NUMBER() OVER(ORDER BY erpEnterpriseId) AS RowNo 
FROM 
( 
    SELECT DISTINCT erpEnterpriseId 
    FROM Company 
) x 

Все три из них возвращают одинаковую стоимость и фактические планы выполнения.

Ответы [ 3 ]

1 голос
/ 23 января 2010

Все дело в оптимизаторе запросов, который попытается оптимизировать вводимый вами запрос в наиболее эффективный план выполнения (т. Е. Несколько различных запросов могут быть оптимизированы до того же оператора, который оценивается как наиболее эффективный). 1001 *

Главное, что вы должны сделать, пытаясь оптимизировать запрос и найти, какой из них выполняет лучше всего, - это просто попробовать его и сравнить производительность. Запустите трассировку профилировщика SQL, чтобы увидеть, какова продолжительность / чтение для каждой версии. Я обычно запускаю каждую версию запроса 3 раза, чтобы получить среднее значение для сравнения. Каждый раз очищать план выполнения и кэш данных, чтобы предотвратить искажение результатов.

Стоит прочитать эту статью MSDN на оптимизаторе.

1 голос
/ 23 января 2010

Простой, оптимизатор, вероятно, превращает все ваши утверждения в одно и то же утверждение.

0 голосов
/ 23 января 2010

Точно так же, как в английском, где есть много способов сказать одно и то же, все три из этих запросов запрашивают одни и те же данные. SQL Engine (оптимизатор запросов) знает это и достаточно умен, чтобы знать, о чем вы спрашиваете.

Еще более уместно, у движка есть информация, которую вы не знаете (или, вероятно, не знаете) - как данные организованы и проиндексированы. Он использует эту информацию, чтобы принять собственное решение о том, какой ЛУЧШИЙ способ получить данные, и это то, что он делает.

Хотя существуют способы переопределить оптимизатор, но если вы действительно не знаете, что делаете, вы, вероятно, только ухудшите производительность. Таким образом, ваш лучший вариант - писать запросы любым удобным для вас (или других людей) способом для удобства чтения и поддержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...