2015-10-14 3 views
2

Просто хотите спросить, что занимает больше времени.Выполнение запроса времени

Пример сценария ниже:

SELECT * 
FROM 
    (SELECT * 
    FROM t1 
    WHERE [Date] BETWEEN "20151012" AND "20151018" 

    UNION ALL 

    SELECT * 
    FROM t2 
    WHERE [Date] BETWEEN "20151012" AND "20151018" 

    UNION ALL 

    SELECT * 
    FROM t3 
    WHERE [Date] BETWEEN "20151012" AND "20151018" 
) AS T 

или это утверждение:

SELECT * 
FROM 
    (SELECT * FROM t1 

    UNION ALL 

    SELECT * FROM t2 

    UNION ALL 

    SELECT * FROM t3) AS T 
WHERE 
    [Date] BETWEEN "20151012" AND "20151018" 

Спасибо большое!

+3

Большой шанс, что они будут вести себя одинаково ... Вы не можете проверить? –

+1

Используйте EXPLAIN, чтобы проверить план выполнения или фактически запустить запросы. –

+0

Первый запрос не требует внешнего 'SELECT * FROM', он просто лишний. Что касается времени выполнения запроса, это зависит от разных факторов (насколько велики таблицы, какие индексы у вас есть на каждой таблице и т. Д.). Попробуйте предложение г-на Лламы посмотреть, как будет выглядеть план выполнения. –

ответ

0

Я считаю, самым безопасным и наиболее явная версия:

SELECT * 
FROM t1 
WHERE [Date] BETWEEN "20151012" AND "20151018" 

UNION ALL 

SELECT * 
FROM t2 
WHERE [Date] BETWEEN "20151012" AND "20151018" 

UNION ALL 

SELECT * 
FROM t3 
WHERE [Date] BETWEEN "20151012" AND "20151018" 

Там нет необходимости надеяться, что план запроса собирается выяснить, какие индексы могут быть использованы в суб-запроса. Вы можете получить равную производительность, но от этого вы не будете хуже.

0

SQL Server не будет иметь проблем с предикатами до базовых таблиц.

Вы можете проверить планы выполнения, чтобы убедиться в этом.

Меня больше беспокоят двойные кавычки вокруг строковых литералов. Вы должны использовать одинарные кавычки, чтобы запрос работал правильно по умолчанию quoted_identifier, и он не интерпретирует 20151012 как попытку ссылки на столбец.

Смежные вопросы