Sql-Server

提高查詢標準和性能執行時間

  • October 11, 2019

對於我們基於供應商的 SQL 伺服器數據庫之一,他們創建了某些視圖供使用者查詢。由於我是 SQL 查詢的新手,請幫助我了解以下 SQL 格式以及如何在它執行數小時後進一步調整它。我會嘗試複製,但現在,讓我知道以下是否有幫助:-

詢問

SELECT TABLE1.ID   ABC
      TABLE1.COL1 XYZ
      TABLE1.COL2 ASD
      TABLE1.COL3
      TABLE1.COL4
FROM 
      TABLE1,TABLE2,TABLE3

WHERE TABLE2.ID=TABLE1.ID
AND   TABLE2.COLUMN1='Data'
AND   TABLE3.ID=TABLE1.ID
AND   TABLE3.COLUMN2='Value'
AND   TABLE1.COL1=CAST('20190914' as DATE)
AND   DATEPART(hour,TABLE1.COL1) BETWEEEN 1 AND 2

對於 Table1 沒有 CI,我們只有 Unique NON CI 作為 PK

表 2 和表 3 也沒有任何 CI,它們在 ID 和日期時間列上都有唯一的非 CI TABLE1.COL1是一datetime

上述查詢每天分 12 批執行多次,用於between子句中的不同日期範圍,以收集 24 小時之間的數據,如 0-1、1-2、2-3、3-4 …. 21-22,23- 24

有沒有更好的方法來執行上述執行?

謝謝

Clustered Index是必須的。除非我們沒有表結構和它們的描述,否則我們不能說哪一列應該是 CI。

提供每個表中的數據量和預期的輸出量。

DATEPART(hour,TABLE1.COL1) BETWEEEN 1 AND 2不是 SARGAable。

所以你可以重寫查詢如下。總是用parameter而不是硬編碼值來檢查性能。

我的意思是,在現實生活場景中,我們使用local variableor Proc's parameter。所以使用相同的方法測試查詢性能。檢查Parameter Sniffing問題是否可以容忍以及如何將其最小化。如果可以Parameter Sniffing容忍則忽略它。 Option Recompile應該很少使用。

declare @FromDate Datetime=cast(getdate() as date)
declare @FromDatetime=dateadd(hour,1,@FromDate)
declare @ToDatetime=dateadd(hour,2,@FromDate)

SELECT TABLE1.ID   ABC
      TABLE1.COL1 XYZ
      TABLE1.COL2 ASD
      TABLE1.COL3
      TABLE1.COL4
FROM 
      TABLE1 T1
    inner join  TABLE2 T2 on T2.ID=T1.ID
    inner join  TABLE3 T3 on  T3.ID=T1.ID -- try once T3.ID=T2.ID
WHERE 
  T2.COLUMN1='Data'
AND   T3.COLUMN2='Value'
AND   T1.COL1>=@FromDatetime
AND   T1.COL1<=@ToDatetime

或者,

您的結果集中似乎不需要 Table2 和 Table3 列,

所以你可以用這種方式重寫,

SELECT TABLE1.ID   ABC
      TABLE1.COL1 XYZ
      TABLE1.COL2 ASD
      TABLE1.COL3
      TABLE1.COL4
FROM dbo.TABLE1 T1   
WHERE 
exists(select 1 from dbo.TABLE2 T2 
    inner join  dbo.TABLE3 T3 on T3.ID=T2.ID
    where T3.ID=T1.ID and T2.COLUMN1='Data' AND   T3.COLUMN2='Value')
AND   T1.COL1>=@FromDatetime
AND   T1.COL1<=@ToDatetime

引用自:https://dba.stackexchange.com/questions/250713