Oracle查询优化改写技巧与案例上架了

应邀写了本sql改写的书,终于上架了大笑http://item.jd.com/11587404.html



勘误: 

1、 yyyy转为日期时的问题




附部分样例数据:

1.4
CREATE OR REPLACE VIEW v AS
SELECT NULL AS C1, NULL AS C2,    1 AS C3, NULL AS C4,    2 AS C5, NULL AS C6 FROM DUAL UNION ALL
SELECT NULL AS C1, NULL AS C2, NULL AS C3,    3 AS C4, NULL AS C5,    2 AS C6 FROM DUAL;


1.13
CREATE OR REPLACE VIEW v AS
SELECT 'ABCEDF' AS vname FROM dual
UNION ALL
SELECT '_BCEFG' AS vname FROM dual
UNION ALL
SELECT '_BCEDF' AS vname FROM dual
UNION ALL
SELECT '_\BCEDF' AS vname FROM dual
UNION ALL
SELECT 'XYCEG' AS vname FROM dual;


3.5 
CREATE TABLE L AS
SELECT 'left_1' AS str,'1' AS v FROM dual UNION ALL
SELECT 'left_2','2' AS v FROM dual UNION ALL
SELECT 'left_3','3' AS v FROM dual UNION ALL
SELECT 'left_4','4' AS v FROM dual;
/*右表*/
CREATE TABLE R AS
SELECT 'right_3' AS str,'3' AS v,1 AS status FROM dual UNION ALL
SELECT 'right_4' AS str,'4' AS v,0 AS status FROM dual UNION ALL
SELECT 'right_5' AS str,'5' AS v,0 AS status FROM dual UNION ALL
SELECT 'right_6' AS str,'6' AS v,0 AS status FROM dual;




3.10
CREATE TABLE emp_bonus (empno INT , received DATE , TYPE INT);
INSERT  INTO emp_bonus VALUES( 7934, DATE '2005-5-17', 1 );
INSERT  INTO emp_bonus VALUES( 7934, DATE '2005-2-15', 2 );
INSERT  INTO emp_bonus VALUES( 7839, DATE '2005-2-15', 3 );
INSERT  INTO emp_bonus VALUES( 7782, DATE '2005-2-15', 1 );


4.5
CREATE TABLE t1 AS 
SELECT '熊样,精神不佳' AS d1,
       '猫样,温驯听话' AS d2,
       '狗样,神气活现' AS d3,
       '鸟样,向往明天' AS d4,
       '花样,愿你快乐像花儿一样' AS d5
  FROM dual;




4.9
create table dupes (id integer, name varchar(10));
INSERT INTO dupes VALUES (1, 'NAPOLEON');
INSERT INTO dupes VALUES (2, 'DYNAMITE');
INSERT INTO dupes VALUES (3, 'DYNAMITE');
INSERT INTO dupes VALUES (4, 'SHE SELLS');
INSERT INTO dupes VALUES (5, 'SEA SHELLS');
INSERT INTO dupes VALUES (6, 'SEA SHELLS');
INSERT INTO dupes VALUES (7, 'SEA SHELLS');


5.6
CREATE OR REPLACE VIEW v AS
SELECT '123' as data FROM dual UNION ALL
SELECT 'abc' FROM dual UNION ALL
SELECT '123abc' FROM dual UNION ALL
SELECT 'abc123' FROM dual UNION ALL
SELECT 'a1b2c3' FROM dual UNION ALL
SELECT 'a1b2c3#' FROM dual UNION ALL
SELECT '3$' FROM dual UNION ALL


CREATE OR REPLACE VIEW v AS
SELECT 'A' as data FROM dual UNION ALL
SELECT 'AB' FROM dual UNION ALL
SELECT 'BA' FROM dual UNION ALL
SELECT 'BAC' FROM dual;


