谁能告诉我如何优化查询?

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 我现在编辑了代码,请现在检查.....

以上是关于谁能告诉我如何优化查询?的主要内容,如果未能解决你的问题,请参考以下文章

数据库调优和数据库查询优化有啥区别? [关闭]

Mysql面试题及千万级数据查询优化

如何优化mysql查询

mysql数据库如何优化?谁能给出点具体的解决方案?

mysql查询优化

查询优化或调优