постгресс ненависти псто №2
От: nikkit  
Дата: 13.09.23 09:31
Оценка: 1 (1) -2 :))
потребовалось по быстрому проверить возвращает запрос что-то или нет.
думая, что select distinct /blabla limit 1 работает как select top 1 distinct /blabla в sql server запустил. жду, жду, жду, ... пока ждал, поматерился на тормоза, потом прошло времени столько, что успело дойти что этот болван делает.
ну как так-то? и нахрена так было сделано? может есть разумное объяснение такому поведению?
Re: постгресс ненависти псто №2
От: Formidable  
Дата: 13.09.23 14:14
Оценка: :))) :))) :)
Здравствуйте, nikkit, Вы писали:

N>потребовалось по быстрому проверить возвращает запрос что-то или нет.

N>думая, что select distinct /blabla limit 1 работает как select top 1 distinct /blabla в sql server запустил. жду, жду, жду, ... пока ждал, поматерился на тормоза, потом прошло времени столько, что успело дойти что этот болван делает.
top 1 distinct — это сильно... наверное в постгресс просто не ожидали такого коварства....
Re: постгресс ненависти псто №2
От: Maniacal Россия  
Дата: 13.09.23 14:57
Оценка:
Здравствуйте, nikkit, Вы писали:

N>ну как так-то? и нахрена так было сделано? может есть разумное объяснение такому поведению?

DISTINCT это автоматом GROUP BY, что тормознее даже, чем ORDER BY

По-хорошему надо SELECT EXISTS (SELECT 1 FROM ... WHERE ... LIMIT 1)
Re[2]: постгресс ненависти псто №2
От: nikkit  
Дата: 13.09.23 19:32
Оценка:
F>top 1 distinct — это сильно... наверное в постгресс просто не ожидали такого коварства....


абассака как смешно ) ты меня просто с землей ща сравнял
Re[2]: постгресс ненависти псто №2
От: nikkit  
Дата: 13.09.23 19:34
Оценка:
M>По-хорошему надо SELECT EXISTS (SELECT 1 FROM ... WHERE ... LIMIT 1)

я вообще всегда по возможности избегаю дистинкты. мопед не мой.
просто надо было быстро проанализировать запрос. в сиквеле после селекта тупо бы дописал топ 1 и был бы счастлив. тут во-первых писать в конце (еще раз через жопу) дак еще вот подстава )
Re[3]: постгресс ненависти псто №2
От: Gt_  
Дата: 13.09.23 20:30
Оценка: +4 :))) :))) :)))
N>я вообще всегда по возможности избегаю дистинкты. мопед не мой.
N>просто надо было быстро проанализировать запрос. в сиквеле после селекта тупо бы дописал топ 1 и был бы счастлив. тут во-первых писать в конце (еще раз через жопу) дак еще вот подстава )

а чего программиста не позвал?
Re[4]: постгресс ненависти псто №2
От: nikkit  
Дата: 14.09.23 05:14
Оценка:
Gt_>а чего программиста не позвал?

он уж помер наверное от старости. легаси конкретный
Re[3]: постгресс ненависти псто №2
От: AndrewN Россия  
Дата: 15.09.23 18:05
Оценка: -2
Здравствуйте, nikkit, Вы писали:


M>>По-хорошему надо SELECT EXISTS (SELECT 1 FROM ... WHERE ... LIMIT 1)


N>я вообще всегда по возможности избегаю дистинкты. мопед не мой.

N>просто надо было быстро проанализировать запрос. в сиквеле после селекта тупо бы дописал топ 1 и был бы счастлив. тут во-первых писать в конце (еще раз через жопу) дак еще вот подстава )

То, что в MSSQL TOP 1 имеет более высокий приоритет над DISTINCT — вот это реальный трэш.
Нахрена тогда там вообще DISTINCT , так что и Postgres и Oracle в данном случае делают всё правильно и логично.
Если мне нужно первое из уникальных значений столбца — то надо сначала найти все уникальные. А не взять тупо первую строку и сделать по ней DISTINCT
--------------------------------------------------------------
Правильно заданный вопрос содержит в себе половину ответа
Re[4]: постгресс ненависти псто №2
От: nikkit  
Дата: 15.09.23 21:59
Оценка: -1
AN>То, что в MSSQL TOP 1 имеет более высокий приоритет над DISTINCT — вот это реальный трэш.
AN>Нахрена тогда там вообще DISTINCT , так что и Postgres и Oracle в данном случае делают всё правильно и логично.
AN>Если мне нужно первое из уникальных значений столбца — то надо сначала найти все уникальные. А не взять тупо первую строку и сделать по ней DISTINCT

