SELECT будет проверять больше чем MAX_JOIN_SIZE строк - PullRequest
0 голосов
/ 24 апреля 2018

Мы объединяем 3 таблицы с ~ 21000 строками, ~ 2000 строками и ~ 1600 строками.

MAX_JOIN_SIZE с ~ 8.000.000.Каждая таблица содержит столбец с именем providerID.

Запрос выглядит так:

SELECT
   A.ID, B.ID, C.ID
FROM       A 
INNER JOIN B 
   ON A.ID = B.aID 
INNER JOIN C 
   ON A.ID = C.aID
WHERE
   A.providerID = 200 AND
   B.providerID = 200 AND
   C.providerID = 200

Весь запрос возвращает 3 строки, а каждая строка where возвращает ~ 90, ~ 60, ~ 10 строк.

Настройка BIG_SQL_QUERY недостаточно хороша, так как эта проблема внезапно возникла.

По моему мнению, оптимизатор запросов мог бы решить проблему, сначала выбрав одну из 3 таблиц, а затем присоединившись к

Ответы [ 2 ]

0 голосов
/ 18 мая 2018
SELECT  A.ID, B.ID, C.ID
    FROM  A
    INNER JOIN  B  ON A.ID = B.aID
                  AND A.providerID = B.providerID
    INNER JOIN  C  ON A.ID = C.aID
                  AND A.providerID = C.providerID
    WHERE  A.providerID = 200

и add

A:  INDEX(providerID, ID)   -- In this order
B:  INDEX(providerID, aID)  -- In either order
C:  INDEX(providerID, aID)  -- In either order

Если возможно, используйте реальные имена для таблиц и столбцов;иногда есть полезные подсказки intent , которые могут помочь в решении проблем производительности (и т. д.).Если бы они не были все "200", то мой ответ должен иметь извергнутый на него вулканический пепел.

Возможно, предела 'соединения' можно избежать, имея эти индексы.

Кажется, что B и C тесно связаны;есть ли причина иметь две отдельные таблицы?(Опять же, настоящие имена могли бы ответить на этот вопрос.)

0 голосов
/ 24 апреля 2018

Вы можете добавить фильтр к условию JOIN

SELECT
   A.ID, B.ID, C.ID
FROM   A 
JOIN   B 
  ON  A.<something> = B.<something>
 AND  A.providerID = <value>
 AND  B.providerID = <value>
JOIN   C
  ON  A.<something> = C.<something>
 AND  C.providerID = <value>

Теперь, если providerID является условием JOIN, вы получаете:

SELECT
   A.ID, B.ID, C.ID
FROM   A 
JOIN   B 
  ON  A.providerID  = B.providerID 
 AND  A.providerID = <value>
JOIN   C
  ON  B.providerID  = C.providerID 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...