`
mars914
  • 浏览: 433102 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

sql语句优化原则

阅读更多

1.多where,少having

where用来过滤行,having用来过滤组

 

聚合语句:统计分组数据时用,对分组数据再次判断时用having

HAVING子句可以让我们筛选成组后的各组数据.; Y( }; X, \5 m1 O
HAVING子句在聚合后对组记录进行筛选
而WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000

 

 

在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。/

 

优先级:where > 聚合语句 > having

2.多union all,少union

union删除了重复的行,因此花费了一些时间

union只是将两个结果联结起来一起显示(消除了重复行),并不是联结两个表

UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。


3.多Exists,少in
Exists只检查存在性,性能比in强很多,not in 不推荐使用,因为不能应用表的索引,推荐not exists,尽量用exists 代替distinct

有些朋友不会用Exists,就举个例子
例,想要得到有电话号码的人的基本信息,table2有冗余信息

select * from table1;--(id,name,age) 
select * from table2;--(id,phone) 
in: 
select * from table1 t1 where t1.id in (select t2.id from table2 t2 where t1.id=t2.id); 
Exists: 
select * from table1 t1 where Exists (select 1 from table2 t2 where t1.id=t2.id); 

 

 

 

 

用in的朋友注意了,当参数超过1000个,数据库就挂了。(oracle 10g数据库)


4.使用绑定变量
Oracle数据库软件会缓存已经执行的sql语句,复用该语句可以减少执行时间。
复用是有条件的,sql语句必须相同
问:怎样算不同?
答:随便什么不同都算不同,不管什么空格啊,大小写什么的,都是不同的
想要复用语句,建议使用PreparedStatement
将语句写成如下形式:
insert into XXX(pk_id,column1) values(?,?);
update XXX set column1=? where pk_id=?;
delete from XXX where pk_id=?;
select pk_id,column1 from XXX where pk_id=?;

5.少用*

因为要把*解析为列名,这时就查询数据字典,自然就耗费了许多时间。
很多朋友很喜欢用*,比如:select * from XXX;
一般来说,并不需要所有的数据,只需要一些,有的仅仅需要1个2个,
拿5W的数据量,10个属性来测试:
(这里的时间指的是PL/SQL Developer显示所有数据的时间)
使用select * from XXX;平均需要20秒,
使用select column1,column2 from XXX;平均需要12秒
(我的机子不是很好。。。)
对于开发来说,这一条是个灾难,知道是一回事,做就是另一回事了

6.分页sql
一般的分页sql如下所示:
sql1:select * from (select t.*,rownum rn from XXX t)where rn>0 and rn <10;
sql2:select * from (select t.*,rownum rn from XXX t where rownum <10)where rn>0;
乍看一下没什么区别,实际上区别很大...125万条数据测试,
sql1平均需要1.25秒(咋这么准呢? )
sql2平均需要... 0.07秒
原因在于,子查询中,sql2排除了10以外的所有数据
当然了,如果查询最后10条,那效率是一样的 如果有分页需要排序,必须再包一层,结果为
select * from (select t.*, rownum rn from (select * from XXX order by value desc) t where rownum <= 10 ) where rn > 0;


(oracle数据库)


7.能用一句sql,千万别用2句sql
不解释

 

分享到:
评论
2 楼 mars914 2012-08-24  
第3条进一步解释:
1)exists()后面的子查询被称做相关子查询 他是不返回列表的值的.只是返回一个ture或false的结果(这也是为什么子查询里是"select 1"的原因,换成"select 6"完全一样,当然也可以select字段,但是明显效率低些)
其运行方式是先运行主查询一次 再去子查询里查询与其对应的结果 如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询.

2)in()后面的子查询 是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.




1 楼 mars914 2012-05-01  
8、不要在列上进行运算
select * from users where YEAR(adddate)<2007;
将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
select * from users where adddate<‘2007-01-01’;

相关推荐

    SQL语句优化原则.pdf

    具体来说,有几个重要的SQL语句优化原则需要掌握和理解: 1. 判断空值(NULL)与索引的使用。在数据库中,包含NULL值的列不会被索引。因此,在where子句中使用ISNULL或ISNOTNULL条件时,优化器将不会使用索引,而是...

    SQL语句优化原则

    ### SQL语句优化原则 在IT领域中,数据库性能优化是一项极为重要的工作,而SQL查询作为数据检索的主要手段,其优化对于提升整个系统的响应速度和处理能力至关重要。下面将详细介绍SQL查询条件优化的30条原则,帮助...

    优化数据库的方法及SQL语句优化的原则

    #### 二、SQL语句优化原则 1. **使用WHERE子句过滤数据**: - 尽早进行数据过滤可以减少后续操作的数据量。 - 优先考虑使用索引字段进行过滤。 2. **避免使用IS NULL和IS NOT NULL**: - 在WHERE子句中使用这些...

    sql语句性能调整原则

    以下是一些重要的SQL语句优化原则: 1. **避免使用NULL值**:在数据库设计中,应尽量避免使用NULL,因为NULL值在索引中无法被利用。含有NULL值的列在进行查询时,优化器不会使用到包含NULL的索引,这可能导致全表...

    Oracle数据库的SQL语句优化 (1).pdf

    #### SQL语句优化原则 - 减少资源消耗:优化的目的在于减少CPU、内存、磁盘I/O等资源的消耗。 - 缩短响应时间:优化后的语句应能够提高响应速度,缩短用户等待时间。 - 数据访问模式优化:优化数据的读写方式,减少...

    SQL语句优化的原则

    以下是对标题“SQL语句优化的原则”及描述中所提及知识点的详细解释: 1. **使用索引来优化查询**: - 非群集索引是默认的索引类型,但在某些情况下,群集索引可能更适合。群集索引决定了数据的物理存储顺序,适用...

    优化数据库的思想及SQL语句优化的原则

    本文将深入探讨优化数据库的思想以及SQL语句优化的原则。 一、优化数据库的思想 1. 数据库设计:良好的数据库设计是优化的基础。应遵循第一范式(1NF)、第二范式(2NF)和第三范式(3NF),减少冗余数据,确保...

    sql server 语句优化

    ### SQL Server 语句优化详解 #### 一、引言 在现代企业级应用中,数据库性能直接影响到系统的响应速度和服务质量。对于SQL Server这样的关系型数据库管理系统而言,语句优化是提高查询效率的关键手段之一。本文将...

    索引的SQL语句优化

    ### 知识点详解:“索引的SQL语句优化” #### 重要性 在数据库管理中,SQL(Structured Query Language)语句的优化是确保系统高效运行的关键环节。特别是在大型数据库环境中,一次低效的SQL查询可能会导致整个...

    JAVA-SQL语句优化.doc

    总之,SQL语句优化是提升数据库性能的关键。了解并遵循上述原则,可以编写出更加高效的SQL,从而提高系统整体的响应速度和可用性。在实际开发中,应不断学习和实践,以适应不同场景下的性能需求。

    数据库性能优化之SQL语句优化

    为了保证SQL语句优化的有效性,以下几点是必须要遵守的原则: - 数据库访问代码要集中维护,以统一进行性能监控和调整。 - 定期测试数据库性能,并根据性能监控数据调整优化策略。 - 保证优化措施的可回滚性,...

    Oracle高效SQL语句原则

    3. 任何在 where 子句中使用 is null 或 is not null 的语句优化器是不允许使用索引的 Oracle database 的优化器在遇到 is null 或 is not null 条件时,不会使用索引,这可能会导致 SQL 语句的执行效率下降。 4....

    Oracle数据库的SQL语句优化.pdf

    本文将对Oracle数据库中的SQL语句优化进行深入探讨,分析其优化目的和原则,并通过实例介绍一些优化方法。 首先,优化应用程序中SQL语句的必要性十分明显。SQL语句是对数据库中的数据进行操作的唯一途径,应用程序...

    sql语句优化,提高查询性能

    以下是一些关于SQL语句优化的重要原则和技巧: 1. **限制性条件的位置**:在`WHERE`子句中,应将最能限制结果集大小的条件放在最前面。例如,如果`field1`的值都大于等于0,那么`field1&gt;=0 and field1的查询效率会...

    SQL语句优化

    优化数据库、SQL语句优化的原则、不要以为只有SELECT语句是查询。实际上,带有任何WHERE条件的 DML(INSERT、UPDATE、DELETE)语句中都包含查询要求,在后面的文章中,当说到查询时,不一定只是指SELECT语句,也有可能...

    SQL语句优化.pdf

    SQL语句优化的首要原则是通过尽量少的磁盘访问来获取所需的数据。索引作为数据库中关键的数据结构,其主要目的是提高查询效率。正确合理地使用索引能够显著缩短系统的响应时间。 文章中提到了索引使用的问题,以及...

Global site tag (gtag.js) - Google Analytics