2010-02-22 2 views
2

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

  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 минут. Может ли кто-нибудь предложить мне написать запрос effiecient, чтобы получить результаты в течение минимального времени.

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

+0

Итак, выполнил ли запрос работу для вас? – DRapp

+0

Он отлично работает и сокращает время от 30 минут до 1 минуты. Большое спасибо – gmhk

ответ

4

Используя «STRAIGHT_JOIN», вы говорите оптимизатору, как вы это говорите. Я переместил Уведомление # в качестве первого предложения 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 
     ?, ? 
+1

хардкор ... блестящий! ;) – pixeline

+0

Позвольте мне попробовать, спасибо за ваше предложение – gmhk

+0

Он отлично работает и сокращает время от 30 минут до 1 минуты. большое спасибо – gmhk