SQL语言(在SQL Server也叫做T-SQL)是一个解释性的语言(declarative language), 主要是描述的是人想要从数据库里获取数据的逻辑。但数据库接收到SQL语句后,会根据相关的统计信息制定自己的取数策略(执行计划)。这个执行计划可能是最优的,也可能不是,这时就需要DBA能读懂该执行计划。执行计划的阅读顺序:从右至左,从上到下
数据查询
操作名称 |
描述 |
Table Scan |
表扫描(最慢),对表记录逐行进行检查 |
Clustered Index Scan |
聚集索引扫描(较慢),按聚集索引对记录逐行进行检查 |
Index Scan |
索引扫描(普通),根据索引滤出部分数据在进行逐行检查 |
Index Seek |
索引查找(较快),根据索引定位记录所在位置再取出记录 |
Clustered Index Seek |
聚集索引查找(最快),直接根据聚集索引获取记录 |
- 【 Table Scan 】 没有主键的表查询
SELECT * INTO dbo.SalesOrderDetail FROM AdventureWorks2019.Sales.SalesOrderDetail
select * from SalesOrderDetail
- 【Clustered Index Scan 】有主键的表查询
CREATE CLUSTERED INDEX PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID ON [dbo].[SalesOrderDetail]
( [SalesOrderID] ASC, [SalesOrderDetailID] ASC )
select * from SalesOrderDetail
- 【 Index Scan 】非聚集索引扫描
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20240703-180508] ON [dbo].[SalesOrderDetail]( [ProductID] ASC )
GO
select ProductID from SalesOrderDetail
order by ProductID
- 【 Index Seek 】非聚集索查找
select ProductID,UnitPrice from SalesOrderDetail
where ProductID =750
书签查找:通过非聚集索引找到所求的行,但这个索引并不包含显示的列,因此还要额外去基本表中找到这些列,所以要进行键查找,如果基本表在堆中则Key Lookup会变成RID查找,这两个查找统称为书签查找。
- 【Clustered Index Seek 】聚焦索引查找
select * from SalesOrderDetail
where SalesOrderID = 43659 and SalesOrderDetailID = 10