нужно просто по-быстрому посмотреть возвращает ли чего запрос. все.
и где ты увидел логику — я хз. если вернется всего одна запись, как она может быть не дистинкт? дак нахрена же выполнять дистинкт сначала?
вот выберет он 10 записей, которые дистинкт. какую из них брать? или то что отсечет запрос не будет являться дистинкт, пока его не выполнить? ну бред же!
ну, конечно, может быть ситуация. когда на одной записи запрос падает, к примеру, да. но в этом случае я вообще не стану, к примеру, хотябы на первом шаге отладки его ограничивать. если цель типа понять что он вообще возвращает и вовзращает ли что-то.
Отредактировано 16.09.2023 9:46 nikkit . Предыдущая версия . Еще …
Отредактировано 16.09.2023 9:04 nikkit . Предыдущая версия .
Re: постгресс ненависти псто №2
От: BlackEric http://black-eric.lj.ru
Дата: 16.09.23 10:53
Оценка: 116 (2) +1
Здравствуйте, nikkit, Вы писали:

N>потребовалось по быстрому проверить возвращает запрос что-то или нет.

N>думая, что select distinct /blabla limit 1 работает как select top 1 distinct /blabla в sql server запустил. жду, жду, жду, ... пока ждал, поматерился на тормоза, потом прошло времени столько, что успело дойти что этот болван делает.

Если что есть книга: PostgreSQL Query Optimization The Ultimate Guide to Building Efficient Queries

На английском, но весьма не плоха.
https://github.com/BlackEric001
Re[4]: постгресс ненависти псто №2
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.09.23 14:05
Оценка: +2
Здравствуйте, AndrewN, Вы писали:
AN>То, что в MSSQL TOP 1 имеет более высокий приоритет над DISTINCT — вот это реальный трэш.
Хотелось бы увидеть пример таблицы, для которой такой приоритет операций приведёт к неверному результату.
"Реальный трэш" — это когда запрос выдаёт не то, что должен.
"Просто трэш" — это когда оптимизатор не использует какую-нибудь очевидную эквивалентность и перемалывает байты впустую.
А когда оптимизатор выбирает оптимальный способ исполнения запроса, гарантируя сохранение семантики — это как раз норма.

AN>Нахрена тогда там вообще DISTINCT , так что и Postgres и Oracle в данном случае делают всё правильно и логично.

AN>Если мне нужно первое из уникальных значений столбца — то надо сначала найти все уникальные. А не взять тупо первую строку и сделать по ней DISTINCT


Вы бы ещё обиделись на то, что он при if exists(select * from tablename) не делает full table scan.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: постгресс ненависти псто №2
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.09.23 14:06
Оценка:
Здравствуйте, BlackEric, Вы писали:


BE>Если что есть книга: PostgreSQL Query Optimization The Ultimate Guide to Building Efficient Queries


Круто! А есть аналог про MySQL?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: постгресс ненависти псто №2
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 16.09.23 22:28
Оценка: 25 (2) +1
Здравствуйте, BlackEric, Вы писали:

BE>На английском, но весьма не плоха.

Учитывая состав авторов думаю есть и на русском

Dombrovskaya H., Boris Novikov, Bailliekova A.


А вот и нашлось http://lib.jizpi.uz/pluginfile.php/7334/mod_resource/content/0/%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2%20PostgreSQL.pdf

На самом деле для человека, владеющего техниками оптимизации для SQL Server изучить оптимизацию для Postgres несложно, там примерно на порядок меньше вариантов операторов в плане, а множество типов индексов, которых нет в SQL Server, оптимизируют вполне конкретные функции.
Остается только разобраться с vacuum.
Re[3]: постгресс ненависти псто №2
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 16.09.23 22:34
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, BlackEric, Вы писали:



BE>>Если что есть книга: PostgreSQL Query Optimization The Ultimate Guide to Building Efficient Queries


S>Круто! А есть аналог про MySQL?


[sarcasm]Мне кажется MySQL и эффективность запросов — понятия несовместимые. [/sarcasm]

По MySQL все описано тут https://dev.mysql.com/doc/refman/8.0/en/optimization.html
Re[3]: постгресс ненависти псто №2
От: nikkit  
Дата: 17.09.23 04:07
Оценка: -1 :))
G>На самом деле для человека, владеющего техниками оптимизации для SQL Server изучить оптимизацию для Postgres несложно, там примерно на порядок меньше вариантов операторов в плане, а множество типов индексов, которых нет в SQL Server, оптимизируют вполне конкретные функции.
G>Остается только разобраться с vacuum.

