2016-05-24 2 views
0

Для решения пользовательских постраничной, я должен простой запрос:Двойной запрос запрос с плохими выступлениями

SELECT id, column1, column2, column3 
FROM my_table 
WHERE column1 IS NOT NULL AND... 
ORDER BY id 
LIMIT 10 OFFSET 0 

это один возвращает данные страницы.

SELECT COUNT(id) FROM my_table WHERE column1 IS NOT NULL AND... 

Этот номер возвращает итоговую таблицу.

Нет проблем по первому требованию, перфект хорош. Но второй является медленным медленным ... Конечно, id является индексом (первичный ключ)

Есть ли способ вернуть результат запроса на счет быстрее? Или соединить запрос 2 в одном?

Спасибо за помощь

ответ

1

Вы должны остановиться на пункте where.

Один из вариантов - добавить индекс, основанный на статье where. Для этой версии:

SELECT COUNT(id) 
FROM my_table 
WHERE column1 IS NOT NULL ; 

Измените select либо COUNT(*) или COUNT(1) - я просто найти его чище, чтобы не ссылаться на столбец, если вы на самом деле не использовать его.

Затем вы должны использовать индекс на my_table(column1).

Другой вариант заключается в создании отфильтрованный индекс:

create index filind_my_table on (id) 
    where column1 is not null . . .; 

Postgres должен быть в состоянии использовать этот индекс для вашего запроса, и он должен работать быстрее.

+0

кол-во (1) использует индекс? первичным будет столбец 0, а не один? – Aurora

+0

Привет, Гордон, действительно используйте count (*) вместо count (id) немного быстрее, но он медленный. Для каждого из моих столбцов я создаю простой индекс: CREATE INDEX column1_index ON my_table (column1 NULLS LAST); Должен ли я создать столько, сколько индекс, который я отфильтровал? (индекс для не является нулевым, другой для TRUE ...)? – Macbernie

0

Вы проверили результат своего запроса с планом выполнения? он покажет вам, если у вас отсутствуют индексы в запросе.

+0

в SQL-управлении, перейдите к -> query -> select, включите план выполнения и запустите запрос. отсутствующие индексы будут показаны на панели результатов. – Aurora

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