优化查询--节省查询时间

优化查询

SELECT * FROM emp2;

1:不要使用 SELECT * ,用具体的字段来代表 *,不要返回用不到的字段。

=======================================================================================

SELECT ename,sal FROM emp2 WHERE ename <> ‘scott’;

SELECT ename,sal FROM emp2 WHERE ename != ‘scott’;

2:尽量避免在where中使用 <> 或 !=,如果使用了将使数据库引擎放弃索引进行全表扫描。

=======================================================================================

SELECT ename,sal,comm FROM emp2 WHERE comm IS NULL;

3:尽量避免在where中对字段进行null判断,否则将使数据库引擎放弃索引进行全表扫描。

UPDATE emp2 SET comm=0 WHERE comm IS NULL;

SELECT ename,sal,comm FROM emp2 WHERE comm=0;

=======================================================================================

SELECT ename,sal,deptno FROM emp2 WHERE deptno=10 OR deptno=20;
应改为
SELECT ename,sal,deptno FROM emp2 WHERE deptno=10
UNION
SELECT ename,sal,deptno FROM emp2 WHERE deptno=20;

4: 应尽量避免在where子句中使用 OR 来连接条件,否则将使数据库引擎放弃索引进行全表扫描。

=======================================================================================

SELECT ename,sal FROM emp2 WHERE ename LIKE ‘%a%’;

SELECT ename,sal FROM emp2 WHERE ename LIKE ‘a%’;

5:一般情况下,不鼓励使用 LIKE 操作。'a%‘可以使用索引,’%a%'将不使用索引。

=======================================================================================

SELECT deptno,ename FROM emp2 WHERE deptno IN (10,20,30);

改为

SELECT deptno,ename FROM emp2 WHERE deptno BETWEEN 10 AND 30;

6:IN 和 NOT IN 也要慎用,否则会导致全表扫描。

=======================================================================================

SELECT ename,deptno,sal FROM emp2 WHERE sal/2=1500;

改为

SELECT ename,deptno,sal FROM emp2 WHERE sal=1500*2;

7:尽量避免在where子句里,对字段进行表达式操作,否则将使数据库引擎放弃索引进行全表扫描。

=======================================================================================

SELECT ename,sal FROM emp2 WHERE SUBSTRING(ename,1,3)=‘sco’;

改为

SELECT ename,sal FROM emp2 WHERE ename LIKE ‘sco%’;

SELECT ename,hiredate FROM emp2 WHERE DATEDIFF(‘1981-9-9’,hiredate) > 0;

改为

SELECT ename,hiredate FROM emp2 WHERE hiredate < ‘1981-9-9’;

8:尽量避免在where子句里,对字段进行函数操作,否则将使数据库引擎放弃索引进行全表扫描。

=======================================================================================

9:不要在where子句的 “=” 左边进行函数。算术运算或其他表达式操作,否则系统将无法正确使用索引。

=======================================================================================

SELECT ename,deptno FROM emp2 WHERE deptno IN (SELECT deptno FROM emp2 );

改为

SELECT ename,deptno FROM emp2 e WHERE EXISTS (SELECT 1 FROM emp2 WHERE deptno= e.deptno);

10: 很多时候用 EXISTS 代替 IN 是一个好的选择。

=======================================================================================

CREATE TABLE emp3
AS
SELECT *
FROM emp
WHERE 1=2;

改为

CREATE TABLE emp3(…)

11:不要写一些没有意义的查询,无返回结果但是会消耗系统资源,

如果要生成一个空的表结构应该直接写建表语句,不用通过查询来建表。

=======================================================================================

12:尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,

字符在查询时会逐一比较,而数字只比较一次。 

=======================================================================================

13 尽可能的使用 VARCHAR/NVARCHAR 代替 CHAR/NCHAR, 空间小查询快。

=======================================================================================

14 避免频繁的创建和删除临时表,以减少系统资源的消耗。

=======================================================================================

15 尽量避免使用游标,因为游标的效率差,如果游标操作的数据超过1万行,那么就应该

考虑改写。

=======================================================================================

16:尽量避免向客户返回大量数据,若数据量过大,应该考虑需求是否合理。

=======================================================================================

索引的使用问题

什么情况下不使用索引

1:表记录太少。

2:经常插入、删除、 修改的表。

3:经常和主字段一块查询但主字段索引值比较多的表字段。

=========================================================

什么情况下使用索引

1:表的主关键字(主键):自动创建了唯一索引;

2:表的字段带唯一约束的:自动创建了唯一索引;

3:直接条件查询的字段

 在SQL中用于条件查询的字段

4:查询中与其他表关联的字段

 如外键关联

5:查询中的排序字段

6:查询中统计或分组的字段

一个表的索引数量 <=6

猜你喜欢

转载自blog.csdn.net/gcyqweasd/article/details/112707010