大表上的独特性能

时间:2012-08-30 15:56:02

标签: sql-server-2008-r2

假设我有一个包含重复列的表,例如

Column1
---------
    a
    a
    a
    a
    b
    a
    c
    d
    e
    ... so on

也许它有数十万行。然后说,我需要从此列中提取不同的值。我可以使用SELECTDISTINCT轻松完成,但我对性能感到疑惑?

我还可以为Column1中的每个项目赋予一个id,然后创建一个由Column1引用的新表(以更恰当地规范化它)。但是,这会增加制作插入内容的复杂性,并在joins中添加其他可能的查询。

是否有某种方法可以仅对列中的不同值进行索引,还是规范化的唯一方法?

1 个答案:

答案 0 :(得分:1)

column1上的索引将大大加快distinct的处理速度,但如果您愿意在插入/更新/删除期间交换一些空间和一些(短)时间,则可以使用materialized view。这是一个索引视图,您可以将其视为在视图定义之后生成和维护的动态表。

create view view1
with schemabinding
as
   select column1, 
          count_big(*) cnt
     from theTable
    group by column1
-- create unique clustered index ix_view1 on view1(column1)

(不要忘记执行注释的create index命令。我通常这样做,以便视图定义包含索引定义,如果我需要更改视图,请提醒我应用它。)

当你想使用它时一定要添加noexpand hint来强制使用物化数据(这部分内容对我来说仍然是个蠢事 - 因为默认情况下性能增强没有打开,而是现场激活)。

select *
  from view1 (noexpand)