0

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

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

也许它有数十万行。然后说,我需要从该列中提取不同的值。SELECT我可以在with中轻松做到这一点DISTINCT,但我想知道性能?

我还可以给 Column1 中的每个项目一个 id,然后创建一个由 Column1 引用的新表(以便更适当地规范化它)。但是,这增加了插入的复杂性,并增加joins了其他可能的查询。

有什么方法可以只索引列中的不同值,还是规范化是唯一的方法?

4

1 回答 1

1

column1 上的索引将大大加快不同的处理,但如果您愿意在插入/更新/删除期间交换一些空间和一些(短)时间,则可以诉诸物化视图。这是索引视图,您可以将其视为按照视图定义生成和维护的动态表。

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)

(不要忘记执行注释创建索引命令。我通常这样做,以便视图定义包含索引定义,提醒我在需要更改视图时应用它。)

当你想使用它时,一定要添加noexpand 提示来强制使用物化数据(这部分对我来说仍然很神秘 - 作为性能增强创建的东西默认情况下没有打开,而是在现场激活)。

select *
  from view1 (noexpand)
于 2012-08-31T10:06:00.597 回答