@pgsql

Страница 656 из 1062
Anton
30.01.2018
20:09:06
69753

Аггей
30.01.2018
20:09:54
Во

https://pastebin.com/YjrEkj0j

Ваш план

Google
Аггей
30.01.2018
20:11:12
Использует индекс CREATE INDEX i_countrylanguage ON countrylanguage USING btree (countrycode);

А нет. простите. преждевременно

Anton
30.01.2018
20:12:26
https://pastebin.com/A3t7AWgJ

Alexey
30.01.2018
20:14:24
ну да, в мускле index-only scan. только extended в explain уже можно не писать, оно автоматом делается

Аггей
30.01.2018
20:20:52
В дампе 2 таблицы

Anton
30.01.2018
20:21:30
Вернусь, проверю.

Аггей
30.01.2018
20:21:49
Нет таблицы country

Anton
30.01.2018
20:24:15
Странно.

Нет таблицы country
извиняюсь. опечатался в названии таблиы для дампа и дампер не выдал предупреждения.

Аггей
30.01.2018
21:26:04
Тут существенно улучшить конечно не получится. Думаю под конкретно этот запрос строить индекс типа create index on countrylanguage (language , countrycode) ; (аналог первичного ключа в этой таблице) безсмысленно. Но вот немного странно, что у меня план дает 1 секунду время выполнения у вас аж 4.... на таких объемах размер ram не играет значения. Интересно на чем вы выполняете запросы.

http://ps.tmpc.ru/927f532d

У меня правда pg - 9.6

Alexey
30.01.2018
21:34:09
пока постгрес свои хэш-джойны развернёт, мускуль по-быстрому на индекс сканах вжух?

Google
Аггей
30.01.2018
21:35:20
Я слабо представляю, что творится у мускуля внутри. Но видимо да - магия

Alexey
30.01.2018
21:36:52
любой планировщик ошибается, вот и вся магия. для этого придумали хинты. а, ну да... :)

Аггей
30.01.2018
21:38:00
Alexey
30.01.2018
21:38:34
да нет, я даже не вникал, если честно, просто мимо крокодил

Аггей
30.01.2018
21:39:02
С изменением объема данных - хинты могут подсказывать неправильно... и пару раз это становилось головной болью с oracle

Alexey
30.01.2018
21:39:46
но я могу накидать примеров, когда оптимизатор в принципе не может знать, как оптимальнее выполнять запрос. например, потому что не знает, что будет читать из памяти, а что с диска

да и все косты вот эти — мы же понимаем, что это очень условные величины

Аггей
30.01.2018
21:46:53
У меня есть система, для которой я хинтом прибил план запроса. Дорогой по CPU и дешевый по диску... но это реально - единственный случай

Аггей
30.01.2018
21:51:36
У меня для сравнения в контейнере, на виртуалке, в цоде делением ядер 1:5. И время выполнения 1 секунда

Anton
30.01.2018
21:52:01
да и все косты вот эти — мы же понимаем, что это очень условные величины
у оракла они заметно более точные. у пг весьма приблизительные по сути

У меня для сравнения в контейнере, на виртуалке, в цоде делением ядер 1:5. И время выполнения 1 секунда
не скажу за деление ядер, но остальное перечисленное практически не играет роли. к тому же, мыскл и пг в равных хардваре условиях

Alexey
30.01.2018
21:53:20
у оракла они заметно более точные. у пг весьма приблизительные по сути
всё равно же эвристика. где-то умнее, где-то так себе

Аггей
30.01.2018
21:53:42
у оракла они заметно более точные. у пг весьма приблизительные по сути
Планы не так точны - у оракла очень много информации - статистики - вот это да - отлично

Anton
30.01.2018
21:54:00
что интересно, у оракла с 11й версии появился "автооптимизатор", который по факту исполнения запроса вычисляет ошибки планировщика и исправляет их для следующего запроса

Alexey
30.01.2018
21:55:48
круто, да. но даже он вряд ли учитывает промахи в CPU cache, фрагментацию файлов на диске, и т.д.

Anton
30.01.2018
21:55:50
вобщем, если мне покажете, что на отличном от моего железе пг работает на этой задаче быстрее мыскуля — я буду рад и спокоен как слоник

круто, да. но даже он вряд ли учитывает промахи в CPU cache, фрагментацию файлов на диске, и т.д.
ну он не сразу, он статистику ошибок оптимизатора ведёт, чтобы точнее исправлять

Google
Alexey
30.01.2018
21:56:41
я понимаю

Anton
30.01.2018
21:57:45
ну и насколько я помню там можно как то это профилями что ли управлять, чтобы когда тебе известен профиль нагрузки на сервер, то можно было их переключать. за давностью лет подзабыл уже

Аггей
30.01.2018
21:58:07
Аггей
30.01.2018
22:00:49
Ну он достаточно глуп. Профили да есть - ими можно для конкретного запроса - прибить ту же степень параллелизма. Но есть одно условие - надо всегда использовать биндинг переменных - иначе оракл будет считать каждую версию - разным запросом

Alexey
30.01.2018
22:00:50
ой, я тут слушал доклад про автономные базы данных в оракле. там вообще про какой-то космос рассказывали

Alexey
30.01.2018
22:01:41
минутку

Alexey
30.01.2018
22:02:17
перескажите вкратце?
вот он: https://www.osp.ru/netcat_files/userfiles/TBD_2_2017/Rivkin_tbd_17.pdf

Аггей
30.01.2018
22:05:14
Automatic SQL Tuning (Tuning Advisor) вот о чем выше речь шла.

Alexey
30.01.2018
22:06:32
да, но они там в 18c наворотили ещё кучу всего поверх

как-то раз меня занесло на Oracle Open World. ушёл просветлённым...

Аггей
30.01.2018
22:10:39
)) Самый опытный Oracle DBA в нашей организации даже автоматическое управление памятью СУБД не доверяет (до 11 версии было только ручное - с 11 появилось автоматическое)... а тут и бэкапы и восстановление автоматическое... и все все все....

Usagi
31.01.2018
06:00:34
Ребята, всегда ли оправдано в мастер делать insert, а с реплики select делать?

Sergey
31.01.2018
06:03:17
если коротко то не всегда

реплика может отставать и можно в селекте с неё не увидеть свежего инсерта. Приложение должно быть к такому готово

Google
Usagi
31.01.2018
06:38:06
Если синхронная то да
Синхронность задается в настройках? Эти базы будут в одном кластере Kubernetes, сеть гигабитная между ними.

Sergey
31.01.2018
06:40:19
Синхронность задается в настройках? Эти базы будут в одном кластере Kubernetes, сеть гигабитная между ними.
Да в настройках постгри. Кубик там или в железе без разницы. Но по скорости просядет

Usagi
31.01.2018
06:42:24
Да в настройках постгри. Кубик там или в железе без разницы. Но по скорости просядет
значительно просядет? лучше внутри виртуалки поднять? для базы отдельного железа нету пока что

Сергей
31.01.2018
06:46:01
значительно просядет? лучше внутри виртуалки поднять? для базы отдельного железа нету пока что
Задай вопрос нужна ли тебе синхронная репликации? Может лучше асинхронная?

Sergey
31.01.2018
06:47:11
Usagi
31.01.2018
06:57:26
Похоже, надо еще покурить доки)

Vadim
31.01.2018
07:03:04
при remote_write просядет на запись где то в 1,3 раза, remote_apply - 1,5 раза. Но это очень приблизительно, нужно разбираться в вашем профиле нагрузки. Вы можете делать синхронными только определенные транзакции, которые критичны к читающим операциям на реплике. Но это более гибкая и сложная работа.

Yaroslav
31.01.2018
07:13:36
Если синхронная то да
Тоже не гарантирует консистентности, кстати.

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

Sergey
31.01.2018
08:15:22
Тоже не гарантирует консистентности, кстати.
А можно по-подробней, где почитать.

Аггей
31.01.2018
08:16:10
hash индексы?

Yaroslav
31.01.2018
08:17:22
А можно по-подробней, где почитать.
https://www.postgresql.org/docs/current/static/applevel-consistency.html#SERIALIZABLE-CONSISTENCY Там warning.

Аггей
31.01.2018
08:20:14
Я и не вижу смысла в serializable на standby

Yaroslav
31.01.2018
08:21:36
Он же о другом? Или я не понимаю?
Warning This level of integrity protection using Serializable transactions does not yet extend to hot standby mode. Т.е. hot standby ACID consistency (и isolation) _не обеспечивает_.

Аггей
31.01.2018
08:23:32
Там записи нет. Все выборки при операции записи (процесс восстановления) завершаются - то есть не могут вернуть неконсистентный набор данных

Yaroslav
31.01.2018
08:26:30
Там записи нет. Все выборки при операции записи (процесс восстановления) завершаются - то есть не могут вернуть неконсистентный набор данных
Могут. Warning там не просто так. То, что выборка возращает какой-то snapshot, не значит, что он относится к какому-то _консистентному состоянию_ master-а, вот в чём штука...

