2015-02-20 3 views
0

Рассмотрим У меня есть две таблицы, детали и RATE со следующими столбцами:Слишком много декартовы продуктов, делая запрос для запуска медленнее

ПОДРОБНОСТИ стол:

CREATE TABLE DETAILS(
LONG ID PRIMARY KEY AUTO_INCREMENT, 
DOUBLE PRICE1, 
DOUBLE PRICE2, 
DOUBLE PRICE3, 
VARCHAR(25) CURRENCY, 
DATE CREATED_DATE, 
VARCHAT(50) COMPLETED 
.................. 
Few more columns 
); 

RATE ТАБЛИЦА:

CREATE TABLE RATE(
LONG ID PRIMARY KEY AUTO_INCREMENT, 
DOUBLE RATE, 
VARCHAR(25) CURRENCY, 
DATE CREATED_DATE 
.................. 
Few more columns 
); 

И У меня есть запрос на обновление таблицы DETAILS, как показано ниже.

UPDATE DETAILS D, RATE R 
SET D.PRICE1=D.PRICE1*R.RATE, 
D.PRICE2=D.PRICE2*R.RATE, 
D.PRICE3=D.PRICE3*R.RATE 
WHERE 
D.CURRENCY=R.CURRENCY AND 
DATE(D.CREATED_DATE) = DATE(R.CREATED_DATE) AND 
D.COMPLETED IS NULL OR DO.COMPLETED='ABC' AND 
D.CURRENCY!='RUPEE'; 

Перед запрос работает нормально, но как таблица выращены этот запрос начал занимать больше времени, и это дает cartesion продукт с точки зрения миллиардов.

Есть ли способ, которым я могу оптимизировать этот запрос? Любая помощь будет очень полезна.

+0

Можете ли вы опубликовать вывод запроса 'EXPLAIN UPDATE ....', пожалуйста? – Simon

+0

Можете ли вы перечислить индексы, которые у вас есть на каждой таблице? –

+0

Hi Simon. Для каждого запуска мы вставляем обе таблицы с новыми данными и после ввода данных, мы вызываем этот запрос обновления для обновления данных. – user2823355

ответ

1

Используйте явные join s и зафиксировать where Пунктом с помощью круглых скобок:

UPDATE DETAILS D JOIN 
     RATE R 
     ON D.CURRENCY=R.CURRENCY AND 
      DATE(D.CREATED_DATE) = DATE(R.CREATED_DATE) 
    SET D.PRICE1 = D.PRICE1*R.RATE, 
     D.PRICE2 = D.PRICE2*R.RATE, 
     D.PRICE3 = D.PRICE3*R.RATE 
WHERE (D.COMPLETED IS NULL OR DO.COMPLETED='ABC') AND 
     D.CURRENCY <> 'RUPEE'; 

Проблема заключается в круглые скобки в предложении where. Тем не менее, вы просто не должны использовать запятые, чтобы иметь в виду join.

0

DATE(D.CREATED_DATE) = DATE(R.CREATED_DATE)

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

Добавить INDEX(currency, created_date) как минимум на RATE. Это, плюс вышеупомянутое изменение, значительно ускорит запрос.

Другим усовершенствованием было бы сделать currency ENUM или нормализовать его.

 Смежные вопросы

  • Нет связанных вопросов^_^