我有一个带有许多左连接的SQL查询
SELECT COUNT(DISTINCT po.o_id)
FROM T_PROPOSAL_INFO po
LEFT JOIN T_PLAN_TYPE tp ON tp.plan_type_id = po.Plan_Type_Fk
LEFT JOIN T_PRODUCT_TYPE pt ON pt.PRODUCT_TYPE_ID = po.cust_product_type_fk
LEFT JOIN T_PROPOSAL_TYPE prt ON prt.PROPTYPE_ID = po.proposal_type_fk
LEFT JOIN T_BUSINESS_SOURCE bs ON bs.BUSINESS_SOURCE_ID = po.CONT_AGT_BRK_CHANNEL_FK
LEFT JOIN T_USER ur ON ur.Id = po.user_id_fk
LEFT JOIN T_ROLES ro ON ur.roleid_fk = ro.Role_Id
LEFT JOIN T_UNDERWRITING_DECISION und ON und.O_Id = po.decision_id_fk
LEFT JOIN T_STATUS st ON st.STATUS_ID = po.piv_uw_status_fk
LEFT OUTER JOIN T_MEMBER_INFO mi ON mi.proposal_info_fk = po.O_ID
WHERE 1 = 1
AND po.CUST_APP_NO LIKE '%100010233976%'
AND 1 = 1
AND po.IS_STP <> 1
AND po.PIV_UW_STATUS_FK != 10
性能似乎不好,我想优化查询。
有什么建议吗?
答案 0 :(得分:1)
试试这个 -
SELECT COUNT(DISTINCT po.o_id)
FROM T_PROPOSAL_INFO po
WHERE PO.CUST_APP_NO LIKE '%100010233976%'
AND PO.IS_STP <> 1
AND po.PIV_UW_STATUS_FK != 10
答案 1 :(得分:0)
首先,检查索引。他们老了吗?他们变得支离破碎吗?他们需要重建吗?
然后,检查您的“执行计划”(因SQL引擎而异):是否正确理解了所有连接?有些人“乱序”吗?他们中的一些人传输了太多数据吗?
然后,检查您的计划和索引:是否涵盖了所有重要的列?是否有任何非常冗长的表扫描或连接?索引中的列是否与查询一致?
然后,修改您的查询: - 你能提取一些通常会快速生成小行集的部分吗? - 您可以向索引添加新列,以便加入/过滤表达式吗? - 或者重新排序它们以便它们更好地匹配查询?
并支持@Devart的解决方案:
你能在途中消除一些桌子吗? where
是否触及其他表格?其他表中的数据是否会显着修改count
?如果SELECT和WHERE都不会触及其他连接列,并且COUNT
精确值不重要(即does that T_PROPOSAL_INFO exist?
),那么您可以完全删除所有连接,如Devart建议的那样。 LEFTJOIN永远不会减少行数。它们只复制/扩展/乘以行。