使用 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 = '[email protected]'
使用 SSMS 17.6,我可以显示估计的查询计划,它完全忽略二级索引,显示表中的单个Get
。我似乎无法在 SQL DW 中使用提示,那么还有什么可以尝试的吗?
感谢您的任何见解。
当您选择在 上散列分布您的表时
EmailAddress
,这将意味着具有相同值的所有电子邮件地址最终将具有相同的散列并因此具有相同的分布——其中 SQL DW 始终有 60 个分布分布在多个节点上。因此,您不会充分利用可用的计算能力。话虽如此,您能否确认您在哪个 DWU 上运行,哪个资源类与您运行的用户相关联,以及您是否创建了相关统计信息(即在电子邮件上)?
查看您的二级索引,它仅包含一列,因此最适合仅包含该列的查询或小型点查找(假设 SQL DW 的行为方式与 SQL Server 类似,但不一定如此) . 即使它这样做了,它也必须从主列存储索引中获取其他列来为您的
SELECT *
.查看这篇文章以获取有关散列分布大表的建议: https ://learn.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-best-practices#hash-distribute-大桌子
如果这是您的关键业务查询之一,您可以考虑使用不同的哈希列,甚至可以尝试循环分配。例如,这是你加入的吗?在这个简单的示例中,我使用 ROUND_ROBIN 分布创建表的副本并针对该表运行查询: