sql - 我可以通过在列 x 上创建索引来优化 SELECT DISTINCT x FROM hugeTable 查询吗?

标签 sql sql-server-2005 tsql indexing query-optimization

我有一个巨大的表格,在某些列 x 上有更少数量的不同值(按数量级) .

我需要做一个类似 SELECT DISTINCT x FROM hugeTable 的查询,而且我想相对较快地执行此操作。

我做了类似 CREATE INDEX hugeTable_by_x ON hugeTable(x) 的事情,但由于某种原因,即使输出很小,查询执行也没有那么快。查询计划显示97%的时间都花在了hugeTable_by_x的Index Scan上。 ,估计的行数等于整个表的大小。紧随其后的是哈希匹配操作等。

因为我在列 x 上创建了一个索引,我不能指望这个查询运行得非常快吗?

请注意,我使用的是 Microsoft SQL Server 2005。

最佳答案

这很可能不是索引的问题,而是数据设计的问题。规范化,准确地说。您需要查询字段的不同值,甚至愿意添加索引,这一事实强烈表明该字段应该被规范化为具有(小)连接键的单独表。然后通过扫描小得多的查找外部表,不同的值将立即可用。

更新
作为解决方法,您可以创建一个 indexed view在“不同”字段的聚合上。 COUNT_BIG 是索引 View 中允许的聚合:

create view vwDistinct
with schemabinding
as select x, count_big(*)
from schema.hugetable
group by x;

create clustered index cdxDistinct on vwDistinct(x);

select x from vwDistinct with (noexpand);

关于sql - 我可以通过在列 x 上创建索引来优化 SELECT DISTINCT x FROM hugeTable 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973850/

相关文章:

c# - 错误消息 : "Only primitive types or enumeration types are supported in this context."

asp.net - Web.config 身份验证错误

sql-server - 声明标量变量存储过程

sql-server - 如何从文件路径中提取文件名

mysql - 简单的MYSQL不同选择

SQL更新工作无法插入

php - 如果输入有 html,则清理用户输入

sql - T-SQL 将来自不同行中最大长度列的行分组(?)

sql-server - 在 having 子句中使用 count 没有返回行

sql-server - 当在同一条语句中多次调用同一UDF时,它将被调用多少次?