SQL 语句优化基础_第1页
SQL 语句优化基础_第2页
SQL 语句优化基础_第3页
SQL 语句优化基础_第4页
SQL 语句优化基础_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Oracle RDBMSSQL 语句优化集锦赵元杰2/30内容提要 v排序优化v简化SQL v避免SQL语句转换v几个内置函数v新SQL语句v避免数据类型转换v参考资源3/30排序的优化vOrder By v排序之能由CPU来完成v再快的CPU,也扛不住大数据量v这个语句先进行表扫描,然后n*log(n)v如果数据过多,则先在内存分组v如果 sql 列于索引,则通过员工相同 sal 组u可能很快得到结果可能很慢,如果存在大量的不同的sql 的话(除非sql采用IOT)SELECT * FROM Emps ORDER BY sal/4/30排序的优化vOrder By 调整 v除非必须进行排序,

2、一般不要用 再OrderBy这个语句v大量的 排序是相当浪费资源的,特别是内存v注意某些 RDBMS 默认下进行 Order By 5/30排序的优化vDISTINCT v选择相同的结果的其中一个;vSELECT DISTINCT sal FROM Emps ;语句vDISTINCT 产生排序v1)如果sal有索引,则从索引中取数据即可 v2)可能在磁盘进行反复排序,这样很昂贵v3) 产生一个不同 sal 值的 结构(B*Tree或Hash表)6/30排序的优化vGroup By vGROUP BY 要产生排序v如果 sql 列于有索引,则很快得到结果v如果 sql 列于无索引,则产生一个不同

