Подтвердить что ты не робот

Сравните разницу в производительности между T-SQL между оператором '<' '>'?

Я пробовал поиск через поисковые системы, MSDN и т.д. но ничего не может. Извините, если это было задано раньше. Есть ли разница в производительности между использованием ключевого слова "Между" или "Сравнение" T-SQL?

4b9b3361

Ответ 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 мс

Таким образом, производительность улучшается за счет использования между.