SQL语句优化

原创 2004年06月26日 10:44:00

使用声明的方式来潜入sql到java编程。的确是个好主意。

select返回记录的顺序

http://voruta.sourceforge.net/

看来,在这个层次上的编程 QDox and CGLib 一般是必不可少的。

What does @@DBTS return?
Answer
The current value of the timestamp data type within the current database.

Explanation
This returns the value of the current timestamp data type in the current database. These are guarenteed to be unqiue within a database.

---

select * from YouTable
where table_date between TO_DATE('20030112','yyyymmdd') and TO_DATE('20030215','YYYYMMDD')

----------

在ORACLE中选取M+N到M条间的记录
select * from
(select rownum r,yourTableName.* from yourTableName where rownum <= N+M) ss
where ss.r >= N;

select * from test where id>=N
minus
select * from test where id>=N+M

 

---

oracle9.2.0
[表2]有10万条纪录的测试
insert into 表1 select * from 表2;耗时 6.969秒
------------------------------------------------
分2次插入 耗时 3.332秒 在执行一次为 1.932秒
create or replace procedure sp_insert_test2
as

dec_count_wk1 number;--纪录test表的总数

dec_js_wk1    number;--开始插入的标记
begin
     dec_js_wk1 := 0; -- 初始化为0
     select count(*) into  dec_count_wk1 from  test; --test表有10万条纪录
    
     dec_count_wk1 := dec_count_wk1/2;-- 初始化为5万

     for iii in 1..2 --插2次
     loop
     insert into test2
          select sys_no[字段名],
                 sys_date[字段名] from
                                 (select rownum ro,
                                         sys_no,
                                       sys_date
                                           from test)
                                          where ro >=dec_js_wk1
                                            and ro <= dec_count_wk1;
                
                 dec_js_wk1    := dec_count_wk1    ;       --起始为5万
                 dec_count_wk1 := dec_count_wk1 * 2;       --结束为10万
                 
     end loop;    
     commit;
exception
         when others then ......;
         rollback;
end;
下面是两张表的结构
test 和 test2结构相同

Name     Type          Nullable Default Comments
-------- ------------- -------- ------- --------
SYS_NO   VARCHAR2(100) Y                        
SYS_DATE DATE          Y        sysdate

 

一家公司的笔试题目,大家来答答看,顺便涨涨知识!
在itpub上问倒了一批人!

1.请简要您说明对数据仓库概念的理解。
2.请解释以下概念:数据集市,事实表,维表,钻取,OLAP,粒度,KPI,ETL
3.请列举您使用过的各种数据仓库工具软件(包括建模工具,ETL工具,前端展现工具,OLAP Server、
数据库、数据挖掘工具)和熟悉程度。(稍做深入地回答你所用产品所完成的功能)
4.请用C++或其他高级程序语言,写一段程序,功能是生成2000年至2010年的全部日期数及该日期是星期几,
写入一逗号分割的文本文件,也可用PL/SQL将数据插入到一张临时表中。(上机)
5.您有无使用过Oracle的分区、位图索引、执行计划分析功能?位图索引与普通索引的区别是什么?
什么时候使用位图索引?
6.您使用过何种unix系统?写一条shell语句,完成功能:在当前系统时间5小时后将目前目录下全部
文件列表输出到一个文件File_list中。
7.一台有两个CPU的UNIX机器,2G内存,带一个300G磁盘阵列,数据库是Oracle8i或Sybase IQ 12。
有5张主要事实表,初始数据装载30G原始数据,以后每天每张事实表增加约200M原始 数据,每张表
约有5~10个可分析角度需与维表关联,要求第二天能从数据仓库中访问头一天的数据。白天数据源
所在的业务系统数据库不能访问,请简要说明您的数据初始装载策略、数据刷新策略、索引策略、
系统参数及针对Oracle或SybaseIQ的数据库参数设置。
8.您对数据仓库中的缓慢变化维,比如客户登记信息的地址变动,代理商变动等信息变动如何处理,
以保证数据完整一致?
9.您对元数据管理在数据仓库中的运用有何心得?
10. 解释以下Oracle数据库概念:Tablespace, Extent, Segment。
11.说明Oracle表中的存储参数initial, next, pctfree, pctused的含义。针对只做批量装载,
没有update的数据仓库事实表,这些参数的设置原则。
12.列出SybaseIQ中的几种索引类型,说明这些索引各自的特点,针对不同的查询需求和数据内容,
这些索引的使用原则及场合。

SQL调优

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

SQL> desc sam_role;

Name           Type         Nullable Default Comments                            

-------------- ------------ -------- ------- ------------------------------------

ROLECODE       VARCHAR2(6)                   角色代码                             

ENTERPRISECODE VARCHAR2(15)                  企业代码                            

ROLEDESC       VARCHAR2(60)                  角色描述                            

ROLETYPE       CHAR(1)               'I'     角色类型()