просто в отличие от sql server, на оракле и постгресс здравый смысл и интуицию использовать бесполезно. нужно обязательно читать мануалы
Re[4]: постгресс ненависти псто №2
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.09.23 07:15
Оценка:
Здравствуйте, gandjustas, Вы писали:
G>[sarcasm]Мне кажется MySQL и эффективность запросов — понятия несовместимые. [/sarcasm]
+1. Но вот тут дотошный студент попался, после моей лекции стал вопросами донимать, типа "почему вы считаете MySQL днищем". Я бегло порылся — везде какой-то детский лепет, начиная от элементарщины типа "используйте индексы, не тащите на клиента лишнего, в случае непоняток не стесняйтесь пользоваться EXPLAIN" и заканчивая бредом вроде "не надо выбирать лишние колонки во вложенных запросах, т.к. серверу придётся тяжело". Не могу поверить, что на плаву всё ещё остался движок, неспособный продвигать проекции вниз по дереву запросов.

Вот теперь ищу источник, на который можно авторитетно сослаться

G>По MySQL все описано тут https://dev.mysql.com/doc/refman/8.0/en/optimization.html

Спасибо большое. Посмотрим повнимательнее.
Вообще, похоже, за три мажорных релиза, прошедших с тех пор, как я на него смотрел в последний раз, ребята неплохо продвинулись
Вон, даже рекурсивные CTE прикрутили.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: постгресс ненависти псто №2
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.09.23 07:43
Оценка: 76 (1)
Здравствуйте, Sinclair, Вы писали:


G>>По MySQL все описано тут https://dev.mysql.com/doc/refman/8.0/en/optimization.html

S>Спасибо большое. Посмотрим повнимательнее.
Я вот тоже решил почитать внимательнее и нашел вот такой раздел:
https://dev.mysql.com/doc/refman/8.0/en/subquery-optimization.html

Видимо до 8 версии (2016 год) основная стратегия работы с подзапросами была — материализация. То есть любой подзапрос в запросе превращался в таблицу в памяти или на диске, к которой применялись операторы внешнего запроса.
Поэтому любой нетривиальный запрос превращался в страшно тормозное говно. Начиная с 8 версии начали появляться другие стратегии и оптимизации, например predicate pushdown https://dev.mysql.com/doc/refman/8.0/en/derived-condition-pushdown-optimization.html

S>Вообще, похоже, за три мажорных релиза, прошедших с тех пор, как я на него смотрел в последний раз, ребята неплохо продвинулись

Есть такое, но доверия пока мало. Опыт знакомых говорит что MySQL все еще нещадно тормозит на нетривиальных запросах.

S>Вон, даже рекурсивные CTE прикрутили.

По синтаксису и семантике запросов внезапно MySQL InnoDB очень близок к MsSQL, но работает заметно хуже.
Re[4]: постгресс ненависти псто №2
От: Gt_  
Дата: 18.09.23 08:39
Оценка: -2 :)
Здравствуйте, nikkit, Вы писали:


G>>На самом деле для человека, владеющего техниками оптимизации для SQL Server изучить оптимизацию для Postgres несложно, там примерно на порядок меньше вариантов операторов в плане, а множество типов индексов, которых нет в SQL Server, оптимизируют вполне конкретные функции.

G>>Остается только разобраться с vacuum.

N>просто в отличие от sql server, на оракле и постгресс здравый смысл и интуицию использовать бесполезно. нужно обязательно читать мануалы


здравый смысл ? и это про базу которая три десятилетия фигачила десяток типов блокировок которые так и ничего кроме дедлоков и не дали, все равно как у оракла и пострес версионность пришлось прикручивать ?
Отредактировано 18.09.2023 15:15 Gt_ . Предыдущая версия .
Re[4]: постгресс ненависти псто №2
От: Dym On Россия  
Дата: 18.09.23 20:16
Оценка:
Здравствуйте, nikkit, Вы писали:

N>просто в отличие от sql server, на оракле и постгресс здравый смысл и интуицию использовать бесполезно. нужно обязательно читать мануалы

Мануалы нужно вообще читать, и лучше перед тем, как что-то собираешься сделать.
Счастье — это Glück!
Re[5]: постгресс ненависти псто №2
От: paucity  
Дата: 18.09.23 23:09
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>+1. Но вот тут дотошный студент попался, после моей лекции стал вопросами донимать, типа "почему вы считаете MySQL днищем". Я бегло порылся — везде какой-то детский лепет, .....


Ты прочитал лекцию "MySQL — днище," а теперь ищешь аргументы, как это обосновать?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.