powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизатор - выбор индекса
3 сообщений из 3, страница 1 из 1
Оптимизатор - выбор индекса
    #33628102
Alexey.Chaley
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.
Есть таблица TempInfo:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE TempInfo
(
    InfoId                 SERIAL          NOT NULL,
    CreateDate          DATE   		NOT NULL DEFAULT current_date,
    Info                    VARCHAR( 50 ),
    ....
);
...
CREATE INDEX "IX_TempInfo_CreateDate"  ON TempInfo (CreateDate);
CREATE INDEX "IX_TempInfo_CreateDate_Info"   ON TempInfo (CreateDate, Info);
CREATE INDEX "IX_TempInfo_Info"   ON TempInfo (Info);
Есть запрос вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
EXPLAIN ANALYZE
    SELECT
		Info AS Url,
		COUNT(InfoId) AS UrlCount
    FROM
    	TempInfo
    WHERE
        CreateDate BETWEEN '2006-03-27' AND '2006-03-27'
    GROUP BY
    	Url
    ORDER BY
    	UrlCount DESC
Результат работы запроса:
"Sort (cost=3.14..3.15 rows=1 width=47) (actual time=69.081..69.082 rows=2 loops=1)"
" Sort Key: count(infoid)"
" -> HashAggregate (cost=3.13..3.13 rows=1 width=47) (actual time=69.060..69.067 rows=2 loops=1)"
" -> Index Scan using "IX_TempInfo_CreateDate" on TempInfo (cost=0.00..3.13 rows=1 width=47) (actual time=0.027..52.438 rows=15063 loops=1)"
" Index Cond: ((createdate >= '2006-03-27'::date) AND (createdate <= '2006-03-27'::date))"
"Total runtime: 69.165 ms"

На мой взгляд, было логичнее и быстрее использовать индекс IX_TempInfo_CreateDate_Info. Не ясно почему оптимизатор этого не делает.
Хотелось бы узнать Ваше мнение по этому вопросу. И есть у постгреса возможность задать хинт для оптимизатора, то есть принудительно указать тот индекс, который нужно использовать при выполнении запроса?
...
Рейтинг: 0 / 0
Оптимизатор - выбор индекса
    #33628593
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>На мой взгляд, было логичнее и быстрее использовать индекс IX_TempInfo_CreateDate_Info.

Почему ты так считаешь?
Если добавить
Код: plaintext
1.
   WHERE
        CreateDate BETWEEN '2006-03-27' AND '2006-03-27' AND Info='ABC' 
, что тогда покажет анализатор? :)
...
Рейтинг: 0 / 0
Оптимизатор - выбор индекса
    #33628619
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey.ChaleyНа мой взгляд, было логичнее и быстрее использовать индекс IX_TempInfo_CreateDate_Info.Для запроса вида "where field1 between A and B order by [group by] field2" индекс по (field1,field2) не полезнее, чем индекс по (field1). Так как (при использовании плана GroupAggregate) после выборки записей по индексу (field1,field2) их нужно пересортировать в порядке field2.

В вашем случае A=B (BETWEEN '2006-03-27' AND '2006-03-27'), но постгрес, как видно из плана запроса, этого не заметил. Замените на CreateDate='2006-03-27', подскажите ему. :) Тогда наверное он выберет ожидаемый план.

Alexey.ChaleyИ есть у постгреса возможность задать хинт для оптимизатора, то есть принудительно указать тот индекс, который нужно использовать при выполнении запроса?Такой возможности нет. Есть только команды set enable_* to on|off. Причем влияющие на план запроса целиком, а например не на вложенный подзапрос.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизатор - выбор индекса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]