5.14
CREATE OR REPLACE VIEW v AS
SELECT REPLACE(mixed, ' ', '') AS mixed
  FROM (SELECT substr(ename, 1, 2) || CAST(deptno AS CHAR(4)) ||
               substr(ename, 3, 2) AS mixed
          FROM emp
         WHERE deptno = 10
        UNION ALL
        SELECT CAST(empno AS CHAR(4)) AS mixed FROM emp WHERE deptno = 20
        UNION ALL
        SELECT ename AS mixed FROM emp WHERE deptno = 30) x;


6.4
CREATE OR REPLACE VIEW V (id,amt,trx)
AS
SELECT 1, 100, 'PR' FROM dual UNION ALL
SELECT 2, 100, 'PR' FROM dual UNION ALL
SELECT 3, 50,   'PY' FROM dual UNION ALL
SELECT 4, 100, 'PR' FROM dual UNION ALL
SELECT 5, 200, 'PY' FROM dual UNION ALL
SELECT 6, 50,   'PY' FROM dual;


8.14
CREATE OR REPLACE VIEW emp_project(empno, ename, proj_id, proj_start, proj_end) AS
SELECT 7782, 'CLARK' , 1 , date '2005-06-16', date '2005-06-18' FROM dual UNION ALL
SELECT 7782, 'CLARK' , 4 , date '2005-06-19', date '2005-06-24' FROM dual UNION ALL
SELECT 7782, 'CLARK' , 7 , date '2005-06-22', date '2005-06-25' FROM dual UNION ALL
SELECT 7782, 'CLARK' , 10, date '2005-06-25', date '2005-06-28' FROM dual UNION ALL
SELECT 7782, 'CLARK' , 13, date '2005-06-28', date '2005-07-02' FROM dual UNION ALL
SELECT 7839, 'KING'  , 2 , date '2005-06-17', date '2005-06-21' FROM dual UNION ALL
SELECT 7839, 'KING'  , 8 , date '2005-06-23', date '2005-06-25' FROM dual UNION ALL
SELECT 7839, 'KING'  , 14, date '2005-06-29', date '2005-06-30' FROM dual UNION ALL
SELECT 7839, 'KING'  , 11, date '2005-06-26', date '2005-06-27' FROM dual UNION ALL
SELECT 7839, 'KING'  , 5 , date '2005-06-20', date '2005-06-24' FROM dual UNION ALL
SELECT 7934, 'MILLER', 3 , date '2005-06-18', date '2005-06-22' FROM dual UNION ALL
SELECT 7934, 'MILLER', 12, date '2005-06-27', date '2005-06-28' FROM dual UNION ALL
SELECT 7934, 'MILLER', 15, date '2005-06-30', date '2005-07-03' FROM dual UNION ALL
SELECT 7934, 'MILLER', 9 , date '2005-06-24', date '2005-06-27' FROM dual UNION ALL
SELECT 7934, 'MILLER', 6 , date '2005-06-21', date '2005-06-23' FROM dual;


9.1
CREATE OR REPLACE VIEW v(proj_id, proj_start, proj_end) AS
SELECT 1 , date '2005-01-01', date '2005-01-02' FROM dual UNION ALL
SELECT 2 , date '2005-01-02', date '2005-01-03' FROM dual UNION ALL
SELECT 3 , date '2005-01-03', date '2005-01-04' FROM dual UNION ALL
SELECT 4 , date '2005-01-04', date '2005-01-05' FROM dual UNION ALL
SELECT 5 , date '2005-01-06', date '2005-01-07' FROM dual UNION ALL
SELECT 6 , date '2005-01-16', date '2005-01-17' FROM dual UNION ALL
SELECT 7 , date '2005-01-17', date '2005-01-18' FROM dual UNION ALL
SELECT 8 , date '2005-01-18', date '2005-01-19' FROM dual UNION ALL
SELECT 9 , date '2005-01-19', date '2005-01-20' FROM dual UNION ALL
SELECT 10, date '2005-01-21', date '2005-01-22' FROM dual UNION ALL
SELECT 11, date '2005-01-26', date '2005-01-27' FROM dual UNION ALL
SELECT 12, date '2005-01-27', date '2005-01-28' FROM dual UNION ALL
SELECT 13, date '2005-01-28', date '2005-01-29' FROM dual UNION ALL
SELECT 14, date '2005-01-29', date '2005-01-30' FROM dual;


