我在(int)Inventory_Break
上分区了表。IR_ID
我还在表上创建了一个非聚集索引IR_ID
。
当我运行以下命令时:
SELECT *
FROM dbo.INVENTORY_BREAK
WHERE IR_ID IN ( 100, 101, 102 )
我得到以下执行计划:
它声明了表扫描 (HEAP)。不太清楚它在分区表的上下文中意味着什么。我也没有看到它使用任何类型的索引。然而,它必须,因为查询返回相当快(例如,表有 600 万行)。
所以,我的问题是:
- 表扫描 (HEAP) 对分区表意味着什么?
- 它是否确实使用了索引,也许是在幕后?
- 我需要做些什么来提高效率吗?
该查询确实进行了分区消除。
如果您查看工具提示,Actual Partition Count 显示为 3,这意味着它触及了 3 个分区。(Seek Predicate 部分也证实了这一点。)
它之所以显示为表扫描,是因为它是具有分区消除的表扫描。我不知道该怎么解释。
没有为此使用索引。表分区在数据库内部结构中比索引更深入地实现,因此分区消除本质上非常有效(给定一个合适的谓词,您提供了)。
也就是说,您给出的谓词仅适用于分区消除,并且(很可能)不太适合,因为它不是很有选择性。如果需要这些分区中的所有行,这已经接近最佳解决方案——通常建议创建有用的聚集索引。