Внутренние объединения с участием трех столов - PullRequest
1 голос
/ 02 июля 2011

У меня есть оператор SELECT с тремя внутренними объединениями, включающими две таблицы. Кроме создания индексов для столбцов, на которые есть ссылки в предложениях ON и WHERE, есть ли другие способы, которые я могу сделать для оптимизации объединений, например, при переписывании запроса?

SELECT
  ...
FROM
  my_table AS t1
INNER JOIN
  my_table AS t2
ON 
  t2.id = t1.id
INNER JOIN
  other_table AS t3
ON
  t2.id = t3.id
WHERE
 ...

Ответы [ 3 ]

1 голос
/ 03 июля 2011

Вы можете настроить конфиг PostgreSQL, АНАЛИЗ ВАКУУМА и все общие оптимизации.

Если этого недостаточно, и вы можете потратить несколько дней, вы можете написать код для создания материализованного представления, как описано в postgresql wiki.

0 голосов
/ 29 сентября 2012

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

Первое, что нужно сделать, - запустить анализ вакуума, чтобы убедиться, что у вас есть оптимальная статистика.Затем используйте объяснение и анализ, чтобы сравнить ожидаемую производительность запроса с фактической.С этого момента мы рассмотрим индексы и т. Д. В этом запросе нет ничего, что нужно оптимизировать на уровне запроса.Однако, не смотря на ваши действительные фильтры в предложении where и на фактические результаты анализа объяснения, вы не можете многое предложить.

Обычно вы настраиваете БД, чтобы выбрать лучший план запроса, а не указывать его вВаш запрос.Обычно это способ PostgreSQL.Комментарий, конечно, уточняется, если есть исключения.

0 голосов
/ 02 июля 2011

Вероятно, в вашем примере есть ошибка, потому что вы выбираете одну и ту же запись из my_table дважды, вы действительно можете просто сделать:

SELECT
  ...
FROM
  my_table AS t1
INNER JOIN
  other_table AS t3
ON
  t1.id = t3.id
WHERE
 ...

Поскольку в вашем примере код t1 всегда будетt2.

Но давайте предположим, что вы имеете в виду ON t2.idX = t1.id;затем, чтобы ответить на ваш вопрос, вы не можете получить намного лучшую производительность, чем у вас, вы могли бы их проиндексировать или вы могли бы пойти дальше и определить их как отношения внешнего ключа (что не принесло бы слишком много преимуществ с точки зрения производительности по сравнению сне-индексирование по сравнению с их индексацией).

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

Вы могли бынапишите ваш запрос, используя WHERE EXISTS (если вам не нужно выбирать данные из всех трех таблиц), а не INNER JOINS, но производительность будет почти одинаковой (за исключением случаев, когда она сама находится во вложенном запросе), так как все равно нужно найтизаписи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...