9.4
CREATE OR REPLACE VIEW Timesheets(task_id, start_date , end_date) AS
SELECT 1,  DATE '1997-01-01', DATE '1997-01-03' FROM dual UNION ALL
SELECT 2,  DATE '1997-01-02', DATE '1997-01-04' FROM dual UNION ALL
SELECT 3,  DATE '1997-01-04', DATE '1997-01-05' FROM dual UNION ALL
SELECT 4,  DATE '1997-01-06', DATE '1997-01-09' FROM dual UNION ALL
SELECT 5,  DATE '1997-01-09', DATE '1997-01-09' FROM dual UNION ALL
SELECT 6,  DATE '1997-01-09', DATE '1997-01-09' FROM dual UNION ALL
SELECT 7,  DATE '1997-01-12', DATE '1997-01-15' FROM dual UNION ALL
SELECT 8,  DATE '1997-01-13', DATE '1997-01-13' FROM dual UNION ALL
SELECT 9,  DATE '1997-01-15', DATE '1997-01-15' FROM dual UNION ALL
SELECT 10, DATE '1997-01-17', DATE '1997-01-17' FROM dual;


13.1
CREATE OR REPLACE VIEW v AS
SELECT 'xxxxxabc[867]xxx[-]xxxx[5309]xxxxx' msg FROM dual UNION ALL
SELECT 'xxxxxtime:[11271978]favnum:[4]id:[Joe]xxxxx' msg FROM dual UNION ALL
SELECT 'call:[F_GET_ROWS()]b1:[ROSEWOOD…SIR]b2:[44400002]77.90xxxxx' msg FROM dual UNION ALL
SELECT 'film:[non_marked]qq:[unit]tailpipe:[withabanana?]80sxxxxx' msg FROM dual UNION ALL
SELECT '[一][二][三]' msg FROM dual;


13.2
CREATE OR REPLACE VIEW v AS
SELECT 'ClassSummary' strings FROM dual UNION ALL
SELECT '3453430278' FROM dual UNION ALL
SELECT 'findRow 55' FROM dual UNION ALL
SELECT '1010 switch' FROM dual UNION ALL
SELECT '333' FROM dual UNION ALL
SELECT 'threes' FROM dual;




13.4
CREATE TABLE j1 AS
SELECT 1 AS col1 FROM dual;


CREATE TABLE j2 AS
SELECT 1 AS col1 FROM dual UNION ALL
SELECT 2 AS col1 FROM dual;


CREATE TABLE j3 AS
SELECT 3 AS col1 FROM dual UNION ALL
SELECT 4 AS col1 FROM dual;


CREATE TABLE j4 AS
SELECT 1 AS col1 FROM dual UNION ALL
SELECT 2 AS col1 FROM dual;


SELECT j1.col1, j2.col1, j3.col1, j4.col1
  FROM j1
  FULL JOIN j2 ON j2.col1 = j1.col1
  FULL JOIN j3 ON j3.col1 = j1.col1
  FULL JOIN j4 ON j4.col1 = j1.col1;


13.5
CREATE TABLE area AS
SELECT '重庆' AS 市, '沙坪坝' AS 区, '小龙坎' AS 镇 FROM dual UNION ALL
SELECT '重庆' AS 市, '沙坪坝' AS 区, '磁器口' AS 镇 FROM dual UNION ALL
SELECT '重庆' AS 市, '九龙坡' AS 区, '杨家坪' AS 镇 FROM dual UNION ALL
SELECT '重庆' AS 市, '九龙坡' AS 区, '谢家湾' AS 镇 FROM dual;




