Посмотреть производительность и ортогональность

Я пытаюсь улучшить производительность многих представлений для моей работы, и сейчас я делаю такие вещи, как удаление подзапросов, вызовы других функций в select (функции, которые делают выборки внутри него), и создание вещей с помощью Join. Я хотел бы знать, если это правильный выбор, даже думая, что я получаю лучшие результаты для получения представления без фильтров (скажем, 20000 строк), не очень ясно, что это даст мне лучший результат, скажем, 200 рядов. Как вы сталкиваетесь с такими взглядами, когда у вас много результатов, или вступление в них тогда довольно дорого?

Что еще я могу рассмотреть, чтобы улучшить производительность?

Я смотрю на некоторые вопросы здесь, и люди говорят об ортогональности, и я не понимаю. В этой ссылке есть ответ от пользователя jjanes, где он говорит об ортогональности, но это не так ясно. Кто-нибудь знает и может объяснить мне, как "ортогональная" концепция может быть представлена ​​с помощью Joins и Subquerys? View не увеличивает производительность коррелированного подзапроса?

(Это просто концептуальная тема, но я использую postgre)

Спасибо

1 ответ

Решение

Итак, вот основное руководство по оптимизации представлений (и других длинных запросов) в PostgreSQL.

Прежде всего, следует понимать, что чем больше информации у планировщика, тем лучше. Вызовы функций иногда неизбежны, но вы должны понимать, что они обычно непрозрачны для планирования, что фактически означает, что планировщик не может сложить логику в основной запрос и должен выполнять запрос отдельно. Таким образом, удаление функций - это хороший первый шаг (если только ваш взгляд просто не оборачивает функцию, и в этом случае нет никакой пользы от этого).

Второе, что нужно понять, - это то, что представления инкапсулируют логику данных, и, хотя это может показаться полезным, у него есть много-много подводных камней. В этом отношении программирование на SQL является полной противоположностью хорошему объектно-ориентированному проектированию, отчасти потому, что SQL декларативен, а отчасти потому, что он строго организован (что делает отладку гораздо более длинного оператора проще, чем сравнительно длинная функция, скажем, в Python). Поэтому нужно удалить объединения с представлениями в других представлениях.

Представьте, например, если у меня есть представление, скажем, с объединениями (что на самом деле не является чрезмерным). Но затем я запускаю запрос к представлению с самообъединением. Теперь я перешел с 9 объединений на 81, и проблема не очевидна из рассмотрения запроса, который вызвал проблему (но, мальчик, посмотрите на план запроса!).

В общем, ваши лучшие взгляды будут одного из трех видов:

  1. Простые функции-обертки. Например:

    CREATE VIEW current_stock_list AS select * from parts_stock_list(now());
    
  2. Простые подмножества других таблиц или представлений (но не функций переноса представлений), например:

    CREATE VIEW warehouse_current_stock AS select * onhand_stock WHERE warehouse = 1;
    
  3. Большие сложные запросы, попадающие в базовые таблицы. Запросы в 100 строк предпочтительнее запросов в 10 строк, если вы избегаете объединения с представлениями и функциями в процессе.

Надеюсь это поможет.

Другие вопросы по тегам