Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Поменять план запроса  [new]
DmGr
Member

Откуда:
Сообщений: 185
Добрый день!

Есть такой запрос
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


План такой
"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 и в нем уже выберу по условиям
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
27 авг 12, 10:11    [13067723]     Ответить | Цитировать Сообщить модератору
 Re: Поменять план запроса  [new]
DmGr
Member

Откуда:
Сообщений: 185
Пардон - не туда запостил

Удалите пост.
27 авг 12, 10:14    [13067745]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить