CSDN博客

img accesine960
博客专家

SQL语句优化

发表于2004/6/26 10:44:00  2543人阅读

分类: DB

使用声明的方式来潜入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调优

 

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'     可用标识

 

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

 

首先使用一个表调优:

语句如下:

基于选择的优化:

基于规则的优化:

 

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

 

下面我们加上条件:

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

 

0 0

相关博文

我的热门文章

img
取 消
img