2013-05-23 6 views
0

У меня есть эти строки:Сумма отфильтрованное значение

value1 | value2 | value3 
------------------------- 
1231234|23423423|B 
2342345|12309123|X 
3242344|53453453|X 
3453454|45345344|I 
2531534|53434534|X 
6657555|42342234|I 
3242343|34534345|B 

Я хочу, чтобы фильтровать и сумма фильтруется значение2 без фильтрации значению1.

Что такое лучший способ сделать такой случай?

Текущий столбец Сумма запроса

SELECT 
    SUM(value1), 
    SUM(CASE WHEN (value3 = 'B' OR value3 = 'I') THEN value2 ELSE 0 END) FROM t 

С помощью этого метода стоимость составляет 6 часов для 300k строк.

Ожидаемый Pre-Result:

value1 | value2 | value3 
------------------------- 
1231234|23423423|B 
2342345|0  |X 
3242344|0  |X 
3453454|45345344|I 
2531534|0  |X 
6657555|42342234|I 
3242343|34534345|B 

ответ

4

Это будет быстрее, в предложении where:

select sum(value2) 
from t 
where value3 in ('B', 'I') 

Это будет быстрее, с индексом на (value3, value2).

Однако этот запрос не должен занимать 6 часов для строк 300 тыс. Это произойдет только в том случае, если таблица действительно представляет собой представление, очень, очень и очень сложное представление.

+0

См. Редактирование, я должен сделать это без фильтрационного значения. 1 –

+0

Нет фильтрации значения 1 в приведенном выше ответе. –

0

Ваш подход правильный, но простой запрос не должен занимать 6 часов для 300 000 строк. Я подозреваю, что происходит что-то еще, что ухудшает производительность.

Вы можете попробовать делания как подзапрос:

SELECT 
    SUM(value1), 
    (SELECT SUM(value2) FROM t WHERE value3 IN ('B','I')) 
    FROM t 

Но это не должно сделать резкое различие, если не очень мало B и I записи и у вас есть индекс по value3.

Или, если у вас есть доступ к хорошим администраторам баз данных или SQL, им нужно взглянуть на план запроса, чтобы узнать, вызывает ли что-то другое проблемы производительности.

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