У меня есть тестовая таблица для этого упражнения:
CREATE DATABASE QueryTest
GO
USE QueryTest
CREATE TABLE Person
(
ID INT IDENTITY (1,1),
FirstName NVARCHAR(50),
SurName NVARCHAR(50),
Salary MONEY
)
INSERT INTO Person
SELECT TOP 2000
FirstName,
LastName,
RAND(CAST( NEWID() AS varbinary)) *100000
FROM [AdventureWorks2014].[Person].[Person]
ORDER BY NEWID()
CREATE INDEX IX_Person_Salary ON Person
(
Salary
)
Если я выполню следующее, я получу сканирование таблицы, чего я и ожидал
SELECT Salary FROM Person
Если я сделаю это, я получу индексный поиск - опять-таки, вполне ожидаемый,
SELECT Salary FROM Person WHERE Salary > 270
Однако, если я сделаю это:
SELECT Salary FROM Person WHERE Salary > 0
Я получаю поиск по индексу (несмотря на то, что он возвращает все строки из таблицы
Кроме того, если я бегу
SELECT Salary FROM Person
SELECT Salary FROM Person WHERE Salary > 0
в одной партии, они оба составляют 50% от партии
Что здесь происходит?
Почему SQL Server использует поиск, когда предложение WHERE присутствует, если все строки будут возвращены?
Почему индекс ищет такую же стоимость, как индексное сканирование?
У меня сложилось впечатление, что SQL Server будет использовать свою статистику, чтобы оценить, сколько строк должно быть возвращено, и затем соответствующим образом спланировать его выполнение. Статистика скажет, что> 0 - это все строки, и, следовательно, сканирование в этом случае будет менее затратным?