|
|
|
INDEX и JOIN по NULL значениям
|
|||
|---|---|---|---|
|
#18+
Работаю с достаточно простым запросом и заметил странное поведение PostgreSQL: Код: plsql 1. 2. 3. Особенность запроса, что обе таблицы большие, но batchReceiptSaleDetail практически всегда NULL (postgre об этом знает, статистика обновлена). При этом по этому полю построен индекс. План запроса следующий: Код: plsql 1. 2. 3. 4. 5. 6. 7. Как видим индекс она использовать не решается. Если отключить enable_hashjoin, запрос работает быстрее: Код: plsql 1. 2. 3. 4. 5. Из этого плана можно сделать вывод что вариант с индексом у нее есть, и статистику она представляет (estimate результата 1 rows). Но план этот, она не применяет видимо из-за того что по ее мнению средний cost все же чуть выше. (хоть и ошибочно) А вот если чуть видоизменить запрос: Код: plsql 1. 2. 3. То план становится "идеальным": Код: plsql 1. 2. 3. 4. 5. 6. При этом с логической точки зрения запросы эквивалентны : a=b при b is null в данном случае по сути равен false, то есть из a=b => b is not null. Вопрос почему постгре этого не понимает, и может ли он это вообще понять и использовать последний план? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2015, 12:20 |
|
||
|
INDEX и JOIN по NULL значениям
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, Есть много вещей которые понимает програмист или DBA и не умеет/не понимает планировщик. Это ваша работа переписывать запросы в более эффективной форме. Далеко не все возможные логические выводы делаются планировщиком так как время на планирования запроса всетаки тоже надо держать в рамках. >>Вопрос почему постгре этого не понимает, и может ли он это вообще понять и использовать последний план? Не сделано чтобы не утяжелять планировщик для узких use case когда можно запрос нормально переписать. Нет не может. PS: это не значит что не научится в будущем впрочем. PPS: я бы кстати порекомендовал переделать индекс nn on zreport_receiptsaledetail на условие where ZReport_batchReceiptSaleDetail_ReceiptSaleDetail is not null и индекс станет в 100 раз меньше и работы базе меньше при вышеупомянутом запросе. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2015, 13:35 |
|
||
|
INDEX и JOIN по NULL значениям
|
|||
|---|---|---|---|
|
#18+
Maxim BogukNitro_Junkie, Есть много вещей которые понимает програмист или DBA и не умеет/не понимает планировщик. Это ваша работа переписывать запросы в более эффективной форме. Далеко не все возможные логические выводы делаются планировщиком так как время на планирования запроса всетаки тоже надо держать в рамках. >>Вопрос почему постгре этого не понимает, и может ли он это вообще понять и использовать последний план? Не сделано чтобы не утяжелять планировщик для узких use case когда можно запрос нормально переписать. Нет не может. PS: это не значит что не научится в будущем впрочем. PPS: я бы кстати порекомендовал переделать индекс nn on zreport_receiptsaledetail на условие where ZReport_batchReceiptSaleDetail_ReceiptSaleDetail is not null и индекс станет в 100 раз меньше и работы базе меньше при вышеупомянутом запросе. --Maxim Boguk www.postgresql-consulting.ru Thx, так и думал. Case не такой уж и редкий, возникает при достаточно многих денормализациях, или когда есть функционал который не всегда используется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2015, 13:53 |
|
||
|
INDEX и JOIN по NULL значениям
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieCase не такой уж и редкий, возникает при достаточно многих денормализациях, или когда есть функционал который не всегда используется...Частый это или редкий случай, авторы postgres считают очень просто, по количеству багрепортов, вот вы написали багрепорт? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2015, 11:23 |
|
||
|
INDEX и JOIN по NULL значениям
|
|||
|---|---|---|---|
|
#18+
Гость_0Nitro_JunkieCase не такой уж и редкий, возникает при достаточно многих денормализациях, или когда есть функционал который не всегда используется...Частый это или редкий случай, авторы postgres считают очень просто, по количеству багрепортов, вот вы написали багрепорт? :-) Мы если честно, сделали так что если join идет по индексированному полю таблицы, и процент его не null значений существенно влияет на статистику, то в явную добавляем field IS NOT NULL в условие запроса. В принципе это решает проблему в общем случае. Понимаю что немного "эгоистично", но в постгре хватает других проблем с оптимизацией запросов, пусть лучше над ними работают :) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2015, 12:18 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38880676&tid=1998167]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 254ms |
| total: | 500ms |

| 0 / 0 |
