Ответ 1
Вы можете проверить это достаточно легко, проверив планы запросов в обеих ситуациях. Я не знаю никакой разницы. Существует логическая разница, хотя между BETWEEN и "<" и " > "... МЕЖДУ ВКЛЮЧЕНЫ. Это эквивалентно "< =" и "= > ".
Я пробовал поиск через поисковые системы, MSDN и т.д. но ничего не может. Извините, если это было задано раньше. Есть ли разница в производительности между использованием ключевого слова "Между" или "Сравнение" T-SQL?
Вы можете проверить это достаточно легко, проверив планы запросов в обеих ситуациях. Я не знаю никакой разницы. Существует логическая разница, хотя между BETWEEN и "<" и " > "... МЕЖДУ ВКЛЮЧЕНЫ. Это эквивалентно "< =" и "= > ".
Механизм запросов преобразуется между >=
и <=
(см. план запроса), поэтому на практике они идентичны и теоретически >= <=
выполняется быстрее, потому что движок не будет переводить. Удачи, заметив разницу, хотя.
Я использую между прочим, я считаю, что это легче читать
Очень сложные запросы/вложенные представления с многочисленными сравнениями могут извлечь выгоду из изменения в >= <=
, поскольку это может потенциально предотвратить таймауты оптимизации, сократив время, затрачиваемое на рефакторинг запроса (просто теория, не проверенная мной, и я никогда не заметил это)
Два оператора, которые сравниваются друг с другом здесь, принципиально отличаются друг от друга, и поэтому планы выполнения, которые генерируются, также могут быть разными (хотя и не гарантированы).
Определяющим фактором является распределение данных (селективность) столбца, к которому применяются операторы сравнения. Это вместе со Статистикой будет определять, используется или нет индекс или нет.
Надеюсь, что это имеет смысл.
Любовь, когда люди дают код для собственного тестирования, вам нужно сделать более крупный подмножество/повторный тест для учета индексов, загружаемых в память и т.д., прежде чем перейти к выводам. Вот тот же код с большой таблицей и 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
Я бы сказал, из этого (все еще довольно ненаучного) теста, не так уж и много.
на самом деле. Я просто пытаюсь проверить некоторые из моих данных. МЕЖДУ эквивалентно " > =" и "<". Например: между '05/01/2010 'и '05/30/2010': вы получите данные только между 5/1/2010 00:00:00 по 29.05.2010 23:59:59. Попробуйте запросить свою таблицу с помощью "Order by [TimeField] desc", и вы увидите результат.
Меня также интересовало, есть ли разница в производительности, когда я использовал ( >= и < =) по сравнению с использованием ключевого слова 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 мс
Таким образом, производительность улучшается за счет использования между.