13.7
CREATE OR REPLACE VIEW X0(人员编号,开始时间,结束时间,类型,数值id) AS
SELECT 11, to_date('201305','yyyymm'), to_date('201308','yyyymm'), 1, 1 FROM dual UNION ALL
SELECT 11, to_date('201307','yyyymm'), NULL, 1, 2  FROM dual UNION ALL
SELECT 11, to_date('201301','yyyymm'), NULL, -1, 3  FROM dual UNION ALL
SELECT 11, to_date('201312','yyyymm'), NULL, 1, 4  FROM dual UNION ALL
SELECT 22, to_date('201305','yyyymm'), to_date('201306','yyyymm'), 1, 1 FROM dual UNION ALL
SELECT 22, to_date('201308','yyyymm'), to_date('201309','yyyymm'), 1, 2 FROM dual UNION ALL
SELECT 22, to_date('201312','yyyymm'), to_date('201312','yyyymm'), -1, 3 FROM dual UNION ALL
SELECT 22, to_date('201403','yyyymm'), NULL, 1, 4  FROM dual UNION ALL
SELECT 22, to_date('201405','yyyymm'), NULL, -1, 4  FROM dual UNION ALL
SELECT 33, to_date('201305','yyyymm'), to_date('201305','yyyymm'), 1, 1 FROM dual UNION ALL
SELECT 33, to_date('201307','yyyymm'), to_date('201307','yyyymm'), 1, 2 FROM dual UNION ALL
SELECT 33, to_date('201310','yyyymm'), NULL, -1, 3  FROM dual UNION ALL
SELECT 33, to_date('201312','yyyymm'), NULL, 1, 4 FROM dual;


14.31
DROP TABLE PROCS PURGE;
CREATE TABLE PROCS(proc_id,anest_name,start_time,end_time) AS
SELECT 10, 'Baker', '08:00', '11:00' FROM dual UNION ALL
SELECT 20, 'Baker', '09:00', '13:00' FROM dual UNION ALL
SELECT 30, 'Dow'  , '09:00', '15:30' FROM dual UNION ALL
SELECT 40, 'Dow'  , '08:00', '13:30' FROM dual UNION ALL
SELECT 50, 'Dow'  , '10:00', '11:30' FROM dual UNION ALL
SELECT 60, 'Dow'  , '12:30', '13:30' FROM dual UNION ALL
SELECT 70, 'Dow'  , '13:30', '14:30' FROM dual UNION ALL
SELECT 80, 'Dow'  , '18:00', '19:00' FROM dual;




14.32
/*病人对医疗机构提出法律索赔,记录表为Claims*/
CREATE OR REPLACE VIEW Claims(索赔号, 患者) AS 
SELECT 10, 'Smith' FROM DUAL UNION ALL
SELECT 20, 'Jones' FROM DUAL UNION ALL
SELECT 30, 'Brown' FROM DUAL;


/*每一项索赔都有一个或多个被告(defendant),通常都是医生,记录表为Defendants*/
CREATE OR REPLACE VIEW Defendants(索赔号, 被告) as
SELECT 10, 'Johnson' FROM DUAL UNION ALL 
SELECT 10, 'Meyer'   FROM DUAL UNION ALL 
SELECT 10, 'Dow'     FROM DUAL UNION ALL 
SELECT 20, 'Baker'   FROM DUAL UNION ALL 
SELECT 20, 'Meyer'   FROM DUAL UNION ALL 
SELECT 30, 'Johnson' FROM DUAL;


