首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL语句优化

SQL语句优化

作者头像
田春峰-JCJC错别字检测
发布2019-02-14 15:07:25
1.7K0
发布2019-02-14 15:07:25
举报

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2004年06月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档