|
su.dbms.sql- SU.DBMS.SQL ------------------------------------------------------------------ From : Constantin Svintsoff 2:5020/400 14 Feb 2001 11:17:39 To : All Subject : Re: Проблема с большими таблицами --------------------------------------------------------------------------------
hi, there!
On Tue, 13 Feb 2001, Alexander Bodnar wrote:
AB> Есть таблица-
AB> t1 с полями
AB> f1 - int4;
AB> f2 - varchar(100);
AB> по всем полям построены обычные индексы.
AB> в таблице свыше 1.000.000 записей.
AB> При выполнении запроса
AB> select max(f1) from t1;
AB> или
AB> select count(*) from t1;
AB> все немерено тормозит.
AB> Сканируется вся таблица.
AB> В подсчете количества записей это еще можно как-то понять,
AB> но почему при нахождении максимума не используется индекс.
AB>
AB> Помогите разобраться в чем дело и как с этим бороться.
Дело, видимо в подходе PostgreSQL к агрегатным функциям (в случае с max)
Можешь почитать документацию по CREATE AGGREGATE. Все агрегатные функции
устроены примерно так: во время исполнения каждой из них есть одна
или две переменных которые как бы хранят некоторое промежуточные значения,
нужные для вычисления функции, есть функиции, которые вызываются
для каждого выбранного значения из таблицы, которые соответственно
их грубо говоря модифицируют и есть финальная функция которая собственно
и возвращает результат. Для max, соответственно, отдельного специяльного
механизма, который мог бы использовать индекс - нету.
Отсюда, очевидно, что поскольку для каждого значения должна быть
вызвана функция - без фуллскана не обойтись.
То есть здесь просто плата производительностью за гибкость.
А как может помочь индекс при вычислении count(*) - ей-богу не пойму :)
А как бороться - да непонятно.
/Constantin
--- ifmail v.2.15dev5
* Origin: Novosibirsk State University (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /su.dbms.sql/653060e90c19.html, оценка из 5, голосов 10
|