糟糕的做法 - 优化查询

时间:2014-05-27 20:16:58

标签: sql sql-server

我已经在SQL上工作了大约2年,现在正在进行基本查询(选择和更新语句)。我最近决定开始学习更多关于我一直在写的查询。我购买了培训套件(考试70-461)查询Microsoft SQL Server 2012,在最初的几章中,它提到了一堆关于查询优化和性能的内容。我可能会超越自己,但这总是引起我的兴趣。 在编写自定义报告的查询时,我发现自己在属性中编写了一个Select语句。我读到这对性能很糟糕,我想避免这样做。

这是我尝试为我的查询选择的属性。

  

(LEFT(DATEADD(HOUR, -4,(CAST((Select Table2.Column1 from Table2 where [Text] = N'TextString.' and Table1.Column1 = Table2.Column2) AS Time))),8)) as "End Time"

SELECT
    CAST(TABLE1.column1 AS date) as Date
    , DBO.Table2.column2 AS [Table2 ID]
    , CASE [queueID]
        WHEN 2 THEN N'Scenario 1'
        WHEN 3 THEN N'Scenario 2'
        WHEN 4 THEN N'Scenario 3'
        WHEN 5 THEN N'Scenario 4'
        WHEN 6 THEN N'Scenario 5'
        WHEN 7 THEN N'Scenario 6'
        WHEN 8 THEN N'Scenario 7'
        WHEN 9 THEN N'Scenario 8'
        WHEN 10 THEN N'Scenario 9'
        ELSE N'Scenario 10'
    END AS "Name"
    , RIGHT (Column5,11) as "Number"
    , LEFT (DATEADD(HOUR, -4, (CAST (TABLE1.column1 AS time))),8) as "Start Time"
    , LEFT(DATEADD(HOUR, -4, (CAST((Select TABLE1.column1 from TABLE1 where [Text] = N'TEXT STRING.' and [Table2].column2 = TABLE1.column2) AS Time))),8) as "End Time" 
FROM
    [CcMain].[dbo].[Table2] WITH (NOLOCK)   
    INNER JOIN TABLE1 WITH (NOLOCK)
        ON TABLE1.column2 = [Table2].column2
WHERE
    ([Table2.Column3] =N'8' Or Table2.Column3 is null) 
    AND [Column4] IS NULL 
    AND CAST (StartTime AS date) = DATEADD(day, -1, CONVERT(date, SYSUTCDATETIME(),101))
    AND [Text] = N'TeXT string 2.'
;

1 个答案:

答案 0 :(得分:1)

看起来您正在使用子查询来进行连接。最好将其写为Table1 JOIN Table2 ON TAble1.Column1 = Table2.Column2。

然而,这并不意味着你永远不应该在子查询中做SELECT。相反,你应该在不必要时避开它们。