or查询sql的一次改写
查看数据库的disk_reads中的top sql中有一个sql语句如下: SELECT a.id, a.title, a.pubdate, a.lastupdated, a.subject, a.url, w.displayname AS websitename, a.pubuser, a.similarity FROM article a, website w WHERE (FLOOR (similarity) = :1 or a.id = :2) AND a.HOST = w.id ORDER BY FLOOR (a.similarity), pubdate ASC Plan
reverse index的like测试和dbms_stats具体参数意义
由于主键产生的默认索引会增大索引的竞争,此前系统也出现了大量的db file sequential read等待事件,不过此事件大量出现并不能说明系统存在性能瓶颈,很有可能是高效利用索引的情况,而是否应该在创建主键索引时利用反转索引来平衡索引的IO竞争了,这不是能很简单的说明的,利用反转索引虽然能打散数据分布不过无疑增加了IO消耗,不过下面测试的是关于反转索引是否能利用like ‘TEST002%’这种谓词查询的。SQL> create table test002 as select distinct object_name,object_id,object_type,created,status from dba_objects; Table c
_sort_elimination_cost_radit和sort排序
摘自ITPUB的一篇帖子http://www.itpub.net/thread-1605027-1-1.htmlOracle 9I下optimizer_mode为first_rows,而此时的一个隐含参数_sort_elimination_cost_radit为0,也就是cbo会尽量避免sort,认为sort消耗巨大,此参数可能会引起执行计划的不合理,而在10g中该参数已经修改为1,也就是排序与不排序的成本是一样的。SQL> alter session set optimizer_mode=first_rows; Session altered SQL> create table test01 as select * from dba_objects; Table created SQL> insert into test01 select * from dba_objects; 49745 rows
关于循环嵌套nested loops的一点分析
nested loops连接 /*+use_nl(tab01 tab02)*/ 循环嵌套连接:oracle优化器根据基于rbo和cbo原则,选择两个表中一个为驱动表,也就是外部表,另一个作为内部表。注意hint写法中表如果用的别名,hint中必须写相应的别名,不然相应的hint不能生效。 在oracle9I后优化器推出两种执行方式,方式1先从外部表取第一行然后和内部表数据进行比较,此时会逐行取出数据,重复上述步骤直到外部表中所有记录全部处理完毕。 SQL> desc tab01;Name Type Nullable Default Comments ---- ------------ -------- ------- -------- ID NUMBER
imp的buffer和commit分析
Imp的commit和buffer分析:Imp的commit影响:imp的commit主要用于大表数据插入时减少回滚段的压力,以免出现长时间导入而出现的回滚段过久ora-01555,结合buffer设置则能按照buffer的大小进行分批提交,可以有效的减轻undo压力。但是如果对于插入lob、long、ref、rowid等字段时设置commit=y则会逐条commit,我们都清楚对于批量插入数据逐条commit会降低性能,所以这里需要依据表中的具体信息。而且还存在一个因素则是结合buffer区大小批量commit提交时,如果出现表空间,连接丢失等问题导致imp失败,则可能只提交一批数据,此时带来的影响
sum()over()和count()over()分析函数
Sum()over()和count()over分析函数使用创建测试表create table test(sales_id varchar2(2),sales varchar2(10),dest varchar2(10),dept varchar2(10),revenue number);插入测试数据insert into test values('11','smith','hangzhou','市场',1000);insert into test values('12','smith','wenzhou','市场',2000);insert into test values('13','allen','wenzhou','渠道',3000);insert into test values('14','allen','wenzhou','渠道',4000);insert into test values('15','jekch','shanghai','渠道',2500);insert into test values('11','
利用隐式游标分批删除数据的procedure
刚一个人在南京过完了元宵佳节,和同学去了一趟书店帮他选了一本三思的涂抹oracle,个人来看对他还是很不错的,不然直接看eygle的深入浅出 dba3手记那是太吃力了,涂抹oracle还是很不错的,至少能认认真真把那本书啃完是非常受益的。即将迎来自己的未知的第二份工作,当然首先必须跟oracle相关,如果可以有管理类的工作那最好了,不过自己在技术和经验方面还存在远远不足,虽然这一年来自己很努力的去肯文档 做测试但是知识漏洞还是太多太多。不瞎扯了,同事这些天需要删除大量的数据,如果直接删除对回滚段冲击太大,一个运行半天delete很
tom的runstats_pkg工具包关于批量插入和绑定变量分析-03
也可以利用runstats_pkg工具包用来检测使用绑定变量与不适用绑定变量的从时间 latch争用等区别。SQL> create table t01(id number); Table created SQL> SQL> create or replace procedure proc1 2 as 3 begin 4 for i in 1..10000 loop 5 execute immediate 'insert into t01 values(:x)' using i; 6 end loop; 7 commit; 8 end; 9 / Procedure created SQL> SQL> create or replace procedure proc2 2 as 3 begin 4 for i in 1..10000 loop 5 execute immediate 'insert into t01 values('||i||
tom的runstats_pkg工具包关于批量插入和绑定变量分析-02
tom大师利用上述runstats_pkg工具包可以测试两种方法所使用的时间差 统计信息和latch等。例如批量插入和逐条插入数据到table中,我们更自然的想象的是批量插入性能优于逐条插入,利用runstats_pkg更可以从时间 统计信息 latch批量插入的优势。SQL> set serveroutput on size 999999SQL> execute runstats_pkg.rs_start; PL/SQL procedure successfully completed SQL> insert into t select * from t; 100094 rows inserted SQL> commit; Commit complete--批量插入 SQL> execute runstats_pkg.rs_middle; PL/SQL procedur
tom的runstats_pkg工具包关于批量插入和绑定变量分析-01
今天迎来本命年的工作第一天,学习氛围还算不错,充满神奇的2012这一年自身又将有着怎样的变化,其实真是不得而知。给大家送一个迟来的新年快乐,当然今年可能以后很长一段时间都是坚持 习惯学习oracle,然后期待北漂寻求一份跟oracle开发管理相关的工作,认真的做下去,也期待遇见一个适龄的girl,一个人着实有点孤独。呜呜!Tom开发的一个用于比较统计方法的工具runstats_pkg先建立视图statscreate or replace view stats asselect 'STAT...'||a.name name,b.value fromv$statname a,v$mystat bwhere a.statistic#=b.statistic#union al
logon on database记录登入信息的trigger
今天想起写一个登陆数据库的数据库级别的trigger,记录每次登陆的时间和人员名称,以下是具体的构建思路。 SQL> create table loggon01(id number,name varchar2(80),logon_date date); Sql> create public synonym loggon for loggon01; Sql> grant all on logon to public; 创建测试表loggon01及其public synonym授权与publicSql> create sequence sequence01 Start with 1 Increment by 1 Maxvalue 99999 Nocycle Sql> create public synonym sequence for sequence01; Sql> grant select any
游标current of cur特性
有关游标的current of特性使用,创建测试表test001,create table test001(id number, user_name varchar2(20));insert into test001 values(1, 'hzk');insert into test001 values(2, 'zak');insert into test001 values(3, 'zaglzd');commit;需要把每行id自增长10,遍历游标fetch到变量中可以利用如下pl/sql程序块进行处理declarev_ab test001%rowtype;cursor cur01 is select * from test001;beginopen cur01;loopfetch cur01 into v_ab;update test001 set id=id+10 where user_name=v_ab.user_name;exit when cur01%notfound;comm
动态sql无法recover
早上看pub的一个帖子说到动态sql执行恢复的一个错误,SQL> alter database datafile 4 offline; Database altered SQL> declare 2 v_ab number; 3 v_sql varchar2(100); 4 begin 5 select file# into v_ab from v$recover_file; 6 v_sql:='recover datafile'||v_ab; 7 execute immediate v_sql; 8 end; 9 /declare*第 1 行出现错误:ORA-00900: 无效 SQL 语句ORA-06512: 在 line 7SQL> recover datafile 4;完成介质恢复。SQL> alter database datafile 4 online;数据库已更改。Oracle的动态sql可以执行ddl等操
in,exists和not exists ,not in与null的一些关系记载
In和exist,not in和not exists,其中可能还有null,一直是个很纠结的问题,直到现在自己也不能完全说出两种语句的优劣,使用情况等。 先从查询结果上来讲,上个星期五pub的一篇帖子说到了not in和not exists查询结果不同,记得曾经碰到过这种问题,null的影响,因为not in和not exists两种从根本上”算法”是不同的。下面自己做个了测试的例子可以很清晰的看到结果不同SQL> select * from jj_one;ID NAME------ ----------------------------------------1 as2 adkj1 asSQL> select * from jj_two;COL1 COL2---------- ----------1
%rowtype和数组的基本记载
这里提一点关于oracle开发上面的一点小知识细节,由于自己对于oracle开发上面相对于管理来说比较弱!不管是开发还是管理在日常管理中都是非常重要的!SQL> desc jj_one;Name Type Nullable Default Comments ---- --------- -------- ------- -------- ID NUMBER(5) Y NAME CHAR(40) Y SQL> declare 2 v_ab jj_one%rowtype; 3 begin 4 select * into v_ab from jj_one where rownum=1; 5 insert into jj_one values v_ab; 6 end;7 /定义定量的方式A%rowtype,这
游标参数shared_cached_cursors和软软解析
继续整理关于游标 解析 绑定变量。这里说下几个参数,里面内容有点深,自己也是迷迷糊糊的!Oracle 10G下SQL> show parameter cursor; NAME TYPE VALUEcursor_sharing string EXACTcursor_space_for_time boolean FALSEopen_cursors integer 300session_cached_cursors integer 20session_cached_cursors:一个sql语句会首先在uga中缓存区存放与之关联的游标,然后打开创建游标 解析游标 执行游
父游标 子游标和软硬解析记载-02
继续整理关于父游标 子游标和软硬解析的东东.根据前篇blog的http://dotaddjj.itpub.net/post/43172/525234的关于父子游标的整理,这里再次补充一下。父游标和v$sqlarea信息相关联,而子游标和v$sql信息相关联。Shared cursor而共享游标shared cursor是在sql语句在游标解析阶段生成获得,位于library cache中的sql语句或匿名的pl/sql块,如果library cache的父游标和子游标能够被共享,此时则为共享游标。父游标能够共享则为共享父游标,子游标共享则是共享的子游标。Session cursorOracle为session分配缓冲区存放sql语句执行结果,用户通过
v$sql v$sqlarea和父游标 子游标记载01
这个双休去了常州,blog好久没更新了,又偷懒了。今早群里在聊绑定变量,其实对于绑定变量自己也是糊里糊涂的,对于实质的还远远理解不够,pub的老谢给了我们一篇帖子,细细读下去还是受益匪浅啊。http://www.itpub.net/thread-965919-1-1.html在oltp事务处理系统中,绑定变量和索引可以说是这个系统中比较重要的两部分,对于索引自己慢慢也有了一定的理解,在索引那些事中自己还是整理了一些心得的。从老谢的帖子中让自己以前的有些错误理解纠正了,记得看杨老大的blog中关于分页查询的分析也让自己恍然大悟,(看过老杨大的物化视图,大
有关性能调整的查询和pub上的一个sql调优!
查看数据字典命中率Select 1-sum(gets)/sum(getmisses) from v$rowcache数据字典命中率应该在95%以上,如果命中率过低要考虑增加shared_pool,简单介绍一下v$rowcache数据字典视图的column:Parameter 缓存名Count:缓存项总数Gets:请求总数Getmisses:请求失败次数Scans:扫描请求数Scanmisses:扫描请求失败数Usage:包含有效数据的缓存项数查看共享池中sql语句或pl/sql命中率select sum(gethits)/sum(gets),(sum(pinhits)-sum(reloads))/sum(pins) from v$librarycache查看buffer命中率Select name,1-physical_reads/(db_block_gets+con
where检索条件性能测试记载
清早起来打开ITPUB看到sql的执行计划适合和where后的条件有关系了,以前总是听说where后的条件是从右到左检索,所以需要把能排除大部分数据的检索条件放在最右边。参照PUB中的前辈的测试:Select 1 from dual where 1/0=1 and 1/2=1; 正常Select 1 from dual where 1/2=1 and 1/0=1; 报错这里自己有个测试思路:SQL> desc test01;Name Type Nullable Default Comments ---- ------------ -------- ------- -------- ID NUMBER Y NAME VARCHAR2(10) Y SQL> select * from test01 where name=sf and 1/0=1 and id=8;select * from tes