谁能告诉我如何优化查询?
Posted
技术标签:
【中文标题】谁能告诉我如何优化查询?【英文标题】:Can anybody please tell me how to optimize query? 【发布时间】:2020-11-27 23:39:12 【问题描述】:我在下面有这个查询,我正在做很多子查询。这是一个好方法吗?如果没有,请告诉我如何以更好的方式编写/优化此查询?我正在尝试学习如何更好地优化查询。请指出正确的方向。
SELECT DISTINCT
cases.case_sk
, cases.case_number
, cases.lawtype_code
, cases.closed_ind
, cases.date_received
, cases.[style]
, COALESCE ((select initials from employee where employee_sk=cases.atty1_sk),'') as 'Atty1'
, COALESCE ((select initials from employee where employee_sk=cases.atty2_sk),'') as 'Atty2'
, (select description from group_items where item_sk =case_parties.role_sk) as 'Role'
, COALESCE ((select description from group_items where item_sk =case_pick.item_sk ),'') as 'Case Type'
FROM cases
LEFT JOIN case_parties
on case_parties.case_sk =cases.case_sk
and case_parties.role_sk in (select item_sk from group_items where group_code='ROLES' /*and item_sk='1312'*/)
LEFT JOIN case_pick
on case_pick.case_sk = cases.case_sk
and group_code='CTYPE'
样本数据 谢谢
【问题讨论】:
我会使用连接而不是子查询,它更容易调试和理解,而且在某些情况下,您可以减少从表中获取/读取的次数,如果您可以提供示例数据和所需的输出它可以更容易地帮助你。 @eshirvana,我明白了。我还添加了一个示例数据图像。谢谢 优化查询通常从实际执行计划开始。从那里您可以推测出哪些索引可能适合提高性能。请参阅paste the plan,了解在您的问题中包含执行计划的方法。提示:为了提高可维护性,对 所有 列引用使用表别名,即使在子查询中也是如此。 【参考方案1】:试试这个...
您可以通过使用 CTE
来达到同样的效果;WITH CTE_case_parties AS( SELECT *
FROM case_parties
INNER JOIN group_items ON case_parties.role_sk =item_sk
where group_code='ROLES')
SELECT DISTINCT
cases.case_sk
, cases.case_number
, cases.lawtype_code
, cases.closed_ind
, cases.date_received
, cases.[style]
, CASE WHEN employee_sk=cases.atty1_sk THEN initials ELSE'' END as 'Atty1'
, CASE WHEN employee_sk=cases.atty2_sk THEN initials ELSE'' END as 'Atty2'
, CASE WHEN item_sk =case_parties.role_sk THEN description END as 'Role'
, CASE WHEN item_sk =case_pick.item_sk THEN description ELSE'' END as 'Case Type'
FROM cases
LEFT JOIN CTE_case_parties on case_parties.case_sk =cases.case_sk
LEFT JOIN case_pic on case_pick.case_sk = cases.case_sk and group_code='CTYPE'
CROSS JOIN employee E
CROSS JOIN group_items G
【讨论】:
您的答案中似乎没有 CTE,并且子查询完全没有必要,即您可以使用... cross join Employee as E cross join Group_Items as G;
。我很好奇查询优化器是否解决了case
表达式以限制交叉连接,或者它是否只是通过它。
@HABO 我现在编辑了代码,请现在检查.....以上是关于谁能告诉我如何优化查询?的主要内容,如果未能解决你的问题,请参考以下文章