/*每个与索赔相关的被告都有法律事件历史,当某项索赔的被告索赔状态发生变化时,都会记录下来*/
CREATE OR REPLACE VIEW LegalEvents(索赔号, 被告, 索赔状态, change_date) as
SELECT 10, 'Johnson', 'AP', date '1994-01-01' from dual union all 
SELECT 10, 'Johnson', 'OR', date '1994-02-01' from dual union all 
SELECT 10, 'Johnson', 'SF', date '1994-03-01' from dual union all 
SELECT 10, 'Johnson', 'CL', date '1994-04-01' from dual union all 
SELECT 10, 'Meyer'  , 'AP', date '1994-01-01' from dual union all 
SELECT 10, 'Meyer'  , 'OR', date '1994-02-01' from dual union all 
SELECT 10, 'Meyer'  , 'SF', date '1994-03-01' from dual union all 
SELECT 10, 'Dow'    , 'AP', date '1994-01-01' from dual union all 
SELECT 10, 'Dow'    , 'OR', date '1994-02-01' from dual union all 
SELECT 20, 'Meyer'  , 'AP', date '1994-01-01' from dual union all 
SELECT 20, 'Meyer'  , 'OR', date '1994-02-01' from dual union all 
SELECT 20, 'Baker'  , 'AP', date '1994-01-01' from dual union all 
SELECT 30, 'Johnson', 'AP', date '1994-01-01' from dual;


/*对于每个被告索赔状态的变化按照法律制定的已知顺序进行,如下面的Claim状态表所示*/
CREATE OR REPLACE VIEW ClaimStatusCodes(索赔状态, 索赔状态描述, 顺序) as
SELECT 'AP', 'Awaiting review panel' , 1 from dual union all
SELECT 'OR', 'Panel opinion rendered', 2 from dual union all
SELECT 'SF', 'Suit filed'            , 3 from dual union all
SELECT 'CL', 'Closed'                , 4 from dual;


14.33
DROP TABLE supparts;
CREATE TABLE supparts(
供应商编码 CHAR(2) not null,
零件编码 CHAR(2) not null,
PRIMARY KEY (供应商编码,零件编码));


INSERT INTO supparts
SELECT '1', '1' FROM dual UNION ALL
SELECT '1', '2' FROM dual UNION ALL
SELECT '1', '3' FROM dual UNION ALL
/**/
SELECT '2', '3' FROM dual UNION ALL
SELECT '2', '4' FROM dual UNION ALL
SELECT '2', '5' FROM dual UNION ALL
/**/
SELECT '3', '1' FROM dual UNION ALL
SELECT '3', '2' FROM dual UNION ALL
SELECT '3', '3' FROM dual UNION ALL
/**/
SELECT '4', '1' FROM dual UNION ALL
SELECT '4', '0' FROM dual UNION ALL
SELECT '4', '3' FROM dual UNION ALL
/**/
SELECT '5', '1' FROM dual UNION ALL
SELECT '5', '2' FROM dual UNION ALL
SELECT '5', '5' FROM dual UNION ALL
/**/
SELECT '6', '1' FROM dual UNION ALL
SELECT '6', '4' FROM dual UNION ALL
SELECT '6', '5' FROM dual;


14.34
DROP TABLE PilotSkills;
CREATE TABLE PilotSkills/*飞行员技能*/
(飞行员 CHAR(15) NOT NULL,
 飞机 CHAR(15) NOT NULL, 
 PRIMARY KEY (飞行员, 飞机));


INSERT INTO PilotSkills 
SELECT 'Celko', 'Piper Cub' FROM DUAL UNION ALL 
SELECT 'Higgins', 'B-52 Bomber' FROM DUAL UNION ALL 
SELECT 'Higgins', 'F-14 Fighter' FROM DUAL UNION ALL 
SELECT 'Higgins', 'Piper Cub' FROM DUAL UNION ALL 
SELECT 'Jones', 'B-52 Bomber' FROM DUAL UNION ALL 
SELECT 'Jones', 'F-14 Fighter' FROM DUAL UNION ALL 
SELECT 'Smith', 'B-1 Bomber' FROM DUAL UNION ALL 
SELECT 'Smith', 'B-52 Bomber' FROM DUAL UNION ALL 
SELECT 'Smith', 'F-14 Fighter' FROM DUAL UNION ALL 
SELECT 'Wilson', 'B-1 Bomber' FROM DUAL UNION ALL 
SELECT 'Wilson', 'B-52 Bomber' FROM DUAL UNION ALL 
SELECT 'Wilson', 'F-14 Fighter' FROM DUAL UNION ALL 
SELECT 'Wilson', 'F-17 Fighter' FROM DUAL;


