2012-01-08 2 views
0

Мне было интересно, если SELECTSELECT несет любую дополнительную производительность, или если база данных достаточно умна, чтобы ее оптимизировать.ВЫБОР SELECT

К примеру, у меня есть несколько выбирает я делаю так:

SELECT a.year, b.month, c.day, totalVolume from 
(SELECT DATEPART(year, transactionTime) as year, 
     DATEPART(month, transactionTime) as month, 
     DATEPART(day, transactionTime) as day, 
     SUM(volume) as totalVolume FROM DOW30 
     GROUP BY DATEPART(year, transactionTime), 
       DATEPART(month, transactionTime), 
       DATEPART(day, transactionTime)) a 
order by a.year, b.month, c.day 

Все это конкретный запрос делает группу все торги в Dow30 по дате, и суммирует общий объем. Я использую это, потому что таблица хранит каждую сделку в секунду, и я хочу ее обновить каждый день.

Это не полный запрос, а просто пример. Я знаю, что могу просто сделать это из одного SELECT, но мне было интересно, не сделает ли SELECTSELECT какой-то штраф за производительность, или если все это будет оптимизировано волшебным образом.

Причина, почему я сформулировать запрос таким образом, происходит потому, что, как я себе запрос, и я на самом деле присоединиться к топ-уровня select с другой таблицей, и выбрав из колонок от основной SELECT делает его более легким для меня визуализировать запрос. Но, не имея формального фона DBA, я не уверен, что это неправильно, и если мне нужно выяснить лучший способ написания моих запросов.

+2

Вы имели вид на план запроса? Я не знаю, как получить его для sql-сервера, но, возможно, вы сами это узнаете. Он покажет вам, как база данных видит ваш запрос. – fkerber

+0

Я не эксперт SQL Server, но я бы ожидал, что сервер будет оптимизировать ...поскольку речь идет не об угадывании, а о знании единственного способа узнать, это проверить план запроса для запроса, - тогда вы можете видеть, что делает сервер из этого, он может даже дать вам некоторый намек на необходимость индекса ... – Yahia

ответ

3

Вложения SELECT, как это считается одним из утверждений оптимизатору.

Вы можете увидеть это здесь: Why use Select Top 100 Percent? и How can I query 'between' numeric data on a not numeric field? В этих примерах гнездования здесь не имеет никакого эффекта, если только вы сила это который, как правило, плохая идея

1

Поместите эти 2 запроса в окне запроса

SELECT a.year, b.month, c.day, totalVolume from 
(SELECT DATEPART(year, transactionTime) as year, 
     DATEPART(month, transactionTime) as month, 
     DATEPART(day, transactionTime) as day, 
     SUM(volume) as totalVolume FROM DOW30 
     GROUP BY DATEPART(year, transactionTime), 
       DATEPART(month, transactionTime), 
       DATEPART(day, transactionTime)) a 
order by a.year, b.month, c.day 

SELECT DATEPART(year, transactionTime) as year, 
     DATEPART(month, transactionTime) as month, 
     DATEPART(day, transactionTime) as day, 
     SUM(volume) as totalVolume FROM DOW30 
     GROUP BY DATEPART(year, transactionTime), 
       DATEPART(month, transactionTime), 
       DATEPART(day, transactionTime)) a 
order by DATEPART(year, transactionTime), DATEPART(month, transactionTime), DATEPART(day, transactionTime) 

Затем посмотреть на фактический план выполнения,

http://technet.microsoft.com/en-us/library/ms189562.aspx 

он покажет вам план выполнения для обоих запросов плюс относительную стоимость для обоих из них, я думаю, что оба они будут на 50% означать, что обе имеют одинаковую стоимость (но я могу ошибаться, сообщите нам, что вы узнали)

+0

Спасибо, я не знал об этом, это получилось как 50% для обоих. – steve8918

+1

@ steve8918 Я использую это все время, когда у меня есть сомнения, действительно важный инструмент, и теперь у вас есть способ всегда знать наверняка, не догадываясь –

0

Это может замедлить t он запрашивает, но это зависит от того, что вы на самом деле выбираете. В этом случае выбор основного уровня не делает ничего интересного, и он даже не нужен. Возможно, сервер оптимизирует этот запрос, как если бы это был всего лишь один выбор. Но это не всегда так, это зависит от запроса. И в базе данных. MySQL, Oracle и SQL Server имеют отличные оптимизаторы, но виды оптимизации сильно различаются.

2

Использование производных таблиц или КТР, вероятно, добавить очень маленький накладные расходы во время стадии синтаксического анализа. Я бы предпочел пренебречь этим ради удобочитаемости.

Update Я говорю о тех случаях, когда вы технически не должны использовать его (как в вашем вопросе)

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