我想知道数据库将如何存储多列聚簇索引表。
E.g。
我有一张这样的表:
product area price date
Wood NewYork 20 20111102
Iron NewYork 155 20111102
Stone NewYork 33 20111102
Wood Boston 21 20111102
Iron Boston 150 20111102
Stone Boston 30 20111102
Wood NewYork 19 20111101
Iron NewYork 165 20111101
Stone NewYork 32 20111101
Wood Boston 22 20111101
Iron Boston 159 20111101
Stone Boston 34 20111101
我的大部分疑问都是为了获得某一特定产品的平均价格。主键设置为(product, area, date)
,此主键上有聚簇索引。
问题1.
数据库将如何物理存储此数据?如果在(product, area, date)
的序列中,它可能看起来像
product area price date
Wood NewYork .. 20111102
Wood Boston .. 20111102
Wood ... .. 20111101
Wood ... .. 20111101
Iron NewYork 50 20111102
Iron Boston 30 20111102
Stone NewYork 19 20111101
Stone Boston 165 20111101
但如果按日期排序物理记录会不会更快,那么DB可以用较少的磁盘操作加载行?如果是这种情况,我是否可以控制订购?
问题2。 聚簇索引似乎不会为查询提供性能优势。在日期添加非聚集索引后,对于大多数查询,速度为1秒(当日期没有索引时为50秒)。为什么会有这么大的差异?
答案 0 :(得分:3)
群集索引定义了物理顺序,所以在你的情况下,你有
product area price date
Iron Boston 30 20111102
Iron NewYork 50 20111102
Stone Boston 165 20111101
Stone NewYork 19 20111101
Wood Boston .. 20111102
Wood NewYork .. 20111102
等等。如果您总是选择这三列,那么这是一个很棒的索引如果 - 如果您始终选择product
,area
和date
。但是,如果仅选择date
,则此索引不可以帮助您 - 只有在使用/指定n个最左侧列时才会使用复合索引;此处的此索引可用于product
,product
和area
,或全部三列 - 但不适用于任何其他列。
根据您的需要,您也可以
将非群集主键放在(product, area, date
)上(如果这是唯一的列组合,以使您的行唯一) - 或者考虑代理{ {1}}列简化此
将群集索引放在例如(INT IDENTITY
)这样您就可以按照查询所需的方式订购更多数据