如何写出高效sql

来源:互联网 发布:交互界面 数据驱动 编辑:程序博客网 时间:2024/06/05 10:11

1.PreparedStatement 一般来说比Statement性能高:一个sql 发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。

2.有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。

3.sql语句全部大写,特别是列名和表名都大写。特别是sql命令的缓存功能,更加需要统一大小写,sql语句发给oracle服务器语法检查和编译成为内部指令缓存和执行指令。根据缓存的特点,不要拼凑条件,而是用?和PreparedStatment  

4. 可以看到,Union和Union All的区别之一在于对重复结果的处理。

   UNION在进行表链接后会筛选掉重复的记录,而UNION ALL只是简单的将两个结果合并后就返回,返回的结果集就会包含重复的数据了。 从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

5.统一sql 的写法[大小写]

6.使用临时表暂存中间结果[避免程序中多次扫描主表,大大的减少了程序中共享锁阻塞更新锁,减少阻塞,提高了并发性能]

7. OLTP系统sql语句必须采用绑定变量

[Select*from order where time>@chgtime]

@chgtime变量可以传入任何值,这样大量的类似查询可以重用该执行计划了,这可以大大降低数据库解析SQL语句的负担。一次解析,多次重用,是提高数据库效率的原则。

8.绑定变量窥测

9.一些SQL查询语句应加上nolock

SQL语句中加nolock是提高SQL Server并发性能的重要手段,在oracle中并不需要这样做,因为oracle的结构更为合理,有undo表空间保存“数据前影”,该数据如果在修改中还未commit,那么你读到的是它修改之前的副本,该副本放在undo表空间中。

(1)    查询的结果用于“插、删、改”的不能加nolock !

(2)    查询的表属于频繁发生页分裂的,慎用nolock !

(3)    使用临时表一样可以保存“数据前影”,起到类似oracle的undo表空间的功能,

能采用临时表提高并发性能的,不要用nolock 。

10.只在必要的情况下才使用begin tran

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

12.使用like进行模糊查询时应注意

模糊查询必然走全表扫描

13.最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.

应尽量避免在 where 子句中使用 != 或 <> 操作符

.应尽量避免在 where 子句中使用 or 来连接条件

原创粉丝点击