Index

如何判斷 Azure SQL DW 是否使用二級索引?

  • May 11, 2018

使用 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' );

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