改写一个要跑5小时的SQL成1分钟
改写NOT EXISTS, 分成两个语句,用union all连起来. 一个要跑个小时的SQL,改写后,1分钟就可以跑完. 以下item,link,item_link表都大约40 million.[@more@]INSERT INTO temp_existing_links (item_id,link_id,link_priority,item_identifier)SELECT /*+ INDEX (i IX_ITEM_6) */ i.item_id,NULL,NULL,i.item_identifierFROM item iWHERE i.account_code = p_account_codeAND i.account_type_code = p_account_type_codeAND i.latest_ind ='Y'AND NOT EXISTS (SELECT 1 from link, item_link WHERE link.link_id = item_link.link_id AND valid
解决: 执行计划变了,一条语句要跑20小时候.
执行计划变了,一条语句要跑20小时候. 而原来也许只要5分钟.[@more@]temp_link_id也许有20k. 下面在新refresh的数据库上,计划由原来的nested-loop变成MERGE JOIN 了, 然后新的计划后,要跑20小时才能跑得完.SELECT i.item_idFROM item i,item_link ilWHERE i.item_id = il.item_idAND latest_ind = 'Y'AND account_code = 'CRES_20000'AND account_type_code = 'TRADE'AND link_id IN(SELECT link_idFROM temp_link_id);Execution plan:SQL> SELECT i.item_id2 FROM item i,3 item_link il4 WHERE i.item_id = il.item_id5 AND latest_in
常用SQL语句
查看表空间的名称及大小[@more@]查看表空间的名称及大小: SQL> SELECT T.TABLESPACE_NAME, ROUND(SUM(BYTES/(1024 * 1024)), 0) TS_SIZE FROM DBA_TABLESPACES T, DBA_DATA_FILES D WHERE T.TABLESPACE_NAME = D.TABLESPACE_NAME GROUP BY T.TABLESPACE_NAME;查看表空间物理文件的名称及大小:SQL> SELECT TABLESPACE_NAME,FILE_ID,FILE_NAME,ROUND(BYTES / (1024 * 1024), 0) TOTAL_SPACE FROM DBA_DATA_FILES ORDER BY TABLESPACE_NAME;查看回滚段名称及大小: SQL> SELECT SEGMENT_NAME, TABLESPACE_NAME, R.STATU
Oracle Hints
http://www.psoug.org/reference/hints.html[@more@]Oracle HintsVersion 10.2 Join methods:In the loop join algorithm, an outer loop is formed that is composed of a few entries that are to be selected. Then, for each entry in the outer loop, a look-up is performed for matching entries, in the inner loop.In the merge join algorithm, both tables are accessed in the same order. If there's a sorted index on the matching column, on both tables, then no sorting is needed. All we have to do is read the row
All about sort, temp space
看当前的使用情况: select * from V$SORT_USAGEselect * from V$SORT_SEGMENT[@more@]select * from (select sess.SID, segtype, blocks*8/1000 "MB" ,sql_textfrom v$sort_usage sort, v$session sess ,v$sql sqlwhere sort.SESSION_ADDR = sess.SADDRand sql.ADDRESS = sort.SQLADDR (+)order by blocks desc) awhere rownum<10Take a look atv$temp_space_headerv$temp_extent_pool用完的extent会cache在v$temp_extent_pool中被重用.v$sort_usage tells you space currently being used.The query below would show temp
找出session正在执行什么语句
SELECT /*+ ORDERED */ sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN ( SELECT DECODE (sql_hash_value, 0, prev_hash_value, sql_hash_value ), DECODE (sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b WHERE b.sid = &sid)ORDER BY piece ASC/[@more@]
亿级表中创建索引
http://www.ninedns.com/oracle/200742218395312863.html, 大表建索引的一个例子.[@more@]1. 查看表的具体情况 查看是不是分区表,有多少个分区、分区字段: SQL> col table_name for a20 SQL> col column_name for a20 SQL> select a.table_name,a.partitioned,b.partition_count,c.column_name 2 from user_tables a, user_part_tables b, user_part_key_columns c 3 where a.table_name='STAT_SUBMIT_CENTER' 4 and b.table_name='STAT_SUBMIT_CENTER' 5 and c.name='STAT_SUBMIT_CENTER'; TABLE_NAME PAR PARTITION_COUNT CO
查看UNIX的版本信息,硬件状况,Solaris与Sunos
uname :显示系统信息 Solaris与Sunos的版本转换:Solaris 8 = Sunos 5.8,Solaris 7 = Sunos 5.7,Solaris 2.6 = Sunos 5.6,Solaris 2.5 = Sunos 5.5……自Sunos 5以后,就叫Solaris了例如: bash-2.03$ uname -aSunOS longmdappu7 5.8 Generic_117350-33 sun4u sparc SUNW,Netra-T12[@more@]uname :显示系统信息。 语 法:uname [-amnrsv][--help][--version] 补充说明:uname可显示电脑以及操作系统的相关信息。 参 数: -a或--all 显示全部的信息。 -m或--machine 显示电脑类型。 -n或-nodename 显示在网络上的主机
怎么估算一段时间里,几条SQL所占用的时间
http://www.itpub.net/817953.html[@more@]....................................................CPU.......ElapsdBuffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value--------------- ------------ -------------- ------ -------- --------- ----------57,829,948 686 84,300.2 17.0 994.30 2768.46 3580151673...17.0 == %Total994.30 =CPU Times2768.46 =Elapsed Times%CPU 在9i 的DB里只能自己估算,找到CPU used by this session 1,143,177 317.5 59.9要第一个值/100,得到Total CPU秒数然后用top sql里的cp
statspack使用手册
http://www.51tech.net/news_html/1401.htm, 包括了statspack各段的详细说明。[@more@]oracle 9i statspack使用手册 ★★★★ChinaUnix内容包括 statspack安装 statspack报告的详细说明 Statspack 使用说明 一.statspack系统安装 1 二.Statspack介绍 2 三.Statspack使用 4 四.Statspack报告说明 5 一.statspack系统安装 statspack的安装程序在@?/rdbms/admin/下: spcreate.sql 安装 spdrop.sql 卸载 spauto.sql: 生成自动采集数据任务 spreport.sql 生成分析报告 spuexp.sql 参数文件 sppurge.sql 清除不在需要的数据 sptru
Using XML Parser for PL/SQL
在PLSQL里直接调用oracle的XML Parser来对xml进行操作,这比较好,以后可以参考。http://download-uk.oracle.com/docs/cd/B14504_01/dl/web/B12099_01/adx28ppl.htm[@more@]
执行计划中cost, card的含义
card是指计划中这一步所处理的行数。cost指cbo中这一步所耗费的资源,这个值是相对值。bytes指cbo中这一步所处理所有记录的字节数,是估算出来的一组值。 http://blog.itpub.net/post/385/45197[@more@]■ Cost The cost assigned to each step of the query plan by the CBO. The CBO works bygenerating many different execution paths/plans for the same query and assigns a cost toeach and every one. The query plan with the lowest cost wins. In the full outer join example,we can see the total cost for this query is 10
Oracle Date Functions
Oracle Date FunctionsVersion 10.2 Have you seen our new Functions page? If not ... Click Here ... for instant access to all Oracle functionshttp://www.psoug.org/reference/date_func.html[@more@]Oracle Date FunctionsVersion 10.2 Have you seen our new Functions page? If not ... Click Here ... for instant access to all Oracle functions DateCurrent DateCURRENT_DATESYSDATESELECT TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY HH:MI:SS') FROM dual;SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY HH:MI:SS') FROM dual;FormatsD
SQL*PLUS命令, set命令大全
http://xsb.itpub.net/post/419/49511SQL*PLUS命令的使用大全Oracle的sql*plus是与oracle进行交互的客户端工具[@more@]SQLPLUS命令的使用大全 =========================================================== 作者: xsb(http://xsb.itpub.net)发表于:2005.12.29 12:59分类: Oracle 出处:http://xsb.itpub.net/post/419/49511--------------------------------------------------------------- SQL*PLUS命令的使用大全[zt]Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中,可以运行sql*plus命令与sql*plus语句。 我们通常所
not exists的优化
3张表几乎都几千万行, 找出在ITEM表里的但没存在LINK, ITEM_LINK 里已经链接好了的ITEM_ID, 下面第一种方法是传统方法,用not exists直观, 第二种是用左外连接. 但从两种方法看效率都不高, 都要大量的连接,要nested loop. 也许修改表结构是最好的选择了,给ITEM表加个字段,如LINK_STATUS, 在ITEM_LINK,LINK已经link了,就给这个字段置位.以后再来判断就不需要用not exists来判断是否在LINK,ITEM_LINK表里已link了![@more@]SQL> SELECT I.ITEM_ID FROM ITEM I WHERE ACCOUNT_CODE = 'ICMPVMONTHEND' AND ACCOUNT_TYPE_CODE = 'TRADE' AND L
Oracle SQL性能优化
Oracle SQL性能优化 1、用EXISTS替代IN,NOT EXISTS替代NOT IN: 在子查询中,NOT 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率。[@more@] SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB') 2、用Where子句替换HAVING子句: 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤。 这个处理需
Oracle触发器
是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。[@more@]功能: 1、 允许/限制对表的修改 2、 自动生成派生列,比如自增字段 3、 强制数据一致性 4、 提供审计和日志记录 5、 防止无效的事务处理 6、 启用复杂的业务逻辑 开始 create trigger biufer_employees_department_id before insert or update of department_id on employees referencing old as old_value new as new_value for each row when (new_value
oracle临时表-优化查询速度
http://tech.it168.com/db/o/2006-08-18/200608180829007.shtml目前所有使用oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。[@more@] 当然在oracle中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我考虑在oracle中创建“临时表”。 我对临时表的理解:在oracle中创建一张表,这个表不
数据结构知识(转)
由于查找运算的使用频率很高,几乎在任何一个计算机系统软件和应用软件中都会涉及到,所以当问题所涉及的数据量相当大时,查找方法的效率就显得格外重要。在一些实时查询系统中尤其如此。因此,本章将系统地讨论各种查找方法,并通过对它们的效率分析来比较各种查找方法的优劣。[@more@]查找的基本概念1、查找表和查找 一般,假定被查找的对象是由一组结点组成的表(Table)或文件,而每个结点则由若干个数据项组成。并假设每个结点都有一个能惟一标识该结点的关键字。 查找(Searching)的定义是:给定一个值K,在含有n个结点的表中找出关键
二分查找算法
二分查找1、二分查找(Binary Search) 二分查找又称折半查找,它是一种效率较高的查找方法。 二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。[@more@]2、二分查找的基本思想 二分查找的基本思想是:(设R[low..high]是当前的查找区间)(1)首先确定该区间的中点位置: (2)然后将待查的K值与R[mid].key比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找,具体方法如下: ①若R[mid].key>K,则由表的有序性可知R[mid..n].keys均大