随笔 - 832, 文章 - 0, 评论 - 46, 阅读 - 156万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

12 2008 档案

摘要:ORACLE绑定变量的使用 在ORACLE中,使用绑定变量,可以降低硬解析,通常可以提高系统的性能(注意,是通常,不是任何情况下)。 以表tabletest为例,我们来看看如何使用绑定变量,tabletest的表结构为 field1 number(10) field2 number(10) field3 number(10) field4 number(10) field5 number(10) 绑定变量可以理解为一个占位符 ,例如: declare i number; j number; sqlstr varchar2(200); begin i:=1; j:=2... 阅读全文

posted @ 2008-12-17 09:01 徐正柱- 阅读(931) 评论(0) 推荐(0) 编辑

摘要:46. 连接多个扫描如果你对一个列和一组有限的值进行比较, 优化器可能执行多次扫描并对结果进行合并连接.举例: SELECT * FROM LODGING WHERE MANAGER IN (‘BILL GATES’,’KEN MULLER’); 优化器可能将它转换成以下形式 SELECT * FROM LODGING WHERE MANAGER = ‘BILL GATES’ OR MANAGER = ’KEN MULLER’; 当选择执行路径时, 优化器可能对每个条件采用LODGING$MANAGER上的索引范围扫描. 返回的ROWID用来访问LODGING表的记录 (通过TABLE ... 阅读全文

posted @ 2008-12-02 00:27 徐正柱- 阅读(554) 评论(0) 推荐(0) 编辑

摘要:43. 用WHERE替代ORDER BYORDER BY 子句只在两种严格的条件下使用索引.ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.ORDER BY中所有的列必须定义为非空.WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.例如: 表DEPT包含以下列: DEPT_CODE PK NOT NULL DEPT_DESC NOT NULL DEPT_TYPE NULL 非唯一性的索引(DEPT_TYPE) 低效: (索引不被使用) SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE EXPLAIN PL. 阅读全文

posted @ 2008-12-02 00:27 徐正柱- 阅读(309) 评论(0) 推荐(0) 编辑

摘要:39. 总是使用索引的第一个列如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 译者按:这也是一条简单而重要的规则. 见以下实例.SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));Table created.SQL> create index multindex on multiindexusage(inda,indb);Index created.SQL> set autotra 阅读全文

posted @ 2008-12-02 00:26 徐正柱- 阅读(448) 评论(0) 推荐(0) 编辑

摘要:36. 用UNION替换OR (适用于索引列)通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGIO. 阅读全文

posted @ 2008-12-02 00:25 徐正柱- 阅读(365) 评论(0) 推荐(0) 编辑

摘要:31. 强制索引失效 如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) .举例: SELECT ENAMEFROM EMPWHERE EMPNO = 7935AND DEPTNO + 0 = 10 /*DEPTNO上的索引将失效*/AND EMP_TYPE || ‘’ = ‘A’ /*EMP_TYPE上的索引将失效*/这是一种相当直接的提高查询效率的办法. 但是你必须谨慎考虑这种策略,一般来说,只有在你希望单独优化几个SQL时才能采用它.这里有一个例子关于何时采用这种策略, 假设在EMP表的EMP_TYPE列上有一个非唯一性的索引而 阅读全文

posted @ 2008-12-02 00:24 徐正柱- 阅读(402) 评论(0) 推荐(0) 编辑

摘要:27. 基础表的选择基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问). 根据优化器的不同, SQL语句中基础表的选择是不一样的.如果你使用的是CBO (COST BASED OPTIMIZER),优化器会检查SQL语句中的每个表的物理大小,索引的状态,然后选用花费最低的执行路径.如果你用RBO (RULE BASED OPTIMIZER) , 并且所有的连接条件都有索引对应, 在这种情况下, 基础表就是FROM 子句中列在最后的那个表.举例: SELECT A.NAME , B.MANAGER FROM WORKER A, LODGING B WHERE . 阅读全文

posted @ 2008-12-02 00:23 徐正柱- 阅读(358) 评论(0) 推荐(0) 编辑

