#RuPostgres

Поделиться
HTML-код
  • Опубликовано: 16 сен 2024
  • Онлайн-опросы неизменно показывают - всех нас очень интересуют две вещи: а) как писать наиболее эффективные SQL-запросы, б) как «читать» такие запросы, а точнее, как понимать, что именно делает или будет делать СУБД при их выполнении.
    Эти две неразрывно связанные друг с другом темы чрезвычайно обширны, SQL-искусству можно (и нужно) учиться годами. Во время нашей очередной встречи в прямом эфире мы затронем некоторые аспекты обеих.
    ЧАСТЬ 1: EXPLAIN
    Алексей Ермаков. Как читать и интерпретировать вывод команды EXPLAIN
    Команда EXPLAIN - основной инструмент анализа запросов, позволяющий разобраться, каким образом запрос будет выполняться и как можно его ускорить. Для сложных запросов вывод может быть довольно громоздким и его становится сложно читать. Я расскажу, из каких частей состоит план запроса, на какие «маркеры» в нём следует обращать внимание в первую очередь и как на это реагировать.
    ЧАСТЬ 2: ADVANCED SQL
    Николай Самохвалов. SQL современный и «продвинутый»
    «Я не волшебник, я только учусь». Продвинутому SQL нас постоянно учат такие видные гуру как Markus Winand и Макс Богук. Рекурсивные CTE, LATERAL JOIN, виртуозная работа с массивами и строками, window functions и прочие модные штучки, которые помогут вам в дрессировке вашего Постгреса, - я постараюсь сделать хороший обзор, а если вдруг тема покажется интересной, то в следующих сеансах группового Постгреса мы обязательно пригласим настоящих гуру :)

Комментарии • 6

  • @RuPostgres
    @RuPostgres  6 лет назад +2

    СЛАЙДЫ:
    - первая часть (explain): www.slideshare.net/alexius2/explain-82601826
    - вторая часть (adv. sql): www.slideshare.net/samokhvalov/rupostgreslive-4-sql
    ПОЛЕЗНОЕ:
    визуализаторы explain:
    - explain.depesz.com/
    - tatiyants.com/pev
    статьи, слайды:
    - очень полезные сайты (Маркус Винанд): modern-sql.com/ и use-the-index-luke.com
    - обзор «фишек» современного стандартного SQL use-the-index-luke.com/blog/2015-02/modern-sql
    - много про count(..) gist.github.com/begriffs/67839ff18176d5879e77954bfcd38f1f
    - Максим Богук, “Как научить слона танцевать Рок-н-ролл” pgday.ru/presentation/232/5964945ea4142.pdf
    Twitter: twitter.com/postgresmen - подписывайтесь!
    Ну и на RUclips-канал тоже подписывайтесь, если ещё не.

  • @NikolaySamokhvalov
    @NikolaySamokhvalov 6 лет назад +1

    Важное замечание-дополнение про index only scans!
    По поводу последнего примера с рекурсивным CTE. В чате абсолютно верно подсказывали (спасибо, Виктор!). Я упустил очень важное - там в таблице делались UPDATE-ы, когда я готовил датасет и я забыл VACUUM по ней сделать. Автовакуум нас не посещал... Ну и поэтому было много Heap Fetches.
    Вот что должно быть в хорошем состоянии, когда вакуум прошёлся недавно, всего 171ms вместо ~800ms, так как на хождение в сами таблицы (heap fetches) совсем время перестаёт тратиться:
    QUERY PLAN
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    CTE Scan on t (cost=52.27..54.29 rows=101 width=8) (actual time=0.035..171.033 rows=10000 loops=1)
    CTE t
    -> Recursive Union (cost=0.42..52.27 rows=101 width=8) (actual time=0.033..165.225 rows=10000 loops=1)
    -> Limit (cost=0.42..0.46 rows=1 width=8) (actual time=0.031..0.031 rows=1 loops=1)
    -> Index Only Scan using u_post_author_id_created_at on post (cost=0.42..30415.35 rows=1000195 width=8) (actual time=0.031..0.031 rows=1 loops=1)
    Heap Fetches: 0
    -> Nested Loop (cost=0.42..4.98 rows=10 width=8) (actual time=0.015..0.015 rows=1 loops=10000)
    -> WorkTable Scan on t t_1 (cost=0.00..0.20 rows=10 width=8) (actual time=0.000..0.000 rows=1 loops=10000)
    -> Limit (cost=0.42..0.46 rows=1 width=8) (actual time=0.014..0.014 rows=1 loops=10000)
    -> Index Only Scan using u_post_author_id_created_at on post post_1 (cost=0.42..10974.89 rows=333398 width=8) (actual time=0.013..0.013 rows=1 loops=10000)
    Index Cond: (person_id > t_1._person_id)
    Heap Fetches: 0
    Planning time: 0.357 ms
    Execution time: 172.195 ms
    И, кстати, эта же проблема мне попортила один из первых примеров, когда я ждал index only scan, а ловил bitmap index & heap scan-ы (ruclips.net/video/7HFecftZ1qM/видео.htmlh18m51s)
    Итого: держите автовакуум агрессивно настроенным - не только ради уменьшения раздувания таблиц (bloat), но и для того, чтобы visibility maps были актуальны и index only scan-ы работали эффективно, без кучи heap fetches!

  • @gudjihn
    @gudjihn 2 года назад +1

    Спасибо за видео! Возможно ли записать ролик с тем как писать процедуры plpgsql с конкретными действиями, а главное показать процесс размышления. Второй год как в разработке.
    Спасибо

    • @RuPostgres
      @RuPostgres  Год назад +1

      возможно, сделаем - но на англ тогда уже (postgres.tv)
      спасибо за идею

    • @gudjihn
      @gudjihn Год назад

      @@RuPostgres No prob!)

  • @user-co8lq8ur5z
    @user-co8lq8ur5z 4 года назад +1

    видео норм, но голос капец.... и потом еще этот сербок воды на 20 минуте , я не выдержал