3、 sal 值的 结构(B*Tree或Hash表SELECT sal, count(*)FROM EmpsGROUP BY sal/7/30排序的优化vGroup By与Materialized Views v如果 GROUP BY 操作大量的中间结果,而且速度很慢,可考虑:u可在实体视图中使用GROUP BYu然后直接查询结果8/30排序优化小结v排序操作建议: v尽量不要排序,除非结构集很小 v排序不要选择过多的列,一般不要超过3个以上列v不要对特别长的列进行排序v排序要与索引一起考虑,设计与使用9/3010g/11g排序深入问题v新排序算法: v从10gR2之后,oracle引入了新的排序

4、算法以减少排序时内存和CPU的消耗v新算法由参数_new_sort控制,默认为TRUE。新算法在以下几个方面进行了改进v新排序选择: v内存排序- 对于那些仅需要在内存中就可以完成的小数据集的排序,新算法需要更少的内存v合并排序- 初始化运行完成后,会保存初始数据集的键值到内存中,在进行数据集进行合并时,会根据键值来选择数据集。10/3010g/11g排序深入问题v_newsort_enabled参数: v隐含的参数_newsort_enabled 启用新的排序算法v使用ALTER SESSION SET _newsort_enabled=falsev_new_sort参数: v隐含的参数v参

5、数_new_sort控制,默认为TRUE11/3010g/11g排序深入问题v_new_sort_cost_estimate 内部内部参数: v是隐含的参数v不建议DBA修改 v参数默认为TRUE12/3010g/11g排序深入问题v_newsort_enabled 内部内部参数: v是隐含的参数v不建议DBA修改 v参数默认为TRUE13/3010g/11g排序深入问题v_optimizer_sortmerge_join_enabled内部内部参数: v是隐含的参数,不建议DBA修改 v参数默认为TRUE14/3010g/11g排序深入问题v_optimizer_sortmerge_join

6、_inequality内部内部参数: v是隐含的参数,不建议DBA修改 v参数默认为TRUE15/3010g/11g排序深入问题v11g 版本_new_sort参数默认为TRUE v用 show parameter sort 命令可看到排序有关的参数:连接到:Oracle Database 11g Enterprise Edition Release .0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQLSQL show param

7、eter sortNAME TYPE VALUE- - -_new_sort_cost_estimate boolean TRUE_optimizer_sortmerge_join_inequality boolean TRUEnls_sort stringsort_area_retained_size integer 0sort_area_size integer 65536SQL16/3010g/11g排序深入问题v会话级修改排序参数 v使用触发器实现:-this is my triggerCREATE OR REPLACE TRIGGER system.set_lmid_seqAFTER

8、LOGONON DATABASEBEGINexecute immediate(ALTER SESSION SET _newsort_enabled=false);END;/-this is the modified triggerCREATE OR REPLACE TRIGGER system.sort_eb_tAFTERLOGONON DATABASEDECLAREsqlstr VARCHAR2(200) := alter session set _newsort_enabled=false;BEGINIF (USER = USER_NAME ) THENexecute immediate

9、sqlstr;END IF;END;/17/30内容提要 v排序优化v简化SQL v避免SQL语句转换v几个内置函数v新SQL语句v避免数据类型转换v参考资源SELECT 调整v应避免查询到不需要的数据.v避免查询文字性的内容、常数、及以及知道的数据v谨慎使用DISTINCT 子句进行查询列表v要计算SQL 语句的运行时间以便忽略不必要的选项WHERE调整v 在可能情况下,WHERE使用Hsah或位图索引和 B+-tree 索引.v 在可能情况下, 测试WHERE 子句性能. 在 CBO下,使用少量的文字性可改善性能.v 计算SQL 运行时间很有用(动态SQL) ,以避免WHERE 子句的计算

10、(如CASE 语句).v 多数 DBMS, SQL 语句中的 WHERE 子句的顺序是执行的顺序避免WHERE 子句带函数v 避免在 WHERE 子句中使用函数, 比如:vWHERE UPPER(loc) = BOSTONvWHERE SQRT(area) 3.0vWHERE my_function(sal) = 5v 如何克服这些不足:v以大写方式存储以消除 UPPERv使用转换函数,如: WHERE area 9.0v增加带函数的衍生列,对这些列建立索引,然后查询:uWHERE my_function_col = 5v使用函数索引(function index)uCREATE INDEX

11、. ON Emps( my_function( sal ) )WHERE 子句中的LIKEv尽量避免LIKE, 特殊情况将% 方在后面, 因为系统强制索引扫描.WHERE ename LIKE GEO% 可在enamel使用 B-tree 索引WHERE ename LIKE %RGE 会扫描全索引或表.vLIKE 通常是数据库或原型上使用,很少在生产系统上使用只返回需要的数据v从查询返回大量数据是相当昂贵的:DBMS 服务资源Network 资源Client 资源v从中间件返回必要的数据:一般的SQL不容易实现要使用存储过程(stored procedure).23/30内容提要 v排序优化

12、v简化SQL v避免SQL语句转换v几个内置函数v新SQL语句v避免数据类型转换v参考资源24/30建议的书写方法v 不要用 Select * from : v在SQL可以用,建议不要在程序中用:SELECT id, first_name, last_name, age, subject FROM student_details; -替换下面的写法:SELECT * FROM student_details;25/30建议的书写方法v from 后面有多个表时: v要用别名(Always use table aliases when your SQL statement involves mo

13、re than one source):-写法:;26/30建议的书写方法vOrder by 后加序号: vOrder By 用序号代替列名称(Do not use column numbers in the ORDER BY clause):-推荐的写法:SELECT OrderID, OrderDateFROM Orders ORDER BY 2-不推荐的写法:SELECT OrderID, OrderDate FROM Orders ORDER BY OrderDate27/30建议的书写方法vInsert 要指定列名: v表名中要指定列名称(Always use a column li

14、st in your INSERT statements):-推荐的写法推荐的写法:CREATE TABLE EUROPEANCOUNTRIES ( Countryid INT PRIMARY KEY, Countryname VARCHAR(25) )-INSERT INTO EuropeanCountries(CountryID, CountryName)VALUES (1, England)/-不推荐的写法不推荐的写法:/-INSERT INTO EuropeanCountriesVALUES (1, Ireland)28/30建议的书写方法v谨慎使用 HAVING: vHaving 是

15、对已经查询出的结果进行处理:-用SELECT subject, count(subject) FROM student_details WHERE subject != Science AND subject != Maths GROUP BY subject; 替代下面的语句:SELECT subject, count(subject) FROM student_details GROUP BY subject HAVING subject!= Vancouver AND subject!= Toronto; 29/30建议的书写方法v减少过多的子查询: v过多的子查询可精简一下:-用SEL

16、ECT name FROM employee WHERE (salary, age ) = (SELECT MAX (salary), MAX (age) FROM employee_details) AND dept = Electronics; -替代下面的语句:SELECT name FROM employee WHERE salary = (SELECT MAX(salary) FROM employee_details) AND age = (SELECT MAX(age) FROM employee_details) AND emp_dept = Electronics;30/30

17、建议的书写方法v合理使用 EXISTS, IN 与 表连接: va) 通常 IN 最慢 vb) IN 在 过滤掉关键的子查询时效率高vc) EXISTS 过滤掉关键的主查询时效率高.:-用Select * from product p where EXISTS (select * from order_items o where duct_id = duct_id) -替代下面的语句: Select * from product p where product_id IN (select product_id from order_items 31/30建议的书写方法v1:

18、M 关系的表连接: v用 EXISTS 替代 DISTINCT:-用SELECT d.dept_id, d.dept FROM dept d WHERE EXISTS ( SELECT X FROM employee e WHERE e.dept = d.dept); -替代下面的语句: SELECT DISTINCT d.dept_id, d.dept FROM dept d,employee e WHERE e.dept = e.dept; 32/30建议的书写方法v用UNION ALL 置换 UNION: v用 :-用SELECT id, first_name FROM student_

19、details_class10 UNION ALL SELECT id, first_name FROM sports_team; -替代下面的语句: SELECT id, first_name, subject FROM student_details_class10 UNION SELECT id, first_name FROM sports_team;33/30建议的书写方法vWHERE 子句的使用: v注意有时这样可能效率有差异 :-用SELECT id, first_name, age FROM student_details WHERE age 10; -替代下面的语句: SEL

20、ECT id, first_name, age FROM student_details WHERE age != 10; 34/30建议的书写方法vLike 子句的使用: v用substr 不会使用索引:-用SELECT id, first_name, age FROM student_details WHERE first_name LIKE Chan%; -替代下面的语句: SELECT id, first_name, age FROM student_details WHERE SUBSTR(first_name,1,3) = Cha;35/30建议的书写方法vLike 与 NVL子句

21、的使用: vLike使用:-用SELECT id, first_name, age FROM student_details WHERE first_name LIKE NVL ( :name, %); -替代下面的语句: SELECT id, first_name, age FROM student_details WHERE first_name = NVL ( :name, first_name);36/30建议的书写方法v范围比较的使用: vMax 与 Min 使用:-用SELECT product_id, product_name FROM product WHERE unit_pr

22、ice BETWEEN MAX(unit_price) and MIN(unit_price) ;-替代下面的语句: SELECT product_id, product_name FROM product WHERE unit_price = MAX(unit_price) and unit_price = MIN(unit_price);37/30建议的书写方法v|使用: v|字符连接的使用:-用SELECT id, name, salary FROM employee WHERE dept = Electronics AND location = Bangalore; -替代下面的语句:

23、 SELECT id, name, salary FROM employee WHERE dept | location= ElectronicsBangalore; 38/30建议的书写方法v非列表达式的使用: v表达式越简单越好:-用SELECT id, name, salary FROM employee WHERE salary 25000; -替代下面的语句: SELECT id, name, salary FROM employee WHERE salary + 10000 ”的使用: v用“”比用“NOT=” 更好:-用SELECT id, first_name, age FRO

24、M student_details WHERE age 10; -替代下面的语句: SELECT id, first_name, age FROM student_details WHERE age NOT = 10;40/30建议的书写方法vDECODE的使用: v用decode有时不好:-用SELECT id FROM employee WHERE name LIKE Ramesh% and location = Bangalore; -替代下面的语句: SELECT DECODE(location,Bangalore,id,NULL) id FROM employee WHERE nam

25、e LIKE Ramesh%;41/30建议的书写方法vCase的使用: v9i开始引入,CASE样例:-建议用SELECT last_name, job_id, salary, (CASE WHEN job_id LIKE SA_MAN AND salary = 12000 THEN 15% WHEN job_id LIKE IT_PROG AND salary = 9000 THEN 12% ELSE NOT APPLICABLE END ) RaiseFROM employees;42建议的书写方法vCASE与DECODE: vCASE 要用WHEN, THEN, ELSE, 及 END

26、 :select distinct Decode(Category, A, Adult, F, Fiction, N, Non-Fiction, C, Children, Category)from BOOKSHELF;select distinct CASE Category when A then Adult when F then Fiction when N then Non-Fiction when C then Children else Category ENDfrom BOOKSHELF;43建议的书写方法v改善分析效率: v加别名可提高些效率v不良的语句: 较好的语句:SEL

27、ECT first_name, last_name, country FROM employee, countries WHERE country_id = id AND lastname = HALL;SELECT e.first_name, e.last_name, c.country FROM employee e, countries c WHERE e.country_id = c.id AND e.last_name = HALL;44/30内容提要 v排序优化v简化SQL v避免SQL语句转换v几个内置函数v新SQL语句v避免数据类型转换v参考资源2021年年10月月16日日45

28、/70不推荐语句-SYSDATE vOracle内置函数SYSDATE产生意些开销 :vSYSDATE可在循环开始时用,在循序尽量避免,如下面量个例子:DECLARELv_current_date DATE;BEGINStop_watch.start_timer;FOR lv_count_num IN 1 . 10000 LOOPLv_current_date := TRUNC(SYSDATE);END LOOP;Stop_watch.stop_timer;END;/DECLARELv_current_date DATE := TRUNC(SYSDATE);Lv_final_date DATE

29、;BEGINStop_watch.start_timer;FOR lv_count_num IN 1 . 10000 LOOPLv_final_date := Lv_current_dateEND LOOP;Stop_watch.stop_timer;END;/2021年年10月月16日日46/70不推荐语句- MOD vOracle有些内置函数开销大,MOD是一个 :v在IF 中使用MOD,就产生不必要的开销vBEGINStop_watch.start_timer;FOR lv_count_num IN 1 . 10000 LOOPIF MOD(lv_count_num,1000) = 0

30、THEN;DBMS_OUTPUT.PUT_LINE(Hit 1000;Total: |lv_count_num)END LOOP;Stop_watch.stop_timer;END;/DECLARELv_count_inc_num PLS_INTEGER := 0 ;BEGINStop_watch.start_timer;FOR lv_count_num IN 1 . 10000 LOOPLv_count_inc_num := Lv_count_inc_num +1;IF lv_count_num=1000 THEN;DBMS_OUTPUT.PUT_LINE(Hit 1000;Total: |

31、lv_count_num)Lv_count_inc_num := 0;END IF;END LOOP;Stop_watch.stop_timer;END;/2021年年10月月16日日47/70推荐方法-DECODE函数 vOracle 所有版本都支持DECODE :vDECODE表示译码,可快速将某个列的值转换成对应的结果;vDECODE比IF THEN高效;vselect sid,serial#,username,DECODE(command,0,None,2,Insert,3,Select,6,Update,7,Delete,8,Drop,Other) cmmandfrom v$sess

32、ion where username is not null;2021年年10月月16日日48/70DECODE函数 注意vDECODE 注意:v要根据所访问表的列的编码进行译码,不要写错(DECODE译码并不检查列的值与转换的实际值);v在描述 DECODE 时,要逐个进行描述,不要漏掉个别的列的值,否则会导致判定式失败;v建议:将相关的数据字典表向开发人员公布,并进行明确的要求;v2021年年10月月16日日49/70推荐方法-巧用ROWID例子0v没有用ROWID例子:v先检索25,000个雇员的所有记录,为每个雇员计算新的工资,然后再更新雇员们的工资记录:DECLARECURSOR c

33、ur_employee ISSELECT employee_id, salaryFROM s_employee_test;lv_new_salary_num NUMBER;BEGINstop_watch.start_timer;FOR cur_employee_rec IN cur_employee LOOP- Determination of salary increaselv_new_salary_num := cur_employee_rec.salary;UPDATE s_employee_testSET salary = lv_new_salary_numWHERE employee

34、_id = cur_employee_rec.employee_id;END LOOP;COMMIT;stop_watch.stop_timer;END;/Total Time Elapsed: 1.71 sec Interval Time: 1.71 secPL/SQL procedure successfully completed.2021年年10月月16日日50/70推荐方法-巧用ROWID例子1v用ROWID进行迭代处理 :v在处理功能保持不变的前提下,将更新操作改变为基于ROWID的更新操作 :DECLARECURSOR cur_employee ISSELECT employee

35、_id, salary, ROWIDFROM s_employee_test;lv_new_salary_num NUMBER;BEGINstop_watch.start_timer;FOR cur_employee_rec IN cur_employee LOOP- Determination of salary increaselv_new_salary_num := cur_employee_rec.salary;UPDATE s_employee_testSET salary = lv_new_salary_numWHERE rowid = cur_employee_rec.ROWID

36、;END LOOP;COMMIT;stop_watch.stop_timer;END;/Total Time Elapsed: 1.45 sec Interval Time: 1.45 secPL/SQL procedure successfully completed.2021年年10月月16日日51/70推荐方法-巧用ROWID例子2vOracle ROWID可立即确定行的位置 :v用ROWID对表的相应行进行更新:DECLARECURSOR cur_employee IS SELECT empno,sal ,ROWID FROM EMP ;Lv_new_salary_num NUMBER

37、;BEGINStop_watch.start_timer;FOR cur_rec IN cur_employee LOOP-确定工资增长Lv_new_salary_num := cur_rec.salary ;UPDATE emp SET salary =lv_new_salary_numWHERE employee_id = cur_rec.ROWID;END LOOP;COMMIT;Stop_watch.stop_timer;END;/52/30内容提要 v排序优化v简化SQL v避免SQL语句转换v几个内置函数v新SQL语句v避免数据类型转换v参考资源2021年年10月月16日日53/7

38、09i/10g 新WITH 子句vselect 语句前先用with来查询出相应的数据块:v9i/10g允许用with 为一个子查询块分配一名字然后在SELECT语句使用该名字。Oracle 优化器将该名字当成内联视图或临时表来看待:SQL WITH SUMMARY as (SELECT dname,sum(sal) saltot, 2 round(avg(sal),2) avgsal, 3 count(distinct empno) nbremps 4 from emp join dept 5 on emp.deptno=dept.deptno 6 group by dname 7 ) 8 S

39、elect dname,nbremps,avgsal from SUMMARY 9 where saltot ( select sum(saltot)*.25 from SUMMARY ) 10* order by saltot DESC ;DNAME NBREMPS AVGSAL- - -ACCOUNTING 5 23307.62021年年10月月16日日54/70INSERT插入到多个表语句vOracle 9i/10g可支持INSERT语句 :vINSERT 插入多表v语法如下:INSERT ALL INTO t1 VALUES(.)INTO t2 VALUES(.).SELECT .或或

40、INSERT ALL|FIRSTWHEN c1 THEN INTO t1 VALUES(.)WHEN c2 THEN INTO t2 VALUES(.). ELSE INTO t3 VALUES(.)SELECT. 2021年年10月月16日日55/70插入多表-例子SQL insert all 2 into sal_history values(empno,hiredate,sal) 3 into mgr_history values(empno, mgr, sal) 4 select empno empno, hiredate hiredate,sal sal,mgr mgr 5 from

41、 emp where sal2000;已创建已创建12行。行。 SQL select * from sal_history; EMPID HIREDATE SAL- - - 7566 02-4月月 -81 2975 7698 01-5月月 -81 2850 7782 09-6月月 -81 2450 7788 19-4月月 -87 3000 7839 17-11月月-81 5000 7902 03-12月月-81 3000已选择已选择6行。行。vINSERT插入多个表例子1:v无条件(带ALL)的INSERT:2021年年10月月16日日56/70多表插入例子 Insert first when

42、 job=SALESMAN then Into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) Values (empno,ename,job,mgr,hiredate,sal,comm,deptno) Into bonus (ename,job,sal comm) Values (ename,job,sal comm) else into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) Values (empno,ename,job,mgr,hiredate,sal,comm,dept

43、no)Select empno,ename,job,mgr hiredate,sal,comm,deptno From newemp;vINSERT插入多个表例子2:v条件(带FIRST)的INSERT:2021年年10月月16日日57/70MERGE语句vMERGE语句的UPDATE和INSERT从句:v 9i 的MERGE语句要求指定Insert和Update从句- 使用使用merge语句加语句加WHERE从句可实现更新与插入操作:从句可实现更新与插入操作:SQLMERGE INTO products p USING newproducts npON ( duct_id = np

44、.product_id )WHEN MATCHED THEN UPDATE SET duct_name= duct_name,p.category = np.category WHERE p.category = DVDWHEN NOT MATCHED THEN INSERT VALUES (duct_name, duct_name, np.category ) WHERE np.category != BOOKS ; SQLselect * from productsPRODUCT_ID PRODUCT_NAME CATEGORY- - -1501