摘要:25. 用索引提高效率索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率.虽然使用索引能得到查询效率的提高,但是我们也必 阅读全文

posted @ 2008-12-02 00:22 徐正柱- 阅读(348) 评论(0) 推荐(0) 编辑

摘要:24. 用EXPLAIN PLAN 分析SQL语句EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称.你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 如果两个操作处于同一层中,带有最小操作号的将被首先执行.NESTED LOOP是少数不按照上述规则处理的操作, 正确的执行路径是检查对NESTED LOOP提供数据的操作,其中操作号最小的将被最 阅读全文

posted @ 2008-12-02 00:18 徐正柱- 阅读(320) 评论(0) 推荐(0) 编辑

摘要:9. 整合简单,无关联的数据库访问 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) 例如: SELECT NAME FROM EMP WHERE EMP_NO = 1234;SELECT NAME FROM DPT WHERE DPT_NO = 10 ;SELECT NAME FROM CAT WHERE CAT_TYPE = ‘RD’; 上面的3个查询可以被合并成一个: SELECT E.NAME , D.NAME , C.NAME FROM CAT C , DPT D , EMP E,DUAL X WHERE NVL(‘X’,X.DUMMY) = . 阅读全文

posted @ 2008-12-02 00:16 徐正柱- 阅读(400) 评论(0) 推荐(0) 编辑

摘要:7. 减少访问数据库的次数 当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量. 例如, 以下有三种方法可以检索出雇员号等于0342或0291的职员. 方法1 (最低效) SELECT EMP_NAME , SALARY , GRADE FROM EMP WHERE EMP_NO = 342; SELECT EMP_NAME , SALARY , GRADE FROM EMP WHERE EMP_NO = 291;方法2 (次低效... 阅读全文

posted @ 2008-12-02 00:15 徐正柱- 阅读(391) 评论(0) 推荐(0) 编辑

摘要:13. 计算记录条数 和一般的观点相反, count(*) 比count(1)稍快 , 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO)(译者按: 在CSDN论坛中,曾经对此有过相当热烈的讨论, 作者的观点并不十分准确,通过实际的测试,上述三种方法并没有显著的性能差别)14. 用Where子句替换HAVING子句 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.例如: 低效: SELECT REGION,AVG(LOG_S 阅读全文

posted @ 2008-12-02 00:13 徐正柱- 阅读(452) 评论(0) 推荐(1) 编辑

摘要:8. 使用DECODE函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.例如: SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAME LIKE ‘SMITH%’; SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE ‘SMITH%’;你可以用DECODE函数高效地得到相同结果SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT, COUNT(D 阅读全文

posted @ 2008-12-02 00:11 徐正柱- 阅读(373) 评论(0) 推荐(0) 编辑

摘要:4. 选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.例如: 表 TAB1 16,384 条记录 表 TAB2 1 条记录 选择TAB 阅读全文

posted @ 2008-12-02 00:10 徐正柱- 阅读(430) 评论(0) 推荐(0) 编辑

摘要:1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本)c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. 如果数 阅读全文

posted @ 2008-12-02 00:07 徐正柱- 阅读(545) 评论(0) 推荐(0) 编辑

摘要:查询计划及主要统计数据如下: 执行计划: ----------------------------------------- …… 2 1 HASH JOIN (Cost=5 Card=14 Bytes=224) 3 2 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=52) 4 2 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=42) 主要统计数据: ----------------------------------------- 305 recur 阅读全文

posted @ 2008-12-01 23:56 徐正柱- 阅读(439) 评论(0) 推荐(0) 编辑