ISENABLED      CHAR(1)               'Y'     可用标识                            

 

SQL> desc sam_role_function;

Name           Type         Nullable Default Comments

-------------- ------------ -------- ------- --------

FUNCCODE       VARCHAR2(15)                  功能代码

ROLECODE       VARCHAR2(6)                   角色代码

ENTERPRISECODE VARCHAR2(15)                  企业代码

ISENABLED      CHAR(1)               'Y'     可用标识

 

上面的黑色字体的字段是主健。

 

首先使用一个表调优:

语句如下:

基于选择的优化:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

基于规则的优化:

 

可以看到 如果不加任何条件 使用的都是全表扫描。

 

下面我们加上条件:

SELECT * FROM sam_role a WHERE a.enterprisecode='aaaa';

 

可以看到 不再使用全表扫描了,而用 Index Range Scan 代替了。

注意:上面的条件 enterprisecode 是主健。

 下面我们使用不是主健的条件看看如何:

条件如下:

SELECT * FROM sam_role a WHERE a.roledesc='aaaa';

优化结果如下:

可以看到,如果查询条件不包含主健,那么仍然使用的是全表扫描

包含主健的查询如下:

 可见:如果查询条件中只要包含主健,就不再使用全表扫描的方式了。

从上面的对比可以看出,把基本的,常用的选择条件字段设置成主健是可以大大提交查询效率的。

对于条件中出现 Or 的语句优化和and 的大不相同,我们看看:

上面我们使用的条件是 and , 如果 改为 or ,还是全表扫描。

 结果如下:

上面条件中 有一个条件是主健,另一个不是,执行的都是全表扫描。

我们看看两个都是关键字,但是条件是 or 的情况:

上面 基于选择的优化是:全表扫描, 而基于规则的优化是索引扫描。

很显然这种情况使用 基于规则的优化器 sql执行效果比chose规则优化器要好。

 

作者:田春峰

Mail:  accesine AT gmail DOT com

2004-6-26

 

版权声明:本文为博主原创文章,在不删除、修改文章内容的情况下,可以自由转载。

sql优化in语句

在很多时候我们在sql中会用到in语句,in语句会使得sql查询不使用索引,这也大大减低了sql执行的效率,为了能够让sql在查询中使用索引,有很多种方式可以优化,比如如果in中的类型是确定值,那么可...
  • lilovfly
  • lilovfly
  • 2016年11月03日 08:57
  • 1056

如何优化sql语句

 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效):    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将...
  • e3002
  • e3002
  • 2007年10月10日 10:18
  • 27837

SQL语句常见优化十大案例

1、慢SQL消耗了70%~90%的数据库CPU资源; 2、SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低; 3、SQL语句可以有不同的写法; ...
  • z719725611
  • z719725611
  • 2016年10月25日 15:15
  • 3529

sql语句优化总结

性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化。 为了获得稳定的执行性能,SQL语句越简单越好。对复杂的SQL语句...
  • fyuanfena
  • fyuanfena
  • 2016年07月27日 09:26
  • 1323

Mysql常用30种SQL查询语句优化方法

1、应尽量避免在 where 子句中使用!=或 2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 3、应尽量避免在 where 子句中对...
  • youthsunshine
  • youthsunshine
  • 2016年12月05日 15:32
  • 2412

Oracle SQL语句之常见优化方法总结

下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1、SQL语句尽量用大写的;  因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。 2、使用表的别名:  ...
  • dtjiawenwang88
  • dtjiawenwang88
  • 2017年07月09日 16:17
  • 1970

SQL里IN的用法以及优化

1.in后条件不多,可以考虑主表建索引,或用union all 代替   2. in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果...
  • wwsscc168
  • wwsscc168
  • 2016年06月08日 15:29
  • 2604

sql优化实战:从250秒+到10秒(简化语句)

今天客服又反馈了一个问题,说客户在访问后台web页面中有一个查询时非常慢,直接报了“查询超时,请联系管理员!”。 于是用客户账号登录系统,最后显示确实时超时,但是用管理员账号登录查询时,虽然返回了68...
  • yupeigu
  • yupeigu
  • 2016年11月07日 16:49
  • 1628

mysql语句优化总结(一)

Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A.     inner join内连接也叫等值连接是,left/rightjoin是外连接。 SELECT A.id,A....
  • kevinlifeng
  • kevinlifeng
  • 2015年01月28日 17:10
  • 12707

优化 SQL SELECT 语句性能的 6 个简单技巧

本文由 伯乐在线 - xianhu 翻译,进林 校稿。未经许可,禁止转载! 英文出处:msiman.ga。欢迎加入翻译小组。 SELECT语句的性能调优有时是一个非常耗时的任务,在我看来它遵循...
  • werm520
  • werm520
  • 2015年05月04日 16:09
  • 10702
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL语句优化
举报原因:
原因补充:

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