Sql-Server
提高查詢標準和性能執行時間
對於我們基於供應商的 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 variable
orProc'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