powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поменять план запроса
2 сообщений из 2, страница 1 из 1
Поменять план запроса
    #37931263
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть такой запрос
Код: plsql
1.
2.
3.
SELECT date_r::date, name, pgroup, npgroup, size, type, qual, massa, colour 
FROM blockrest inner join main_tab on blockrest.idf = main_tab.idf 
WHERE outd <> 'br' and outd <> 'pr' and outd <>'bk' and outd <> 'an' and (inpd = 'bf' or inpd = 'bz') and size = 1400 ORDER BY pgroup, npgroup



План такой
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
"Sort  (cost=15745.11..15745.12 rows=1 width=69)"
"  Sort Key: main_tab.pgroup, main_tab.npgroup"
"  ->  Hash Join  (cost=12883.25..15745.10 rows=1 width=69)"
"        Hash Cond: ((main_tab.idf)::text = (blockrest.idf)::text)"
"        ->  Bitmap Heap Scan on main_tab  (cost=12803.61..15664.64 rows=161 width=89)"
"              Recheck Cond: (((size)::text = '1400'::text) AND (((inpd)::text = 'bf'::text) OR ((inpd)::text = 'bz'::text)))"
"              Filter: (((outd)::text <> 'br'::text) AND ((outd)::text <> 'pr'::text) AND ((outd)::text <> 'bk'::text) AND ((outd)::text <> 'an'::text))"
"              ->  BitmapAnd  (cost=12803.61..12803.61 rows=756 width=0)"
"                    ->  Bitmap Index Scan on size_idx  (cost=0.00..149.71 rows=7580 width=0)"
"                          Index Cond: ((size)::text = '1400'::text)"
"                    ->  BitmapOr  (cost=12653.61..12653.61 rows=500165 width=0)"
"                          ->  Bitmap Index Scan on inpd_idx  (cost=0.00..12648.38 rows=500165 width=0)"
"                                Index Cond: ((inpd)::text = 'bf'::text)"
"                          ->  Bitmap Index Scan on inpd_idx  (cost=0.00..5.15 rows=1 width=0)"
"                                Index Cond: ((inpd)::text = 'bz'::text)"
"        ->  Hash  (cost=48.73..48.73 rows=2473 width=20)"
"              ->  Seq Scan on blockrest  (cost=0.00..48.73 rows=2473 width=20)"



Main_tab примерно 4млн записей (это признаки)
blockrest примерно 2тысячи (это остатки)

blockrest я специально добавил, для ускорения выборки данных.
Так вот если убрать все условия WHERE, то запрос с inner join выполняется мгновенно.
С условиями сначала начинает выполнять WHERE и только потом join.
И весь смысл таблицы с остатками теряется.

Думал оберну select c join и в нем уже выберу по условиям
Код: plsql
1.
2.
3.
SELECT date_r::date, name, pgroup, npgroup, size, type, qual, massa, colour 
FROM (select main_tab.* from blockrest inner join main_tab on blockrest.idf = main_tab.idf ) as temp
WHERE temp.outd <> 'br' and temp.outd <> 'pr' and temp.outd <>'bk' and temp.outd <> 'an' and (temp.inpd = 'bf' or temp.inpd = 'bz') and temp.size = 1400 ORDER BY pgroup, npgroup


План не изменился совершенно
Как заставить postgres сначала выполнить inner join.

Index scan по main_tab все равно работает медленнее, чем seq scan по выборке inner join.
Я конечно понимаю что планировщик - вещь в себе и ему лучше знать как выполнить запрос.
Но все таки...
Как заставить сначала сделать объединение, а потом отбор?

---
PostgreSQL 8.2.4
...
Рейтинг: 0 / 0
Поменять план запроса
    #37931270
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон - не туда запостил

Удалите пост.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поменять план запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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