2014-10-02 5 views
0

У меня есть таблица tbl_test. В этой таблице есть 2.4 million записей. Я запускаю следующие три запроса, которые очень медленны и расстраивают.Выполнение SELECT с VIEW очень медленно

select count(*) from tbl_test; 
-- 2.4 mil records in ~9 seconds 

select count(*) from tbl_test where status = 'active'; 
-- 2.4 mil records in ~9 seconds 

select count(*) from tbl_test where status = 'inactive'; 
-- 0 records in ~0 seconds 

Я создал представление сказать view_tbl_test с помощью следующего запроса:

create view view_tbl_test as 
    select * from 
    (select count(*) count_active from tbl_test where status = 'active') x, 
    (select count(*) count_inactive from tbl_test where status = 'inactive') y, 
    (select count(*) count_total from tbl_test) z 

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

select * from view_tbl_test limit 1; 

Я делаю что-то неправильно здесь? Есть ли способ, который может заставить представление вернуть данные в ~0 секунд?

+0

Почему вы думаете, что выбор из простого представления (не материализованного представления) будет быстрее? –

+0

@IgorRomanchenko будет ли он возвращать результаты не раз, если я использую материализованный вид? –

ответ

0

Ваше заявление запускает три выбора на столе. Это можно сделать с помощью одного заявления:

create view view_tbl_test 
as 
select count(case when status = 'active' then 1 end) as count_active 
     count(case when status = 'inactive' then 1 end) as count_inactive, 
     count(*) as count_total 
from tbl_test; 

Это должно работать прибл. 9 секунд, поскольку он по сути делает то же самое, что и ваш первый оператор.

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

+0

Спасибо за ваш быстрый ответ. Он говорит: «ОШИБКА: синтаксическая ошибка в точке или рядом», когда «когда я запускал свой компьютер. У меня есть индекс по статусу, но это не главное. Я блуждаю, почему фактические запросы счетчиков и выбор из представления равны! По моему мнению, выбор из представления должен быть быстрее. –

+0

К сожалению, это была опечатка. Почему, по вашему мнению, выбор из представления должен быть быстрее? Это не «единственный» запрос - это три запроса, и каждый из них снова извлекает строки из таблицы. Таким образом, извлечение из представления должно занять 18 секунд: 9 секунд для запроса 'count_active' и 9 секунд для запроса' count_total'. Если это не так, это просто показывает, что Postgres может оптимизировать это. Но опять же, поскольку вы не поставляли и не выполняли план вообще, это невозможно сказать –

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