2016-12-13 4 views
0

У меня есть таблица Case, которая имеет почти 25,00,000 строк и 176 столбцов (в основном VARCHAR)PostgreSQL растровой куча сканирование занимает много времени

select 
    count(ca.id) 
from 
    salesforce.case ca 
where 
    ca.accountid = '001i000000E'  
    AND ca.createddate BETWEEN current_date - interval '6 months' AND current_date 

Я пытаюсь получить количество записей, созданные за последние 6 месяцев для конкретного Счет. Но когда я смотрю на объяснение и анализ, я обнаружил, что первый индекс просматривает все записи, созданные в этот промежуток времени, и индекс просматривает все записи для этой учетной записи, а затем выполняет сканирование растровой кучи (что занимает много времени).

https://explain.depesz.com/s/8Lje

Есть ли способ, мы можем сделать это быстрее?

+0

1,125.320 мс - одна секунда на 25 * 10^6 строк 176 столбцов ... растровое сканирование кучи идет более миллиона строк, соединяющих 200K, давая результат для 500K строк. И это занимает одну секунду - верно? –

ответ

0

Вы можете создать индекс ON ca(accountid, createddate), который может быть использован для обоих условий.

Учитывая, что в номерах вашего вывода объясняется, что PostgreSQL все еще использует растровый индексный сканер, потому что он считает, что это быстрее. Вы можете попытаться опустить random_page_cost, посмотреть, выбраны ли разные планы и проверить, какой из них самый быстрый.