优化sql 语句的几种方式

原创 2015年11月17日 18:10:25


1、 首先要搞明白什么叫执行计划?

执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式。

可见,执行计划并不是固定的,它是“个性化的”。产生一个正确的“执行计划”有两点很重要:

(1)    SQL语句是否清晰地告诉查询优化器它想干什么?

(2)    查询优化器得到的数据库统计信息是否是最新的、正确的?

2、 统一SQL语句的写法:否则数据库会进行两次解析

3、 不要把SQL语句写得太复杂:以来,一旦解析失败,就得重新再来,二来,数据库有时会不能识别

4、 绑定变量窥测,就想hibernate 的hql语句一样, :原因:一次解析,多次使用、

5.只在必要的情况下才使用begin tran :因为启动事物期间,会全盘锁住sql语句所占用的表的字段

聚集索引没有建在表的顺序字段上,该表容易发生页分裂





在sqlserver 上

3、SQL Server 表连接的三种方式

(1) Merge Join

(2) Nested Loop Join

(3) Hash Join

SQL Server 2000只有一种join方式——Nested Loop Join,如果A结果集较小,那就默认作为外表,A中每条记录都要去B中扫描一遍,实际扫过的行数相当于A结果集行数x B结果集行数。所以如果两个结果集都很大,那Join的结果很糟糕。

SQL Server 2005新增了Merge Join,如果A表和B表的连接字段正好是聚集索引所在字段,那么表的顺序已经排好,只要两边拼上去就行了,这种join的开销相当于A表的结果集行数加上B表的结果集行数,一个是加,一个是乘,可见merge join 的效果要比Nested Loop Join好多了。

如果连接的字段上没有索引,那SQL2000的效率是相当低的,而SQL2005提供了Hash join,相当于临时给A,B表的结果集加上索引,因此SQL2005的效率比SQL2000有很大提高,我认为,这是一个重要的原因。

总结一下,在表连接时要注意以下几点:

(1)    连接字段尽量选择聚集索引所在的字段

(2)    仔细考虑where条件,尽量减小A、B表的结果集

(3)    如果很多join的连接字段都缺少索引,而你还在用SQL Server 2000,赶紧升级吧。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

常见sql语句效率优化方式

数据库sql优化

SQL语句优化方法

1.1    注释使用 在语句中多写注释,注释不影响SQL语句的执行效率。增加代码的可读性。 1.2    对于事务的使用 尽量使事务处理达到最短,如果事务太长最好按功能将事务分开执行(如:...

Java类之间的关联关系

Java类之间的关联关系 UML类图中的关系分为四种:泛化、依赖、关联、实现;关联关系又可以细化为聚合和组合。 一、泛化(Generalization) 泛化是父类和子类之间的关系,子类继承父类...

SQL语句优化方案

 1. 高效地进行SQL语句设计: 通常情况下,可以采用下面的方法优化SQL对数据操作的表现: (1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可...

mybatis 构建SqlSessionFactory的几种方式 以及调用sql映射语句的几种方式

/****************************************************************/ >mybatis构造SqlSessionFactory的方式 /*...

SQL SERVER 的SQL语句优化方式小结

在数据库应用系统中编写可执行的SQL语句可以有多种方式实现,但哪一条是最佳方案却难以确定。为了解决这一问题,有必要对SQL实施优化。简单地说,SQL语句的优化就是将性能低下的SQL语句转换成达到同样目...

myBatis中的语句映射几种特别方式

对于myBatis中的高级映射通常会使用resultMap参数,而非使用resultType参数,虽然对于大多数的查询来说resultType会更常用,其实这两种方式都是比较好使用的,只通常来说,当配...

以指针方式访问数组几种不同形式输出语句解析

以指针方式访问数组几种不同形式输出语句解析下面用一个实例来分析此问题,在如下代码中:#include using namespace std; int main() { int a[]={1,...

几种常用数据库 分页查询的sql语句和简单分析

sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 totalRecouds 表中的总记录数 se...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)