【问题标题】:SQL inner joins with table alias' - Can I optimize this query?SQL 内连接与表别名' - 我可以优化这个查询吗?
【发布时间】:2012-09-22 16:28:06
【问题描述】:

我正在查看 SSMS 工具执行计划分析器,它说尝试将其分解成更小的块。以下查询是我可以做“这个”的最佳方式吗?非常感谢任何帮助!

SELECT t1.ID,
t1.col2,
t1.col3,
t1.col4,
t2.ID AS table2ID,
t2.col2,
t1.col5,
t1.col6,
t2.StatusID as table2StatusID
CASE WHEN LEN(t2.ErrorMessage) > 0 THEN t3.StatusName + ' ' + t2.ErrorMessage 
             ELSE t3.StatusName
     END AS SomeStatus,
     t3.StatusTypeID AS StatusTypeID
FROM table1 t1
INNER JOIN table2 t2 ON t1.ID = t2.ID
INNER JOIN table3 t3 ON t2.StatusID = t3.StatusID`

【问题讨论】:

  • 你试图分解成更小块的“它”到底是什么?
  • “它”是我想的整个查询。我是 SQL 新手,执行计划分析器说要将此查询分成更小的块,并且可能使用临时表。
  • 我正在尝试优化查询运行的速度

标签: sql query-optimization inner-join


【解决方案1】:

查询看起来很简单。我的一个建议是,如果您可以将 t2.ErrorMessage 更改为 null(如果它不存在),那么您可以使用 IsNull 与 CASE 更有效。

【讨论】:

    【解决方案2】:

    您可以使用 ISNULL() 替换您的案例,这可能会降低每行处理成本。

    t3.StatusName + ISNULL(' ' + t2.ErrorMessage, '') as SomeStatus
    

    如果不了解您的架构设置,就很难判断可以在哪里进行优化。可能是直观的优化可能会违背业务逻辑并且毫无用处。另一种选择是正确的,在不了解业务逻辑的情况下获取不明显的数据可能有一些捷径。

    【讨论】:

    • 感谢您的建议!我刚开始在一家公司工作,并不愿透露任何真正的东西,所以我尽量保持非常具体,但我同意你的观点,知道更多会有所帮助哈哈。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多