Выберите строки из отфильтрованной части таблицы A, где столбец соответствует связи со столбцом из строки в таблице B, которая совпадает по идентификатору - PullRequest
0 голосов
/ 18 апреля 2019

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

Конкретно, у меня естьдве таблицы, заказы и product_info, к которым я обращаюсь через Amazon Redshift

Заказы

| ID   | Date     | Amount | Region |
=====================================
| 1    | 2019/4/1 | $120   | A      |
| 1    | 2019/4/4 | $100   | A      |
| 2    | 2019/4/2 | $50    | A      |
| 3    | 2019/4/6 | $70    | B      |

Ключи разделов заказа - это регион и дата.

Информация о продукте

| ID   | Release Date | Region |
| ---- | ------------ | ------ |
| 1    | 2019/4/2     | A      |
| 2    | 2019/4/3     | A      |
| 3    | 2019/4/5     | B      |

Первичным ключом информации о продукте является id, а ключом раздела является регион.

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

Так что в этом случае он должен вернуть только одну строку,

| 1    | 2019/4/4 | $100   | A      |

Я пытался сделать

select *
from orders
INNER JOIN product_info ON orders.date>product_info.release_date
  AND orders.id=product_info.id
  AND orders.region=A
  AND product_info.region=A
limit 10

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

Как эффективно написать запрос такого типа?

1 Ответ

0 голосов
/ 18 апреля 2019

Лучший способ ускорить выполнение SQL-запроса - это как можно скорее исключить строки.

Таким образом, вместо того, чтобы помещать условия типа orders.region=A в оператор JOIN, вы должны переместить их в * 1004.* заявление.Это исключит строки до их объединения.

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

Попробуйте что-то вроде этого:

SELECT *
FROM orders
INNER JOIN product_info ON orders.id = product_info.id
WHERE orders.region = 'A'
  AND product_info.region = 'A'
  AND orders.date > product_info.release_date

Любая дальнейшая оптимизация потребует рассмотрения DISTKEY и SORTKEY в таблицах Redshift.(Предпочтительно DISTKEY из id и SORTKEY из date).

...