2

我希望你能分享你的时间来帮助我。

目前,我正在使用 3 个表来比较获取数据的性能。这 3 个表具有相同的列(LocInvID、ActivityDate、ItemID、StoreID、CustomerID)、相同的数据(大约 1300 万条记录):

  1. 表 LocInv1:在 LocInvID 处使用聚集索引(它也是主键)。使用 ActivityDate 的分区表。并且 3 列(ItemID、StoreID、CustomerID)是非聚集索引。

  2. 表 LocInv2:在 LocInvID 处使用聚集索引(它也是主键)。不使用分区表

  3. 表 LocInv3:在 LocInvID 处使用聚集索引(它也是主键)。并且 3 列(ItemID、StoreID、CustomerID)是非聚集索引。不使用分区表

    创建非聚集索引 [IX_LocInv3] ON [LocInv3] ( [ItemID] ASC ,[StoreID] ASC , [CustomerID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE =关闭,ALLOW_ROW_LOCKS = 开启,ALLOW_PAGE_LOCKS = 开启)开启 [PRIMARY] 开始

当我运行这个查询字符串时(在 3 个表中)

select ActivityDate,ItemID,StoreID,CustomerID from LocInv1 WITH (INDEX(IX_LocInv))  where ItemID=43 
select ActivityDate,ItemID,StoreID,CustomerID from LocInv2 where ItemID=43 
select ActivityDate,ItemID,StoreID,CustomerID from LocInv3 where ItemID=43

结果很奇怪:

  1. 表 LocInv1 变得最慢。可能吗?我的查询字符串不正确?

  2. 表 LocInv3 使用非聚集索引,但在实际执行计划中,它是聚集索引扫描。我不明白,我用ItemID查询,为什么是Clustered Index Scan?

  3. Table LocInv2 仅对 LocInvID 使用聚集索引,但它得到了最快的结果。这是对的吗?

请指教。

谢谢。

4

1 回答 1

0

查询优化器选择了他能找到的快速方法,不仅取决于索引,还取决于它们包含的数据。

通过聚集索引进行搜索通常更快,但在某些情况下这样做会更快,您可以测试它删除并再次放置索引。

更不用说,根据表遭受的操作(插入、更新、删除)和延迟索引插入也会影响搜索。

这些更改将改变索引的存储方式,具体取决于您可能拥有多页索引的事物的大小。

如果您可以在这些表中发布一个数据插入脚本,我会看起来更好。如果您只进行了查询分析器测试 (ctrl+l),它不应该是 100% 准确的

于 2012-08-21T12:53:38.093 回答