-
对查询进行优化,应尽可能避免进行全面扫描,首要考虑在where及order by所涉及列上创建索引。
-
避免在where子句中对字段进行空值判断,应避免在where子句中使用!=或<>运算符,应避免在where子句中使用or来连接条件,因为这些查询会导致引擎放弃使用索引而进行全表扫描。
-
对于in和not in也应谨慎使用,否则可能会导致全表扫描。
-
在SELECT子句中避免使用‘*’:
-
尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT,这样程序的性能得到提升,需求也会因为COMMIT所释放的资源而减少,COMMIT所释放的资源包括:
a. 回滚段上用于恢复数据的信息。
b. 被程序语句获得的锁。
c. redo log buffer中的空间。
d. Oracle为管理上述3种资源而进行的内部开销。
-
通过内置函数提升SQL效率
-
避免在where子句中使用参数,对字段进行表达式操作,对字段进行函数操作,“=”左边进行函数、算术运算或其他表达式运算,因为这些操作会导致引擎放弃使用索引而进行全表扫描。
-
尽量避免使用游标
-
删除重复记录
SQL数据库查询的优化
-
使用合理的表结构,尽量减少表关联,有时宁愿多占用一些空间,存储一些在其他表中重复的字段。
-
合理使用索引。
-
使用存储过程。
-
注意SQL语句的书写。针对“自下而上”解析的数据库系统,将关键性语句条件(如主键、索引、确定的值等)放置在后面。反之,放置在前面。例如,在SQLSERVER数据库中,你应该将首先去除大部分记录的条件放置在where的前面部分。
举例:
假设主键为key;创建日期为c_date,你的条件中包含对key和c_date的范围查询,那么你应当写成:
where
key >= from_key and key <= to_key and
c_date >= from_date and c_date <= to_date
而不应该写成:
where
key and c_date >= from_date and c_date <= to_date and
= from_key and key <= to_key
它们的速度是不一样的。
以上几点都将提高查询速度!
第二次回答:
有人对第三条“使用存储过程”提高效率有异议,那么请问,你认为存储过程除了可以完成复杂的判断和较复杂的运算、集中控制之外的主要作用是什么?
在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可以极大地提升SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
任何一个设计良好的数据库应用程序都应当尽可能地使用存储过程。
我提到的以上几点,是针对入门者而言,也是比较容易做到的,对于要深入研究这个问题的,那么这些远远不够,但是,做好这些,可以将速度提高一大截了。