博客
关于我
SQL全表扫描
阅读量:103 次
发布时间:2019-02-26

本文共 1174 字,大约阅读时间需要 3 分钟。

在数据库性能优化的学习过程中,"全表扫描"是一个非常常见的概念。那么,全表扫描到底是什么意思呢?

全表扫描是指数据库在没有索引的情况下,对一张表中的所有记录进行逐一检查的操作。这种扫描方式类似于在数据中逐一"寻找"符合查询条件的记录,直到全部符合条件的数据被读取完毕。

从执行过程来看,全表扫描的核心原理是:数据库服务器会将整个表的所有数据读取出来,然后根据查询条件筛选出符合要求的行数据。这一过程类似于"逐一检查"每一行记录,找到所有满足条件的数据。

需要注意的是,全表扫描的成本与数据块的大小以及数据库的读取方式有关。具体来说,全表扫描的成本可以通过表的数据块总数除以多块读取来计算。这一指标可以帮助我们评估全表扫描的效率。

与索引范围扫描相比,全表扫描的成本是固定的。这意味着,无论查询需要访问一张表的全部数据,还是只需要访问一部分数据,全表扫描都会将整张表的数据全部读取出来。这种特性使得全表扫描在某些场景下成为必要的选择。

那么,全表扫描在什么情况下会被使用呢?

首先,在单表查询场景中,全表扫描可能会被采用。这种情况通常发生在以下情况:

  • 当表的数据量很小,索引的大小甚至比表本身还大时,使用索引进行查询反而可能比直接读取表的全部数据更为"贵"。在这种情况下,全表扫描可能成为更为经济的选择。

  • 当查询所需的数据占表中数据总量的百分比非常高,甚至超过了索引访问的成本时,全表扫描可能会被选用。也就是说,如果我们需要访问的数据量非常大,使用索引可能会导致更多的IO操作,而全表扫描则可以通过一次读取操作来获取所需的所有数据。

  • 在数据库性能优化的角度来看,表中的数据排列方式可能过于"凌乱",这会导致索引的 clustering_factor 很大,从而使得索引的访问成本显著增加。在这种情况下,全表扫描可能会成为更优的选择。

  • 其次,在多表连接场景中,全表扫描也可能被广泛应用。例如:

    • 在 hash join 的场景中,内层表和外层表都可以执行全表扫描。这种情况通常发生在外层表的数据分布非常均匀,而内层表的数据分布较为不均匀时。

    • 在 nest loop 的场景中,外层表通常会执行全表扫描,而内层表一般不会执行全表扫描。这是因为外层表的数据分布较为均匀,可以通过 hash join 来快速定位到内层表中的记录。

    需要注意的是,全表扫描通常并不被推荐用于大型表的查询,因为这可能会导致数据库性能严重下降。相比之下,索引范围扫描通常会被视为更为高效的选择。

    从数据库的执行计划来看,全表扫描通常会被标记为 "INDEX RANGE SCAN"。这一标记反映了数据库在执行查询时,选择了通过索引来实现范围查询的策略。

    总的来说,全表扫描是一个重要的数据库性能优化概念。了解它的工作原理和适用场景,可以帮助我们在实际应用中做出更明智的查询优化决策。

    转载地址:http://lwyy.baihongyu.com/

    你可能感兴趣的文章
    oauth2登录认证之SpringSecurity源码分析
    查看>>
    OAuth2:项目演示-模拟微信授权登录京东
    查看>>
    OA系统多少钱?OA办公系统中的价格选型
    查看>>
    OA系统选型:选择好的工作流引擎
    查看>>
    OA让企业业务流程管理科学有“据”
    查看>>
    OA项目之会议通知(查询&是否参会&反馈详情)
    查看>>
    Vue.js 学习总结(13)—— Vue3 version 计数介绍
    查看>>
    OA项目之我的会议(会议排座&送审)
    查看>>
    OA项目之我的会议(查询)
    查看>>
    OA项目之我的审批(会议查询&会议签字)
    查看>>
    OA项目之项目简介&会议发布
    查看>>
    ObjC的复制操作
    查看>>
    Object c将一个double值转换为时间格式
    查看>>
    object detection之Win10配置
    查看>>
    object detection训练自己数据
    查看>>
    object detection错误Message type "object_detection.protos.SsdFeatureExtractor" has no field named "bat
    查看>>
    object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    查看>>
    object detection错误之no module named nets
    查看>>
    Object of type 'ndarray' is not JSON serializable
    查看>>
    Object Oriented Programming in JavaScript
    查看>>