45、 VIVITAR 35MM ELECTRNCS 1502 OLMPUS CAMERA ELECTRNCS 1600 PLAY GYM TOYS 1601 LAMAZE TOYS 1666 HARRY POTTR TOYS58/30内容提要 v排序优化v简化SQL v避免SQL语句转换v几个内置函数v新SQL语句v避免数据类型转换v参考资源预定义的 PL/SQL 数据类型1.Scalar TypesBINARY_DOUBLEBINARY_FLOATBINARY_INTEGERDECDECIMALDOUBLE PRECISIONFLOATINTINTEGERNATURALNATURALNNUMBE

46、RNUMERICPLS_INTEGERPOSITIVEPOSITIVENREALSIGNTYPESMALLINTCHARCHARACTERLONGLONG RAWNCHARNVARCHAR2RAWROWIDSTRINGUROWIDVARCHARVARCHAR22.Composite TypesRECORDTABLEVARRAY3.Reference TypesREF CURSORREF object_type4.LOB TypesBFILEBLOBCLOBNCLOBBOOLEANDATEINTERVALTIMESTAMPDECLARE n NUMBER;BEGIN n := n + 15; -

47、 converted n := n + 15.0; - not converted .END;避免隐含的数据类型转换vPL/SQL 在执行时隐含进行不同数据类型转换 vExample: 当传递 PLS_INTEGER 给 NUMBER 变量时stringsdatesnumbers理解 NOT NULL 约束vOracle 系统 对 Not Null 解释 :v非空值,必需有值vNULL 在 Oracle 系统是不能解释其意义的值,比如:uNULL=NULL是不成立的uNull+数字=NULLuNull|字符=字符SQL select 123+null from dual; 123+NULL-S

