Нужно ли фильтровать все подзапросы перед объединением очень больших таблиц для оптимизации - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть три таблицы, которые я пытаюсь объединить с более чем миллиардом строк на таблицу.Каждая таблица имеет индекс в столбце даты выставления счета.Если я просто отфильтрую левую таблицу и выполню объединения, будет ли запрос выполняться эффективно или мне нужно будет использовать один и тот же фильтр даты в каждом подзапросе?

IE будет первый запрос выполняться намного медленнее, чем второй запрос?

select item, billing_dollars, IC_billing_dollars
from billing
left join IC_billing on billing.invoice_number = IC_billing.invoice_number
where billing.date = '2019-09-24'

select item, billing_dollars, IC_billing_dollars
from billing
left join (select * from IC_billing where IC_billing.date = '2019-09-24') on billing.invoice_number = IC_billing.invoice_number
where billing.date = '2019-09-24'

Я не хочу запускать это, не зная, будет ли запрос работать хорошо, так как не так многогарантии для неэффективных запросов.Кроме того, если мне нужно написать запрос вторым способом, есть ли способ иметь фильтр даты только в одном месте, а не показывать его несколько раз в запросе?

1 Ответ

0 голосов
/ 24 сентября 2019

Это зависит.

Рассмотрим ваш запрос:

select b.item, b.billing_dollars, icb.IC_billing_dollars
from billing b left join
     IC_billing icb
     on b.invoice_number = icb.invoice_number
where b.date = '2019-09-24';

(Предположим, у меня есть столбцы из правильных таблиц.)

Оптимальной стратегией является индексна billing(date, invoice_number) - возможно, также с item и billing_dollars к индексу;и ic_billing(invoice_number) - возможно, с IC_billing_dollars.

Я могу вспомнить две ситуации, когда фильтрация по дате в ic_billing была бы полезной.

Во-первых, если есть индекс на (invoice_date, invoice_number), особенно определение первичного ключа.Тогда использование этого индекса обычно предпочтительнее, , даже если доступен другой индекс .

Второй, если ic_billing разделен на invoice_date.В этом случае вы захотите указать раздел для производительности.

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

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