2

我有一个带有许多左连接的 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

性能似乎不好,我想优化查询。

请问有什么建议吗?

4

2 回答 2

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
于 2013-07-01T06:56:35.207 回答
0

首先,检查您的索引。他们老了吗?他们有没有被支离破碎?他们需要重建吗?

然后,检查您的“执行计划”(取决于 SQL 引擎):是否正确理解所有连接?其中一些“不正常”吗?他们中的一些人是否传输了太多数据?

然后,检查您的计划和索引:是否涵盖了所有重要列?是否有任何异常冗长的表扫描或连接?索引中的列是否与查询按顺序排列?

然后,修改你的查询: - 你能提取一些通常会快速生成小行集的部分吗?- 您可以向索引添加新列,以便覆盖连接/过滤表达式吗?- 或者重新排序它们以便更好地匹配查询?

并且,支持来自@Devart 的解决方案:

你能在途中消除一些桌子吗?是否where触及其他桌子?其他表中的数据是否会count显着修改?如果 SELECT 和 WHERE 都没有触及其他连接的列,并且如果COUNT确切的值不是那么重要(即does that T_PROPOSAL_INFO exist?),那么您可以完全删除所有连接,正如 Devart 建议的那样。LEFTJOIN 永远不会减少行数。他们只复制/扩展/乘以行。

于 2013-07-01T07:19:08.113 回答