再谈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语句怎么去执行,是经过分析之后决定的。通俗的将同一个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到底是怎么去执行的。