DROP TABLE Hangar;
CREATE TABLE Hangar/*飞机棚*/
(飞机 CHAR(15) PRIMARY KEY);


INSERT INTO Hangar
SELECT 'B-1 Bomber' FROM DUAL UNION ALL 
SELECT 'B-52 Bomber' FROM DUAL UNION ALL 
SELECT 'F-14 Fighter'  FROM DUAL;


14.37
DROP TABLE t
/
create table t (a varchar2(30),b varchar2(30),c varchar2(30),d varchar2(30) );
insert into t values('门店1','品牌1','2','8');
insert into t values('门店1','品牌2','3','6');
insert into t values('门店1','品牌3','2','10');
insert into t values('门店2','品牌1','1','4');
insert into t values('门店2','品牌2','4','8');
insert into t values('门店2','品牌3','4','20');
insert into t values('门店3','品牌1','3','12');
insert into t values('门店3','品牌2','2','4');
insert into t values('门店3','品牌3','1','5');
/




14.49
DROP TABLE T PURGE;
CREATE TABLE t AS
SELECT '2' AS col1 ,'4' AS col2 FROM dual UNION ALL
SELECT '1' AS col1 ,'5' AS col2 FROM dual UNION ALL
SELECT '1' AS col1 ,'5' AS col2 FROM dual UNION ALL
SELECT '2' AS col1 ,'5' AS col2 FROM dual UNION ALL
SELECT '3' AS col1 ,'3' AS col2 FROM dual UNION ALL
SELECT '12' AS col1, '16' AS col2 FROM dual UNION ALL
SELECT '11' AS col1 ,'15' AS col2 FROM dual UNION ALL
SELECT '13' AS col1 ,'13' AS col2 FROM dual UNION ALL
SELECT '12' AS col1 ,'17' AS col2 FROM dual;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
查询优化是数据库性能优化的重要环节之一,而优化改写技巧是提高查询性能的关键手段之一。在Oracle数据库中,有许多查询优化改写技巧案例可以借鉴。 首先,可以利用索引来提高查询性能。索引是数据库中的一种数据结构,它可以加速查询操作。可以通过创建适当的索引来改进查询的执行计划,从而提高查询性能。例如,对于常见的查询字段,可以创建相应的索引,以减少全表扫描的开销。 其次,可以通过优化查询语句来改善查询性能。优化查询语句包括使用合适的JOIN操作、使用子查询和内联视图等。例如,可以使用内联视图来减少查询中的步骤,从而提高查询性能。 此外,可以通过调整数据库参数来改善查询性能。在Oracle数据库中,有许多参数可以配置,以适应不同的查询工作负载。通过合理地配置这些参数,可以提高查询的响应速度。例如,可以调整SGA(System Global Area)和PGA(Program Global Area)的大小,以适应不同的查询需求。 最后,可以通过使用数据库查询优化工具来改善查询性能。Oracle提供了一些查询优化工具,如Explain Plan、SQL Tuning Advisor和Automatic SQL Tuning等。这些工具可以帮助诊断查询性能问题,并提供相应的优化建议。通过使用这些工具,可以快速定位问题并进行优化改写。 总的来说,Oracle查询优化改写技巧案例2.0 PDF提供了一些实用的优化方法和案例,可以帮助开发人员和数据库管理员提高查询性能。通过对这些技巧案例的学习和实践,我们可以更好地优化查询性能,提高数据库的整体性能。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值