Я пробовал поиск через поисковые системы, MSDN и т.д. но ничего не может. Извините, если это было задано раньше. Есть ли разница в производительности между использованием ключевого слова "Между" или "Сравнение" T-SQL?
Сравните разницу в производительности между T-SQL между оператором '<' '>'?
Ответ 1
Вы можете проверить это достаточно легко, проверив планы запросов в обеих ситуациях. Я не знаю никакой разницы. Существует логическая разница, хотя между BETWEEN и "<" и " > "... МЕЖДУ ВКЛЮЧЕНЫ. Это эквивалентно "< =" и "= > ".
Ответ 2
Механизм запросов преобразуется между >=
и <=
(см. план запроса), поэтому на практике они идентичны и теоретически >= <=
выполняется быстрее, потому что движок не будет переводить. Удачи, заметив разницу, хотя.
Я использую между прочим, я считаю, что это легче читать
Очень сложные запросы/вложенные представления с многочисленными сравнениями могут извлечь выгоду из изменения в >= <=
, поскольку это может потенциально предотвратить таймауты оптимизации, сократив время, затрачиваемое на рефакторинг запроса (просто теория, не проверенная мной, и я никогда не заметил это)
Ответ 3
Два оператора, которые сравниваются друг с другом здесь, принципиально отличаются друг от друга, и поэтому планы выполнения, которые генерируются, также могут быть разными (хотя и не гарантированы).
Определяющим фактором является распределение данных (селективность) столбца, к которому применяются операторы сравнения. Это вместе со Статистикой будет определять, используется или нет индекс или нет.
Надеюсь, что это имеет смысл.
Ответ 4
Любовь, когда люди дают код для собственного тестирования, вам нужно сделать более крупный подмножество/повторный тест для учета индексов, загружаемых в память и т.д., прежде чем перейти к выводам. Вот тот же код с большой таблицей и 10 итерациями
DECLARE
@Startdatetime datetime ,
@Diff int = 0 ,
@Addrowcount int = 1000 ,
@ptr int = 1;
SET NOCOUNT ON;
--Create a tempory table to perform our tests on
DROP TABLE dbo.perftest
CREATE TABLE dbo.perftest( id int NOT NULL
IDENTITY(1 , 1)
PRIMARY KEY ,
mytext nvarchar( 50 )NOT NULL );
--Now add some sample rows
SET @Addrowcount = 20000;
WHILE(@Addrowcount > 0)
BEGIN
INSERT INTO dbo.perftest( mytext )
VALUES( 'thetext' );
SET @Addrowcount = @Addrowcount - 1;
END;
WHILE @ptr < 10 -- do this a few times to account for indexes being loaded into memory
BEGIN
SELECT @Startdatetime = GETDATE();
-- do method 1 here
SELECT mytext
FROM dbo.perftest
WHERE(id >= (100 + (@ptr * 1000)))
AND (id <= (500 + (@ptr * 1000)));
--end method1
SELECT @Diff = DATEDIFF( millisecond , @Startdatetime , GETDATE());
PRINT ':Method 1: ' + CAST(@Diff AS nvarchar( 20 )) + ' ms';
--reset start time
SELECT @Startdatetime = GETDATE();
--do method2 here
SELECT mytext
FROM dbo.perftest
WHERE id BETWEEN (300 + (@ptr * 1000))
AND (800 + (@ptr * 1000));
--end method2
SELECT @Diff = DATEDIFF( millisecond , @Startdatetime , GETDATE());
PRINT ':Method 2: ' + CAST(@Diff AS nvarchar( 20 )) + ' ms';
SET @ptr = @ptr + 1
END
Дает вам совершенно другой набор результатов:
--Method 1 -- 10 ms
--Method 2 -- 33 ms
--Method 1 -- 40 ms
--Method 2 -- 26 ms
--Method 1 -- 23 ms
--Method 2 -- 23 ms
--Method 1 -- 13 ms
--Method 2 -- 16 ms
--Method 1 -- 13 ms
--Method 2 -- 20 ms
--Method 1 -- 6 ms
--Method 2 -- 16 ms
--Method 1 -- 26 ms
--Method 2 -- 16 ms
--Method 1 -- 13 ms
--Method 2 -- 13 ms
--Method 1 -- 16 ms
--Method 2 -- 13 ms
Я бы сказал, из этого (все еще довольно ненаучного) теста, не так уж и много.
Ответ 5
на самом деле. Я просто пытаюсь проверить некоторые из моих данных. МЕЖДУ эквивалентно " > =" и "<". Например: между '05/01/2010 'и '05/30/2010': вы получите данные только между 5/1/2010 00:00:00 по 29.05.2010 23:59:59. Попробуйте запросить свою таблицу с помощью "Order by [TimeField] desc", и вы увидите результат.
Ответ 6
Меня также интересовало, есть ли разница в производительности, когда я использовал ( >= и < =) по сравнению с использованием ключевого слова between. (Я исхожу из точечного фона и вроде операторов стиля = =). Вот script я использовал:
DECLARE
@Startdatetime datetime ,
@Diff int = 0 ,
@Addrowcount int = 1000;
SET NOCOUNT ON;
--Create a tempory table to perform our tests on
CREATE TABLE dbo.perftest( id smallint NOT NULL
IDENTITY(1 , 1)
PRIMARY KEY ,
mytext nvarchar( 50 )NOT NULL );
--Now add some sample rows
SET @Addrowcount = 1000;
WHILE(@Addrowcount > 0)
BEGIN
INSERT INTO dbo.perftest( mytext )
VALUES( 'thetext' );
SET @Addrowcount = @Addrowcount - 1;
END;
SELECT @Startdatetime = GETDATE();
-- do method 1 here
SELECT mytext
FROM dbo.perftest
WHERE(id >= 100)
AND (id <= 900);
--end method1
SELECT @Diff = DATEDIFF( millisecond , @Startdatetime , GETDATE());
PRINT ':Method 1: ' + CAST(@Diff AS nvarchar( 20 )) + ' ms';
--reset start time
SELECT @Startdatetime = GETDATE();
--do method2 here
SELECT mytext
FROM dbo.perftest
WHERE id BETWEEN 100
AND 900;
--end method2
SELECT @Diff = DATEDIFF( millisecond , @Startdatetime , GETDATE());
PRINT ':Method 2: ' + CAST(@Diff AS nvarchar( 20 )) + ' ms';
Результаты:
Способ 1:140 мс
Способ 2: 70 мс
Таким образом, производительность улучшается за счет использования между.