假设我有一个包含重复列的表,例如
Column1
---------
a
a
a
a
b
a
c
d
e
... so on
也许它有数十万行。然后说,我需要从此列中提取不同的值。我可以使用SELECT
在DISTINCT
轻松完成,但我对性能感到疑惑?
我还可以为Column1中的每个项目赋予一个id,然后创建一个由Column1引用的新表(以更恰当地规范化它)。但是,这会增加制作插入内容的复杂性,并在joins
中添加其他可能的查询。
是否有某种方法可以仅对列中的不同值进行索引,还是规范化的唯一方法?
答案 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)