Я пытаюсь выяснить, что быстрее: предложение типа «WHERE IN (SELECT 1 FROM MyTable)» или предложение типа «WHERE EXISTS (SELECT 1 FROM MyTable)».
Воспользуемся запросом из документации SqlServer:
SELECT * FROM Orders
WHERE ShipRegion = 'WA' AND EXISTS (
SELECT EmployeeID FROM Employees AS Emp
WHERE Emp.EmployeeID = Orders.EmployeeID)
Или же
SELECT * FROM Order
WHERE ShipRegion = 'WA' AND EmployeeID IN (
SELECT EmployeeID FROM Employees AS Emp
WHERE Emp.EmployeeID = Orders.EmployeeID)
Я хотел бы знать ответ, если он у кого-то есть, но мне действительно хотелось бы знать, как проверить его на себе в SqlServer 2005. (Я новичок в SqlServer.)
Благодарность!
4 ответа
Чтобы убедиться в этом, вы можете: сравнить реальные затраты на выполнение, запустить
SET STATISTICS IO ON
SET STATISTICS TIME ON
Затем запустите оба запроса
Также сравните планы выполнения, выделите оба запроса и нажмите Ctrl + L, и вы увидите планы. Скорее всего, вы увидите идентичные планы.
Подзапрос sql, хотя и идентичен, не даст вам ответа, который вы ищете, поскольку он связан и может быть изменен на JOIN.
В общем, EXISTS () должен быть быстрее, поскольку он дает результат без необходимости искать какие-либо отношения после того, как он нашел первую строку, тогда как IN () все еще должен найти последующие строки, пока он не завершится.
Следовательно
SELECT * FROM Orders
WHERE ShipRegion = 'WA' AND EXISTS (
SELECT 'x' FROM Employees AS Emp
WHERE Emp.EmployeeID = 42)
Должен закончить раньше
SELECT * FROM Order
WHERE ShipRegion = 'WA' AND EmployeeID IN (
SELECT EmployeeID FROM Employees AS Emp
WHERE Emp.EmployeeID = 42)
Вы также можете удалить предложение WHERE
в случае IN
:
SELECT * FROM Orders
WHERE ShipRegion = 'WA' AND EmployeeID IN (SELECT EmployeeID FROM Employees)
Оптимизатор запросов должен иметь возможность генерировать идентичный план выполнения для обоих запросов. Я бы выбрал более читаемый.
Использование INNER JOIN будет быстрее, чем подзапрос:
SELECT *
FROM Order o
INNER JOIN Employees e ON o.EmployeeID = e.EmployeeID
WHERE ShipRegion = 'WA'
Или с конкретными критериями:
SELECT *
FROM Order o
INNER JOIN Employees e ON o.EmployeeID = e.EmployeeID
WHERE ShipRegion = 'WA'
AND e.EmployeeID = 42
Похожие вопросы
Новые вопросы
sql-server
Microsoft SQL Server - это система управления реляционными базами данных (RDBMS). Используйте этот тег для всех выпусков SQL Server, включая Compact, Express, Azure, Fast-track, APS (ранее PDW) и Azure SQL DW. Не используйте этот тег для других типов СУБД (MySQL, PostgreSQL, Oracle и т. Д.). Не используйте этот тег для проблем, связанных с разработкой программного обеспечения и мобильных устройств, если только он не связан напрямую с базой данных.