摘要:Oracle性能优化方法(SQL篇) 1 综述ORACLEl l I/Ol l l l 2 如何分析SQL语句 /ORACLE_HOME/rdbms/admin/utlxplan.sqlSQL>plan_tableSQL create table PLAN_TABLE ( statement_id varchar2(30), timestamp date, remarks varchar2(80), operation varchar2(30), options varchar2(30), object_node varchar2(128), object_owner varchar2( 阅读全文

posted @ 2008-12-01 23:55 徐正柱- 阅读(665) 评论(0) 推荐(0) 编辑

摘要:oracle物化视图 物化视图对于前台数据库使用者来说如同一个实际的表,具有和一般表相通的如select等操作,而其实际上是一个视图,一个由系统实现定期刷新其数据的视图(具体刷新时间在定义物化视图的时候已有定义),使用物化视图更可以实现视图的所有功能,而物化视图确不是在使用时才读取,大大提高了读取速度,特别适用抽取大数据量表某些信息以及数据链连接表使用.具体语法如下:物化视图对于前台数据库使用者来说如同一个实际的表,具有和表相通的一般select操作,而其实际上是一个视图,一个定期刷新数据的视图(具体刷新时间在定义物化视图的时候已有定义),使用物化视图可以实现视图的所有功能,而物化视图确不是. 阅读全文

posted @ 2008-12-01 23:48 徐正柱- 阅读(356) 评论(0) 推荐(0) 编辑

摘要:实现目的:往oracle数据库中,插入excel文件中的数据实现步骤:1、打开MicroSoft Excel 20002、文件(F)→新建(N)→工作簿→3、输入数据后,存盘为test.xls,4、文件(F)→另存为(A)→保存类型为:制表符分隔,起名为text.txt,保存到C:5、须先创建表结构:连入SQL*Plus,以system/manager用户登录,SQL> conn system/manager创建表结构SQL> create table test ( id number, --序号 username varchar2(10),... 阅读全文

posted @ 2008-12-01 23:29 徐正柱- 阅读(332) 评论(0) 推荐(0) 编辑

摘要:2007-12-17 18:09SQL*Loader是Oracle数据库导入外部数据的一个工具.它和DB2的Load工具相似,但有更多的选择,它支持变化的加载模式,可选的加载及多表加载. 如何使用 SQL*Loader 工具 我们可以用Oracle的sqlldr工具来导入数据。例如: sqlldr scott/tiger control=loader.ctl 控制文件(loader.ctl) 将加载一个外部数据文件(含分隔符). loader.ctl如下: load data infile 'c:\data\mydata.csv' into table emp fields t 阅读全文

posted @ 2008-12-01 23:27 徐正柱- 阅读(361) 评论(0) 推荐(0) 编辑

摘要:2008-10-27 13:42SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据 仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。现在,我们抛开其理论不谈,用实例来使您快速掌握SQL*LOADER的使用方法。 首先,我们认识一下SQL*LOADER。 在NT下,SQL*LOADER的命令为SQLLDR,在UNIX下一般为sqlldr/sqlload。 如执行:d:\oracle>sqlldr SQL*Loader: Release 8.1.6.0.0 - Producti 阅读全文

posted @ 2008-12-01 23:26 徐正柱- 阅读(451) 评论(0) 推荐(0) 编辑

摘要:sql loader可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。缺点就速度比较慢,另外对blob等类型的数据就有点麻烦了。用法: SQLLDR keyword=value [,keyword=value,...]有效的关键字: userid -- ORACLE username/password control – 控制文件 log – 记录的日志文件 bad – 坏数据文件 data – 数据文件 discard – 丢弃的数据文件discardmax – 允许丢弃数据的最大值 (全部默认) skip -- Nu 阅读全文

posted @ 2008-12-01 23:24 徐正柱- 阅读(766) 评论(0) 推荐(0) 编辑

摘要:例一、使用Oracle的sqlldr工具来将SDSS.CSV文件中的数据导入数据库。 SDSS.CSV 放置于 E:\ 内容如下: 2.3757291096910399E-4,-8.9490277843631194,20.302597, 0.00023851549291556,-0.88450365314434698,20.098101, 2.5168890447969299E-4,7.7169029946908094E-2,18.762859, 2.9486118387225802E-4,-9.8447540892170409,19.943598, 2.948653627... 阅读全文

posted @ 2008-12-01 23:21 徐正柱- 阅读(459) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示