我有一个2亿个记录静态人口统计表,有230列。没有索引也没有任何唯一的单独列。
此表包含ZIP (varchar(5))
和STREET NUMBER (varchar(10))
列,几乎可用于此表的所有联接。
永远不会成为Where子句,因为此表用作匹配的'针对单个客户端表的平台。客户端表可以是20K到300万行,也可以是ZIP和Street编号列。因此,我的联接至少包括:ZIP = ZIP
和STREET_NO = STREET_NO
。还会有其他连接条件,但它们将使用函数等模糊匹配。 SELECT
子句将是动态的,并且将包含任意数量的列,因此覆盖索引看起来并不实用。
我可以自由地在海量表上添加索引。到目前为止,我添加了ID身份主键,给我一个Clustered Index。然后我在(ZIP,STREET NO)上添加了非聚集索引。
但是,我不确定代理键上的Clustered索引是否必要,因为这是静态数据。
我是否可能更好地制作聚集索引(ZIP,STREET NO),因为永远不会有Where子句,这是一个JOIN问题?我每次运行查询时都会看到当前聚簇ID列上的大量书签查找(占执行计划中80%的执行时间),并认为这可能是可疑的。
感谢您的回复。
答案 0 :(得分:0)
在您决定是否应该拥有聚簇索引或非聚簇索引之前,请测试将访问该表的所有可能类型的查询。您可能还想考虑在外键列和用于搜索参数的列以及用于分组和排序的列上构建索引。在测试可能的索引时,请确保包含所有数据修改操作。
因此运行查询并让SQL Server Optimizer完成它的工作!他会告诉你你需要做什么(在哪里创建索引以及使用什么类型)以使你的查询更快。