select * from FOOS where FOOID like 2
следует избегать, так как это приведет к неявному приведению обеих сторон к varchar
и означает, что индекс не может быть использован для удовлетворения запроса.
CREATE TABLE #FOOS
(
FOOID INT PRIMARY KEY,
Filler CHAR(1000)
)
INSERT INTO #FOOS(FOOID)
SELECT DISTINCT number
FROM master..spt_values
SELECT * FROM #FOOS WHERE FOOID LIKE 2
SELECT * FROM #FOOS WHERE FOOID = 2
DROP TABLE #FOOS
Планы (обратите внимание на оценкузатраты)
![enter image description here](https://i.stack.imgur.com/Vu1pa.png)
Другой способ увидеть разницу в стоимости - добавить SET STATISTICS IO ON
Вы видите, что первая версия возвращает что-то вроде
Table '#FOOS__000000000015'. Scan count 1, logical reads 310
Вторая версия возвращает
Table '#FOOS__000000000015'. Scan count 0, logical reads 2
Это потому, что чтения, необходимые для поиска по этому индексу, пропорциональны глубине индекса, тогда как чтения, необходимые для сканирования, пропорциональны количеству страниц.в указателе.Чем больше таблица, тем больше будет расхождение между этими двумя числами.Вы можете увидеть обе эти цифры, выполнив следующую команду:
SELECT index_depth, page_count
FROM
sys.dm_db_index_physical_stats (2,object_id('tempdb..#FOOS'), DEFAULT,DEFAULT, DEFAULT)
WHERE object_id = object_id('tempdb..#FOOS') /*In case it hasn't been created yet*/