Оптимизация запросов - PullRequest
       11

Оптимизация запросов

2 голосов
/ 22 февраля 2010

В моем приложении мой модуль использует следующие таблицы

  1. PUBLIC_APPLICATION
  2. CATEGORY_MASTER
  3. NOTIFICATION_SITE_DETAIL
  4. DIMENSION_MASTER DM
  5. PUBLIC_REGISTRATION
  6. ALLOTMENT_NOTIFICATION.

Из следующих таблиц я получаю данные

SELECT PA.REGISTRATION_NO,PA.APP_ID,PA.NO_OF_ATTEMPTS,CM.CATEGORY_NAME,
DM.SITE_DIMENSION,PR.BDA_NO,AN.NOTIFY_ID 
 FROM **PUBLIC_APPLICATION PA,CATEGORY_MASTER CM,NOTIFICATION_SITE_DETAIL NSD,DIMENSION_MASTER DM, PUBLIC_REGISTRATION PR,ALLOTMENT_NOTIFICATION AN** 
WHERE **CM.CATEGORY_ID = PA.CATEGORY_ID AND 
NSD.NOTIFY_SITE_ID = PR.NOTIFY_SITE_ID AND 
DM.DIMENSION_ID = NSD.DIMENSION_ID AND 
PR.REGISTRATION_NO = PA.REGISTRATION_NO AND 
AN.NOTIFICATION_NO = PA.NOTIFICATION_NO AND
PR.NOTIFY_SITE_ID = PA.NOTIFY_SITE_ID AND NSD.NOTIFY_ID = AN.NOTIFY_ID AND 
PA.NOTIFICATION_NO = ?**  LIMIT ?, ?

PUBLIC_APPLICATION & PUBLIC_REGISTRATION содержат большое количество данных, почти миллион записей и другие таблицы содержат около 5000 записей.

Если я выполню вышеуказанный запрос, то для получения результатов потребуется более 30 минут. Может ли кто-нибудь предложить мне написать эффективный запрос, чтобы получить результаты в минимальные сроки?

забыл указать, для этого я использую базу данных mysql.

1 Ответ

4 голосов
/ 22 февраля 2010

Используя "STRAIGHT_JOIN", вы говорите оптимизатору сделать это так, как вы говорите. Я переместил Notification # в качестве первого предложения WHERE, чтобы оно сначала обрабатывалось для ограничения вашего набора. Затем я установил соединения для других таблиц. У меня было это раньше, когда я запрашивал у правительственных данных более 15 миллионов записей, чтобы объединить более 15 таблиц, и это заняло более 20 часов. Добавив только «STRAIGHT_JOIN» к моему уже правильно сформированному запросу, потребовалось около 2 часов ... опять же, более 15 миллионов записей и объединение более 15 таблиц для описания детей.

SELECT STRAIGHT_JOIN
        PA.REGISTRATION_NO,
        PA.APP_ID,
        PA.NO_OF_ATTEMPTS,
        CM.CATEGORY_NAME, 
        DM.SITE_DIMENSION,
        PR.BDA_NO,
        AN.NOTIFY_ID 
    FROM 
        PUBLIC_APPLICATION PA,
        CATEGORY_MASTER CM,
        NOTIFICATION_SITE_DETAIL NSD,
        DIMENSION_MASTER DM, 
        PUBLIC_REGISTRATION PR,
        ALLOTMENT_NOTIFICATION AN 
    WHERE 
            PA.NOTIFICATION_NO = ? 
        AND PA.CATEGORY_ID = CM.CATEGORY_ID
        AND PA.REGISTRATION_NO = PR.REGISTRATION_NO
        AND PA.NOTIFICATION_NO = AN.NOTIFICATION_NO
        AND PA.NOTIFY_SITE_ID = PR.NOTIFY_SITE_ID 
        AND PR.NOTIFY_SITE_ID = NSD.NOTIFY_SITE_ID
        AND NSD.DIMENSION_ID  = DM.DIMENSION_ID
        AND NSD.NOTIFY_ID = AN.NOTIFY_ID 
    LIMIT 
        ?, ?
...