Google
Let Eat
31.01.2018
08:28:05
значительно просядет? лучше внутри виртуалки поднять? для базы отдельного железа нету пока что
Предположу , что "просядет" было про включение синхронной репликации

Аггей
31.01.2018
08:28:54
То есть - если мы используем на мастере - иные уровни изоляции - то снапшот на standby может быть неконсистентен. Так правильно читается этот ворнинг?

Yaroslav
31.01.2018
08:31:04
То есть - если мы используем на мастере - иные уровни изоляции - то снапшот на standby может быть неконсистентен. Так правильно читается этот ворнинг?
Какие "иные"? Если мы даже используем SERIALIZABLE на master-е, на slave всё равно можно наблюдать неконсистентные состояния.

Аггей
31.01.2018
08:34:36
Какие "иные"? Если мы даже используем SERIALIZABLE на master-е, на slave всё равно можно наблюдать неконсистентные состояния.
Вот это да - непонятно. Видимо надо углубляться в реализацию записи wal и особенности их применения на мастере в режиме serializable... Вы подробностей такого поведения не знаете?

Yaroslav
31.01.2018
08:37:41
Вот это да - непонятно. Видимо надо углубляться в реализацию записи wal и особенности их применения на мастере в режиме serializable... Вы подробностей такого поведения не знаете?
Это (реализацию записи wal и особенности их применения на мастере) здесь ни при чём. Дело в том, что predicate locking на slave не выполняется (и никаких других механизмов, вроде передачи safe snapshots с master, сейчас нет). Поэтому slave позволяет "увидеть" (читать) snapshot-ы, при попытке чтения которых на master Вы бы получили serialization failure.

Аггей
31.01.2018
08:39:16
Поищу материал. Стало интересно

Yaroslav
31.01.2018
08:39:26
Вот, кажется, последний thread в -hackers по этому поводу: https://www.postgresql.org/message-id/CAEepm%3D2b9TV%2BvJ4UeSBixDrW7VUiTjxPwWq8K3QwFSWx0pTXHQ%40mail.gmail.com

Alexey
31.01.2018
08:43:31
и правда интересно

Yaroslav
31.01.2018
08:52:41
Есть где нибудь описание всех этих serializable и проч изоляций для бедных умом? Я официальную доку и читал, слова понимаю, но интуитивно о чем они в целом все равно понять не могу.
А это https://wiki.postgresql.org/wiki/Serializable и это http://wiki.postgresql.org/wiki/SSI видели? Вообще это нетривиальная штука, вот в чём дело. Даже сам алгоритм был создан только в 2008 году, кажется.

Есть где нибудь описание всех этих serializable и проч изоляций для бедных умом? Я официальную доку и читал, слова понимаю, но интуитивно о чем они в целом все равно понять не могу.
Зато, с другой стороны, для использования SERIALIZABLE знать всё это совсем не нужно —- просто соблюдайте простые правила, и всё: Consistent use of Serializable transactions can simplify development. The guarantee that any set of successfully committed concurrent Serializable transactions will have the same effect as if they were run one at a time means that if you can demonstrate that a single transaction, as written, will do the right thing when run by itself, you can have confidence that it will do the right thing in any mix of Serializable transactions, even without any information about what those other transactions might do, or it will not successfully commit. It is important that an environment which uses this technique have a generalized way of handling serialization failures (which always return with a SQLSTATE value of '40001'), because it will be very hard to predict exactly which transactions might contribute to the read/write dependencies and need to be rolled back to prevent serialization anomalies. К тому же, в любом правильно написанном приложении такой обработчик исключений уже есть (хотя бы для DEADLOCK-ов), расширить его (добавить SQLSTATE 40001) должно быть тривиально.

Аггей
31.01.2018
09:22:59
утра. я так понимаю, мой вчерашний вопрос закрыт?
У меня остаются вопросы к 4м секундам... Чет долго )

Anton
31.01.2018
09:23:18
я согласен получить сравнение с мыскулем на том же железе

ну и там не 4 сек, а в реальности где то 2.5 мсек

Аггей
31.01.2018
09:23:38
Мыскуль какой версии?

Anton
31.01.2018
09:23:48
5.7.21

Аггей
31.01.2018
09:24:21
миллисекундам
Да. Я там приводил свой план - у меня в 4 раза лучше

Страница 656 из 1062