|
|
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Простой тест. Вот у вас есть страница которая принимает на вход id чего либо (цело число) и идет в таблицу за этим id, и вы даже проверили что у вас на входе число а не черте что. Далее test case: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. пока все ок... а что будет если на вход реально длинное число задать: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Оооps, а получили то мы upcast к numeric и как итог полный seq scan по таблице, а теперь представим себе что у вас в таблице не 100.000 строк а 100M и размер под 10-100Gb, и что будет с дисками и с процессором у вас если кто то десяток таких страниц откроет. И что грустно мне заявили что working as designed. PS: использование placeholders при отключении server side prepared statement - не спасает. -- Проект с базой но без DBA все равно что автопарк без штатного автомеханика. Ездит пока все не сломается. http://www.postgresql-consulting.ru/services/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:06 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, ай как --то долпайопу гурию smagen пытался пояснить разницу между операндами сравнения со стороны множества и со стороны единичного значения, и почему пж должен , если бы был написан вменяемыми индусами, а не дятлами гуриями, делать примерно так: Код: sql 1. 2. 3. но дятлов гуриев же не переубедить. так что ешьте, что дают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:39 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Maxim BogukИ что грустно мне заявили что working as designed.Логично. Не полагайся на автоматическое приведение типов, приводи передаваемый параметр к типу поля и получай ошибку, как и в случае передачи любой несовместимой с типом лабуды. Или через свой функцию приведения, которая вернет null::integer. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 17:20 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
p2.Maxim BogukИ что грустно мне заявили что working as designed.Логично. Не полагайся на автоматическое приведение типов, приводи передаваемый параметр к типу поля и получай ошибку, как и в случае передачи любой несовместимой с типом лабуды. Или через свой функцию приведения, которая вернет null::integer. Это вы авторам 100% известных мне ORM расскажите :). -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 22:20 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Maxim BogukПроект с базой но без DBA все равно что автопарк без штатного автомеханика. Ездит пока все не сломается. Приходить в такой проект, когда оно уже "готово" и скоро сломается… ощущение неизбежности и бессилия :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 22:53 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
vyegorov, ять, оптемайзеру теоретически достаточно инфы, чтобы быстро вернуть пустоту, ничего не делая. то , что оптимайзер написан через оппу пень--колоду конечно увеличивает рыночную стоимость тех, кто знает, где именно рыбу заворачивали, но в конечном счете является неутешительной характеристикой и субд, и всех гуриев ея пишущих и пользующих. т.е. таких вещей стесняться надо, а не пяткой себя в хрудь колотить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 00:15 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
qwwqять, ёптемайзеру теоретически достаточно инфы, чтобы быстро вернуть пустоту, ничего не делая. можно попробовать его принудить известными ему средствами - повесить check на min/max int. Вот только сумеет ли он этот check протолкнуть через каст к numeric. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 00:39 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
p2., чек даст только границу. сделайте Код: sql 1. -- и получите тот же тупняк, но уже "в границах целого". тут надо в консерватории править. но внутре -- одни консервавторы -- править некому. и задачу осознать и принять к исполнению -- некому вот и плодятся гурии по заворачиванию рыбы на голом месте в случае ларри -- берём индуса , накручиваем ему хвост, и он как миленький пишет разборы всех частных случаев сам, а не конструирует детский конструктор типов кастов и сравнений. херовый, зато универсальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 11:33 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
p2.можно попробовать его принудить известными ему средствами - повесить check на min/max int. Вот только сумеет ли он этот check протолкнуть через каст к numeric. если немного извратиться, то да, даже работает: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. где-то в критичных местах прикрыть так можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 11:41 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Alexius, точнее должно быть <= и >= в check для bigint. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 11:55 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
qwwqp2., чек даст только границу. сделайте Код: sql 1. -- и получите тот же тупняк, но уже "в границах целого". тут надо в консерватории править. но внутре -- одни консервавторы -- править некому. и задачу осознать и принять к исполнению -- некому вот и плодятся гурии по заворачиванию рыбы на голом месте в случае ларри -- берём индуса , накручиваем ему хвост, и он как миленький пишет разборы всех частных случаев сам, а не конструирует детский конструктор типов кастов и сравнений. херовый, зато универсальный. нет оракуля под рукой, но вагную будет index unique scan и table access by rowid как-то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 15:37 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Jonhsonнет оракуля под рукой, но вагную будет index unique scan и table access by rowid в оракле отсутствует честный int4 и другой порядок приведения типов, но ситуация аналогична. Если сделать ключ integer (number) и задать в запросе значение типа binary_float/double: id = 1d, получим приведение айдишника к параметру и full scan. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 16:41 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
p2.Jonhsonнет оракуля под рукой, но вагную будет index unique scan и table access by rowid в оракле отсутствует честный int4 и другой порядок приведения типов, но ситуация аналогична. Если сделать ключ integer (number) и задать в запросе значение типа binary_float/double: id = 1d, получим приведение айдишника к параметру и full scan. не вполне понятен ваш поток сознания, дайте П ример в студию что вы имеете ввиду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 16:46 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Jonhsonдайте П римерпросто переведи пгшный синтаксис Код: sql 1. на оракловый Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 17:02 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
опять же оракуля под рукой нет (, но уверен, что to_number() спасёт отца русской демократии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 17:08 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
p2., идиотизм заразен, да Предикат TO_BINARY_DOUBLE("xxx"."xxx")=1d, используемый в строке с идентификатором 1 плана выполнения, содержит неявное преобразование типа данных для индексированного столбца "xxx". Это неявное преобразование типа данных не позволяет оптимизатору выбрать индексы для таблицы -- что радует -- что в сракле оно не лучше. ларри забыл накрутить хвоста индусу или решил, что обучение свидетелей заворачиванию рыбы -- оно прибыльнее, чем сделать один раз -- на века, именно там -- где ему место. мелочь, а приятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 17:54 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
внезапно Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. где т99: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 20:19 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Jonhson, вот за что я вас, дятлов, нежно люблю -- так это за готовность нести околесицу, не разобравшись. после приведения любой идиот сможет. пойнт в том, что уже до приведения у оптимайзера достаточно инфы, чтобы поюзать индекс. вот только ни один индус не напрягся -- и в итоге мы, с вами, товарищи дятлы, становимся носителями сакрального знания по поводу правильных приемов заворачивания рыбы. что крайне льстит дятлам, вплоть до внезапности неожиданностей. типа ударения себя пяткой в грудь и патетических восклицаний об ущербности не причастных к. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 20:46 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
честно говоря не вижу проблемы в приведении типа, нет оно конечно может быть и лучше автоприведение, но вообще-то типы для того и изобрели, что-бы отличать данные. И вот вам пример, гораздо менее надуманный и более жизненный: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2016, 01:10 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Jonhsonчестно говоря не вижу проблемы в приведении типа, нет оно конечно может быть и лучше автоприведение, но вообще-то типы для того и изобрели, что-бы отличать данные. И вот вам пример, гораздо менее надуманный и более жизненный: Код: sql 1. у PG кстати тут Index scan будет. А про приведение типов - это вы расскажите авторам 100% известных мне ORM которые суют в запросы что ни попадя и про проверку или приведение типов - не думают. PS: забавно Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2016, 10:05 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Maxim Bogukу PG кстати тут Index scan будет. если кажете, как сделать Код: sql 1. без заморочек я попробую прочекать А про приведение типов - это вы расскажите авторам 100% известных мне ORM которые суют в запросы что ни попадя и про проверку или приведение типов - не думают. это же хорошо, нам с вами больше работы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 10:00 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
generate_series, нашёл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 10:18 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
действительно, в случае варчара срабатывает, единственное, что смущает, так это почему Код: sql 1. , а не Код: sql 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 10:25 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
qwwq пойнт в том, что уже до приведения у оптимайзера достаточно инфы, чтобы поюзать индекс. вот только ни один индус не напрягся -- и в итоге мы, с вами, товарищи дятлы, становимся носителями сакрального знания по поводу правильных приемов заворачивания рыбы. что крайне льстит дятлам, вплоть до внезапности неожиданностей. Ну да .... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 17:25 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
ora601, человеческий план, это оракуль же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 17:27 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, Используйте процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 17:41 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
ora601, ещё один. как же вы настодоели расскажите, что мешает оптимайзеру сракуля поюзать индеск при сравнении столбца намберов с 1.5d как мы видим -- покрытие кейсов индусами отнюдь не всюду полно. даже у очень богатенького ларрия. чо уж говорить пра пеже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 18:02 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Author the new oneMaxim Boguk, Используйте процедуру.вопрос не в том, как рыбу заворачивать -- это всем тут присутствующим известно. а в том, чтобы обучить оптимайзер решать эти кейсы самостийно. все , что нужно -- у него есть. надо только сесть и дописать ему кусок мозга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 18:05 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
qwwqрасскажите, что мешает оптимайзеру сракуля поюзать индеск при сравнении столбца намберов с 1.5d некоммутативность. Приведение между number и double не для всех значений допустимо или обратимо, поэтому оптимизатор не должен додумывать, что неявно имел ввиду программист, написавший вместо целого строку или double или numeric, в зависимости от того, есть сейчас индекс по какой-либо части выражения или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 23:18 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
p2.qwwqрасскажите, что мешает оптимайзеру сракуля поюзать индеск при сравнении столбца намберов с 1.5d некоммутативность. Приведение между number и double не для всех значений допустимо или обратимо, поэтому оптимизатор не должен додумывать, что неявно имел ввиду программист, написавший вместо целого строку или double или numeric, в зависимости от того, есть сейчас индекс по какой-либо части выражения или нет. Сравнение INT с 1.5d никогда не может дать true, там и индекс то не нужен чтобы дать ответ что таких строк нет и быть не может. Тоже самое с range overflow и upcast to numeric (там тоже очевидно что ответ нет таких строк без всяких вообще проверок). -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 23:22 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Maxim BogukСравнение INT с 1.5d никогда не может дать true, там и индекс то не нужен чтобы дать ответ что таких строк нет и быть не может. Тоже самое с range overflow и upcast to numeric (там тоже очевидно что ответ нет таких строк без всяких вообще проверок). Нет предела совершенству. Почему бы не реализовать разложение выражения на всевозможные комбинации (которых всегда бесконечность) и получение от этих частей обратных функций ради индекса. Предсказать, что приведение целых никогда не даст равенство дробному, а синус только в военное время достигает 2.0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 23:34 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
p2.Maxim BogukСравнение INT с 1.5d никогда не может дать true, там и индекс то не нужен чтобы дать ответ что таких строк нет и быть не может. Тоже самое с range overflow и upcast to numeric (там тоже очевидно что ответ нет таких строк без всяких вообще проверок). Нет предела совершенству. Почему бы не реализовать разложение выражения на всевозможные комбинации (которых всегда бесконечность) и получение от этих частей обратных функций ради индекса. Предсказать, что приведение целых никогда не даст равенство дробному, а синус только в военное время достигает 2.0. Есть пяток стандартных ситуация которые закрывают 99% реалистичных ситуаций если не 99.9%. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 23:40 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
Maxim Bogukp2.пропущено... некоммутативность. Приведение между number и double не для всех значений допустимо или обратимо, поэтому оптимизатор не должен додумывать, что неявно имел ввиду программист, написавший вместо целого строку или double или numeric, в зависимости от того, есть сейчас индекс по какой-либо части выражения или нет. Сравнение INT с 1.5d никогда не может дать true, там и индекс то не нужен чтобы дать ответ что таких строк нет и быть не может. Тоже самое с range overflow и upcast to numeric (там тоже очевидно что ответ нет таких строк без всяких вообще проверок). ну в таком случае, если уж говорить честно, то (int) 1 не должен быть равен (double) 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2016, 09:51 |
|
||
|
как сломать PG index scan по int полю или почему надо проверять диапазоны входных данных
|
|||
|---|---|---|---|
|
#18+
JonhsonMaxim Bogukпропущено... Сравнение INT с 1.5d никогда не может дать true, там и индекс то не нужен чтобы дать ответ что таких строк нет и быть не может. Тоже самое с range overflow и upcast to numeric (там тоже очевидно что ответ нет таких строк без всяких вообще проверок). ну в таком случае, если уж говорить честно, то (int) 1 не должен быть равен (double) 1.мухаха и где же вас, таких, понаделали ? если найдете два таких @integer и @double , что (@integer)::double = @double but (@double::integer)::double <> @double --дайте знать. будем тереть за коммутативность. а так --нет :] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2016, 13:01 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=1997143]: |
0ms |
get settings: |
8ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
180ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 222ms |
| total: | 535ms |

| 0 / 0 |
