Index
如何判斷 Azure SQL DW 是否使用二級索引?
使用 Azure SQL DW,我在表中的單個列上創建了一個二級索引,但我不確定我的查詢是否曾經使用過該索引。性能仍然很慢,但我正在搜尋大約 70 億行數據。
我的桌子基本上是:
CREATE TABLE FactBusinessEvent ( [EmailAddress] [nvarchar](200) NOT NULL, [EventDate] [datetime] NOT NULL, [EventDate_key] [int] NOT NULL, -- OTHER COLUMNS HERE ) WITH ( DISTRIBUTION = HASH ( [EmailAddress] ), CLUSTERED COLUMNSTORE INDEX ); CREATE INDEX IX_FactBusinessEvent_EmailAddress ON FactBusinessEvent ( EmailAddress ASC );
我的查詢是:
SELECT * FROM FactBusinessEvent WHERE EmailAddress = 'test@test.com'
使用 SSMS 17.6,我可以顯示估計的查詢計劃,它完全忽略了二級索引,顯示了
Get
表中的一個。我似乎無法在 SQL DW 中使用提示,那麼還有什麼可以嘗試的嗎?感謝您的任何見解。
由於您選擇在 上散列分佈您的表
EmailAddress
,這意味著具有相同值的所有電子郵件地址最終將具有相同的散列,因此具有相同的分佈 - 其中 SQL DW 始終具有分佈在多個節點上的 60 個分佈。因此,您不會充分利用可用的計算。話雖如此,您能否確認您正在執行的 DWU、與您正在執行的使用者相關聯的資源類以及您已創建相關統計資訊(即在電子郵件上)?
查看您的二級索引,它僅包含一列,因此最適合僅包含該列的查詢或小型點查找(假設 SQL DW 的行為方式與 SQL Server 類似,這不一定是真的) . 即使這樣做了,它也必須從主列儲存索引中獲取其他列來為您的
SELECT *
.看看這篇文章關於散列分佈大表的建議: https ://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-best-practices#hash-distribute-大桌子
如果這是您的關鍵業務查詢之一,您可以考慮使用不同的雜湊列,甚至嘗試循環分配。例如,這是你加入的嗎?在這個簡單的範例中,我使用 ROUND_ROBIN 分佈創建表的副本並針對該表執行查詢:
CREATE TABLE FactBusinessEvent_rr WITH ( DISTRIBUTION = ROUND_ROBIN, CLUSTERED COLUMNSTORE INDEX ) AS SELECT * FROM dbo.FactBusinessEvent; GO -- Create the required statistics CREATE STATISTICS _st_FactBusinessEvent_Email_rr ON dbo.FactBusinessEvent_rr ( EmailAddress ); -- other stats here, ie columns you will join on, use in WHERE clause, or aggregate on -- ... GO SELECT * FROM dbo.FactBusinessEvent_rr WHERE EmailAddress = 'test@test.com' OPTION ( LABEL = 'email round robin query' );