48、QL select abc|null from dual;AB-abc理解 NOT NULL 约束vNot Null 也影响到性能 :v10g/11g 多次循环-可将循环次数加大或减少 set timing onSQL DECLARE 2 value1 NUMBER NOT NULL := 0; 3 BEGIN 4 FOR cnt IN 0 . 1000000000 LOOP 5 value1 := 1; 6 END LOOP; 7 END; 8 /PL/SQL 过程已成功完成。已用时间: 00: 00: 31.26-可将循环次数加大或减少 set timing ondeclarevalue1

49、 number;beginfor cnt in 0 . 100000000 loopvalue1 := 1;end loop;if value1 is not null thennull;end if;end;/PL/SQL 过程已成功完成。已用时间: 00: 00: 16.78每次代入值前都要检测是否是非空只需要最后对NULL检查一次用 PLS_INTEGER 处理整数v处理整数( integer data)使用 PLS_INTEGER :vPLS_Integer比 integer 变量更高效vPLS_Integer比 INTEGER 或 NUMBER存储更省vPLS_Integer 在运行

50、时直接采用机器的算法(machine arithmetic), 这种算法比( library arithmetic)更快v可以替代整数的NUMBER型的变量定义,而实际的处理效率是比NUMBER型更快捷用 PLS_INTEGER 处理整数vPLS_INTEGER PL/SQL数据类型: v使用NUMBER类型的情况:SQL set serveroutput onSQL declare 2 ln_number number; 3 begin 4 dbms_output.put_line(to_char(SYSTIMESTAMP,yyyymmdd hh24:mi:ss.ff3); 5 for n_

51、row in 1.100000000 loop 6 ln_number := ln_number + 1; 7 end loop; 8 dbms_output.put_line(to_char(SYSTIMESTAMP,yyyymmdd hh24:mi:ss.ff3); 9* end;SQL /20110730 14:37:57.48420110730 14:38:00.453PL/SQL 过程已成功完成。用 PLS_INTEGER 处理整数vPLS_INTEGER PL/SQL数据类型: v使用PLS_INTEGER类型的情况:-优化后:用PLS_INTEGER:SQL declare 2

52、ln_number pls_integer; 3 begin 4 dbms_output.put_line(to_char(SYSTIMESTAMP,yyyymmdd hh24:mi:ss.ff3); 5 for n_row in 1.100000000 loop 6 ln_number := ln_number + 1; 7 end loop; 8 dbms_output.put_line(to_char(SYSTIMESTAMP,yyyymmdd hh24:mi:ss.ff3); 9 end; 10 /20110730 14:38:14.46820110730 14:38:16.890PL/SQL 过程已成功完成。使用 SIMPLE_INTEGER 数据类型vSIMPLE_INTEGER定义(11g):v是PLS_INTEGER重定义的子类型 v有效范围 2147483648 . 2147483648v不包括块NULL值vPL/SQL 允许 PLS_INTEGER 就可用SIMPLE_INTEGERv优点:v消除溢出检查过程v当采用本地编译时, SIM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论