查询优化

时间:2010-02-22 17:07:44

标签: sql-server database mysql inner-join

在我的应用程序中,我的模块使用下表

  1. PUBLIC_APPLICATION
  2. CATEGORY_MASTER
  3. NOTIFICATION_SITE_DETAIL
  4. DIMENSION_MASTER DM
  5. PUBLIC_REGISTRATION
  6. ALLOTMENT_NOTIFICATION。
  7. 从下表中我正在检索数据

    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 个答案:

答案 0 :(得分:4)

通过使用“STRAIGHT_JOIN”,您可以告诉优化器按照您的说法执行此操作。 我将Notification#作为第一个WHERE子句移动,因此首先处理它以限制您的设置。然后,我将连接设置为其他表。我之前有过这样的问题,在查询15,000多条记录的数据以加入15个以上的表时,需要20多个小时。通过在我已经形成的查询中添加“STRAIGHT_JOIN”,大约花了2个小时......再次获得了15,000多条记录,并加入了超过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 
        ?, ?