2014-09-23 2 views
0

У меня есть запрос (упрощенный), который вычисляет C:Хранить результаты запроса или использовать вложенные запросы

SELECT A + B AS C FROM Foo 

запрос возвращает 0,5 миллиона строк.

Мне нужно выбрать строки, где C < 0.3. Для этого я вставить результаты во временную таблицу #Bar

INSERT INTO #Bar 
SELECT A + B AS C FROM Foo 

И применить условие

SELECT * 
FROM #Bar 
WHERE C < 0.3 

В соответствии с планом выполнения Table Insert стоит 86%. Есть ли лучший способ получить C < 0.3? Я пробовал вложенный запрос, и это то же самое.

+2

Не можете ли вы использовать предложение where, «WHERE A + B <0.3»? – Arvo

+0

Вы не можете просто посмотреть проценты плана выполнения (тем более, что вы сравниваете чтение с записью). Все это ** ** составляет 100%, поэтому очень вероятно, что одна часть * будет стоить дороже, чем другая часть плана. Это относительно, и говорит вам ** очень мало ** о фактическом времени выполнения этой части запроса/партии. Вы должны посмотреть всю представленную вам информацию. – alroc

+0

Ну, A + B на самом деле является CASE с 6 большими формулами – hidarikani

ответ

4

Вам не нужно временную таблицу на всех, просто выберите то, что вы хотите:

SELECT A, B, C = A + B 
FROM Foo 
WHERE A + B < 0.3 
0

Вы можете сделать это в одном запросе как

SELECT C FROM 
(
SELECT A + B AS C FROM Foo 
) bar 
WHERE C < 0.3 

(OR) Включить условие в WHERE

SELECT A + B AS C FROM Foo 
WHERE A + B < 0.3 
1

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

;WITH CTE_SELECT AS 
(
    SELECT A, B, C = A + B 
    FROM Foo 
    WHERE A + B < 0.3 
) 

SELECT * FROM CTE_SELECT 
+1

Как это решение лучше/Разный, чем предложил Тим? –

+1

http://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx –

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