zoukankan      html  css  js  c++  java
  • 再谈sql查询优化

    再谈数据库查询优化相关
    前提:抛开机器性能,也抛弃程序本身,只谈数据库本身,只谈查询语句。
    首先,对很多问题大家都有自己的认识,现在请大家暂时忘记全部,从零开始吧,因为有些思想已经根深蒂固,不要一开始就抱着否定的态度、否定的心态去学习,而是去抱着学习的态度去学习。

    根本:任何数据库都有自己的查询分析优化器(这个名称不对),你的sql语句怎么去执行,是经过分析之后决定的。通俗的将同一个sql语句,在不同的环境下它的执行是不一样的,不是绝对的。这点不容质疑。
    索引能加快数据搜索速度,有很多的帖子告诉大家哪些情况应该建立索引以及怎么建立索引。问题来了,是不是有索引就一定能加快数据的访问速度呢?在查询的时候一定会使用索引呢?答案是否定的。
    先假设大家使用默认的数据库查询条件,即不去干扰数据库的查询优化选择器。
    存在索引,在查询的时候并不一定使用索引去查询。优化器决定采取什么方式去查询。
    举例说明:
    A(ID int identity(1,1),name varchar(10)),在字段ID上建立聚集索引,随便插入10条数据。例如查ID=2的数据。
    在执行计划中大家会惊奇的发现查询时使用的table scan(表扫描),并没有使用index seek(具体索引查找),而这个表是有聚集索引的。原因是因为这个表的数据量太少,使用索引查询会比较浪费时间。使用索引会增加逻辑读取(在消息中可以看到 set statistics io on)
    大家在分析查询语句的时候,最好结合数据库的执行计划(ctrl+L)与io(set statistics io on )开销在一起来分析。
    查询最消耗的是IO开销。在查询时可以指定查询优化选择器使用哪个索引,这个是可以指定的(index)。因为这其中也存在不好的地方,数据库本身不是最优的。
    总结,查询方式是由数据库选择的,数据库采取它认为最佳的执行路径。具体问题具体分析。多看执行执行,多看IO消息,就知道sql到底是怎么去执行的。
  • 相关阅读:
    经典SQL例题
    truncate,delete,drop的异同点
    scp 在不同主机之间数据传输
    自定义标签库
    servlet 学习
    HTTP协议 学习
    Tomcat服务器的数字证书 HTTPS 连接!
    JSP开发 路径问题汇总
    java 文件上传 下载 总结
    myeclipse 出现换行符和空格符 解决方案 换行出现乱码
  • 原文地址:https://www.cnblogs.com/lucika/p/1555800.html
Copyright © 2011-2022 走看看