我有这些简单的表,一个没有索引,另一个只有主键和 id 上的聚集索引:
CREATE TABLE [dbo].[MyTableWithoutPk]([id] [int] NOT NULL, [category_id] int NULL)
CREATE TABLE [dbo].[MyTableWithPk] ([id] [int] NOT NULL, [category_id] int NULL,
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED ([id] ASC))
如果我使用 WHERE 子句执行此查询,我会如预期得到表扫描:
SELECT * FROM [dbo].[MyTableWithoutPk] where [category_id] = 100
如果我对 MyTableWithPk 执行相同的查询,我仍然期望进行表扫描,因为在 Category_id 上没有索引。但我得到了聚集索引扫描!
SELECT * FROM [dbo].[MyTableWithPk] where [category_id] = 100
我错过了什么?
我还检查了SQL中的表扫描和索引扫描,它还说:“如果category_id上没有索引,则将执行表扫描”
在 SQL Server 中,
Clustered Index Scan
和Table Scan
都是读取整个数据集的操作,但它们根据底层表结构访问数据的方式有所不同。
聚集索引扫描:
表格扫描:
主要区别: