• SQL Server执行计划那些事儿(2)——查找和扫描


    接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混)。当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下。

    开门见上,直接入题

    在查看执行计划时候,你是否曾经也和我一样,有这样的疑惑呢?查找和扫描究竟是什么,以及他们的在查询性能上有什么区别。下面分享下我的理解。

    扫描和查找是SQL Server从表或索引中读取数据所采用的迭代器,又因为经常在执行计划中看到,因此理解他们之间的区别,对我们优化查询有很重要的意义。

    表扫描是在整张表上进行,而索引扫描是在整个页级上进行处理的,然而索引查找则是在查找谓词上的一个或者几个页上进行,因此他通常情况下,索引查找会有更少的IO开销。

    由于扫描是对整个表中的行或者页,不论是否满足条件,逐一进行的。因此,其查询开销是衡定的,与返回结果集无关。索引查找是在所在谓词的几个页上进行,通常情况下,返回的结果集越多,其开销就会越大。

    然而,通过上面的描述,我们可不能认为,查找就是好的,而扫描就是不好的(因为影响扫描性能的还有并行度),但是在绝大部分情况下,特别是数据量比较大,而返回的结果集比较少时,查找要比扫描有着更好的性能表现,另外也不是所有的扫描都可以优化掉的。

    下面,我们通过例子来认识下,查询和扫描在性能上的区别。

    我们还用SQL Server执行计划那些事儿(1)中的例子(删除之前建立的索引)。

    我们来执行下面的查询

    1.在没有索引的情况下

    select ID ,Amount,Discount,BuyDate from Headers

    select ID ,Amount,Discount,BuyDate from Headers where BuyDate='2008-09-15'

     

    结果:在表扫描的情况下,尽管结果集中,仅一条数据,但是IO开销并没有减少,仍然和返回全部结果集是一样的。

    2.在有索引(非聚集索引,要覆盖返回列,否则会引起RID查找,或者键值查找,这些会在以后的文章中讲述。)

    创建索引

    create  nonclustered index index_headers_buyDate on Headers(BuyDate)
    include (ID ,Amount,Discount)
    go

    select ID ,Amount,Discount,BuyDate from Headers

    select ID ,Amount,Discount,BuyDate from Headers where BuyDate='2008-09-15'

    结果:在索引扫描和索引查找情况下,所用的开销和返回的结果紧密相连

    总结

    1.当表中的数据很少或满足谓词的行比较多时,采用扫描操作比较有效。

    2.如果表中数据量比较大或满足谓词的行较少时,使用扫描将读取更多的页面或执行更多的I/O操作来获取数据,这显而不是最有效的方法.   

    3.查找和扫描相比,查找并不总是好的,扫描也并不是坏的,因为SQL Server可能为该查询分配多个线程(并行度)。

  • 相关阅读:
    框架学习之Struts2 第五节 自定义拦截器
    框架学习之Struts2 第四节 文件上传
    2011_7_23 第三次评审
    框架学习之Struts2 第二节 Action的详解
    框架学习之Struts2 第一节 开发环境的搭建和第一个应用开发
    框架学习之Struts2 第七节 国际化
    关于LookUp的总结
    UML自学手册___事务模式——事务与人、地、物
    css合并外边距详解
    开发中的函数相关
  • 原文地址:https://www.cnblogs.com/mrzl/p/4076249.html
Copyright © 2020-2023  润新知