Какой SQL-запрос быстрее и почему? - PullRequest
1 голос
/ 04 июля 2011

Недавно меня попросили написать запрос для выбора свойств объектов из группы, которая содержит максимальное количество таких объектов.Итак, я сделал это в базе данных Northwind (распределенный образец MSFT) несколькими способами.

ONE:

SELECT cat.CategoryName, prod.ProductName 
  FROM Categories cat 
  JOIN Products prod ON cat.CategoryID = prod.CategoryID
  JOIN (SELECT TOP 1 p.CategoryID, COUNT(p.ProductId) as products
          FROM Categories c 
          JOIN Products p on c.CategoryID = p.CategoryID
      GROUP BY p.CategoryID
      ORDER BY products desc) c ON c.CategoryID = cat.CategoryID

TWO:

SELECT cat.CategoryName, prod.ProductName
  FROM Categories cat
  JOIN Products prod ON cat.CategoryID = prod.CategoryID
  JOIN (SELECT CategoryID, COUNT(ProductID) m_count
          FROM Products 
      GROUP BY CategoryID
        HAVING COUNT(ProductID) = (SELECT MAX(sub.cnt) 
                                     FROM (SELECT CategoryId, COUNT(ProductID) cnt 
                                             FROM Products 
                                         GROUP BY CategoryId) sub)) m ON m.CategoryID = cat.CategoryID

Вопрос в том,: что быстрее любого, почему ?В планах исполнения ничего особенно не выделяется.Прошедшее время меняется незначительно, но примерно одинаково.База данных, конечно, крошечная.

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Крошечная база данных затрудняет определение того, что лучше, но в SQL Server Management Studio есть функция сравнения эффективности операторов друг с другом.

  1. Open Management Studio
  2. Нажмите кнопку «Новый запрос»
  3. Нажмите, чтобы включить «Включить фактический план запроса»
  4. Опубликовать все запросы в активном окне запроса
  5. Нажмите кнопку «Выполнить»
  6. Щелкните вкладку «План выполнения» (слева от результатов), когда она появится

Стоимость запроса усредняется по количеству выполненных запросов.Таким образом, если сравнивать два запроса, приведенные в качестве примеров, если оба имеют стоимость 50%, то они эквивалентны (потому что 100/2 = 50 и т. Д.).Если есть разница, вы можете навести указатель мыши на SELECT, чтобы просмотреть стоимость поддерева, кроме просмотра графического макета пути выполнения.

Почему один быстрее другого?

Это зависит отбаза данных - типы данных, к которым присоединяются (являются ли они настолько узкими, насколько они могут быть?Использование другого синтаксиса может иметь все значение.

0 голосов
/ 05 июля 2011

Выполнить оба оператора SQL с активированным SET SHOWPLAN_ALL ON.Сервер SQL предоставит вам информацию о запросах, которая должна помочь вам понять, что происходит и какой будет / будет быстрее.

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