РЕДАКТИРОВАТЬ : -
При использовании PK в столбце Id производится следующее для EXISTS и COUNT (*)> 0
Table 'TableWithHugeData'. Scan count 0, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
IF OBJECT_ID('TableWithHugeData') IS NOT NULL
BEGIN
DROP TABLE TableWithHugeData
END
CREATE TABLE TableWithHugeData
(
ID UNIQUEIDENTIFIER,
Name varchar(max)
)
DECLARE @Counter INT
SELECT @Counter = 0
WHILE (@Counter < 50000)
BEGIN
INSERT INTO TableWithHugeData
VALUES (NewId(),'Ashish ' + Convert(varchar(5000),@Counter))
SELECT @Counter = @Counter +1
END
EXISTS
DBCC FreeProcCache
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
DECLARE @Id UNIQUEIDENTIFIER
SELECT @Id = '28BD1F4C-7D89-4731-9D2C-21ECB20500F8'
IF EXISTS (SELECT * FROM TableWithHugeData WHERE Id = @Id)
BEGIN
SELECT CONVERT(BIT, 1)
END
ELSE
BEGIN
SELECT CONVERT(BIT, 0)
END
Статистика ввода-вывода для EXISTS: -
Таблица «TableWithHugeData».Сканирование 1, логическое чтение 6, физическое чтение 1, чтение с опережением 270, логическое чтение с лота 0, физическое чтение с лоба 0, чтение с опережением чтения 0.
COUNT (*)> 0
DBCC FreeProcCache
DBCC DROPCLEANBUFFERS
DECLARE @Id UNIQUEIDENTIFIER
SELECT @Id = '28BD1F4C-7D89-4731-9D2C-21ECB20500F8'
IF (SELECT COUNT(*) FROM TableWithHugeData WHERE Id = @Id)>0
BEGIN
SELECT CONVERT(BIT, 1)
END
ELSE
BEGIN
SELECT CONVERT(BIT, 0)
END
* Статистика ввода-вывода для счета ()> 0 **: -
Таблица 'TableWithHugeData'.Сканирование 1, логическое чтение 6, физическое чтение 1, чтение с опережением 270, логическое чтение с лоба 0, физическое чтение с лоба 0, чтение с опережением чтения 0.
Как видите, статистика ввода-вывода для EXISTSи COUNT (*)> 0 одинаковы.Я думал, что EXISTS будет быстрее и будет выполнять меньше операций чтения.Я что-то здесь упускаю?Будет ли определение первичного ключа иметь какое-либо значение?