#mysql
#MySQL
Вопрос:
Мне нужно найти значение, которое существует в LoyaltyTransactionBasketItemStores
таблице, но не в DimProductConsolidate
таблице. Мне нужен код товара и соответствующая ему компания. Это мой запрос
SELECT
A.ProductReference, A.CompanyCode
FROM
(SELECT ProductReference, CompanyCode FROM dwhdb.LoyaltyTransactionsBasketItemsStores GROUP BY ProductReference) A
LEFT JOIN
(SELECT LoyaltyVariantArticleCode FROM dwhdb.DimProductConsolidate) B ON B.LoyaltyVariantArticleCode = A.ProductReference
WHERE
B.LoyaltyVariantArticleCode IS NULL
Это довольно простой запрос. Но когда я запускаю его, это занимает 1 час и все еще не завершено. Затем я использую EXPLAIN, и это результат
Но когда я удаляю CompanyCode
из своего запроса, его производительность значительно возрастает. Это результат ОБЪЯСНЕНИЯ
Я хочу знать, почему это происходит, и есть ли какой-либо способ получить ProductReference
и его компанию с гораздо более высокой производительностью?
Ответ №1:
Ваш текущий запрос изобилует синтаксическими и структурными ошибками. Я бы использовал здесь логику exists:
SELECT a.ProductReference, a.CompanyCode
FROM dwhdb.LoyaltyTransactionsBasketItemsStores a
WHERE NOT EXISTS (SELECT 1 FROM dwhdb.DimProductConsolidate b
WHERE b.LoyaltyVariantArticleCode = a.ProductReference);
Ваш текущий запрос выполняет a GROUP BY
в первом подзапросе, но вы никогда не выбираете агрегированные данные, а скорее другие неагрегированные столбцы. В большинстве других баз данных и даже в MySQL в строгом режиме этот синтаксис не разрешен. Кроме того, здесь нет необходимости иметь 2 подзапроса. Вместо этого просто выберите из таблицы корзины, а затем подтвердите, что соответствующие записи не существуют в другой таблице.