[20120508]bad sql.txt

简介: [20120508]bad sql.txt1.昨天在优化一个程序外的sql,遇到这个帖子:http://www.itpub.net/thread-1495845-1-1.
[20120508]bad sql.txt

1.昨天在优化一个程序外的sql,遇到这个帖子:
http://www.itpub.net/thread-1495845-1-1.html
ORACLE8I升级11G R2后,查询系统视图特别慢

我的测试版本:
SQL> select * from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

我修改了sql语句,执行如下:
SELECT    f.constraint_name, f.owner, f.r_owner, p.table_name, SYS.all_cons_columns.column_name, f.delete_rule
    FROM SYS.all_constraints f, SYS.all_cons_columns, SYS.all_constraints p
   WHERE f.owner = 'SCOTT'
     AND f.table_name = 'EMP'
     AND f.constraint_type = 'R'
     AND SYS.all_cons_columns.constraint_name = f.constraint_name
     AND SYS.all_cons_columns.table_name = 'EMP'
     AND SYS.all_cons_columns.owner = 'SCOTT'
     AND p.owner = f.r_owner
     AND p.constraint_name = f.r_constraint_name
ORDER BY f.constraint_name, SYS.all_cons_columns.POSITION;

发现在11G下确实很慢,但是在3次执行时,速度明显变快。why?

原始链接是通过使用10GR2的SYS.ALL_CONSTRAINTS覆盖原来11G的定义来实现加速的。

对比两个定义如下:
23,24c23,40
---
>    SELECT ou.NAME, oc.NAME,
>           DECODE (c.type#,
>                   1, 'C',
>                   2, 'P',
>                   3, 'U',
>                   4, 'R',
>                   5, 'V',
>                   6, 'O',
>                   7, 'C',
>                   8, 'H',
>                   9, 'F',
>                   10, 'F',
>                   11, 'F',
>                   13, 'F',
>                   '?'
>                  ),
>           o.NAME, c.condition, ru.NAME, rc.NAME,
>           DECODE (c.type#, 4, DECODE (c.refact, 1, 'CASCADE', 2, 'SET NULL', 'NO ACTION'), NULL),
48c64,72
---
>      FROM SYS.con$ oc,
>           SYS.con$ rc,
>           SYS."_BASE_USER" ou,
>           SYS."_BASE_USER" ru,
>           SYS."_CURRENT_EDITION_OBJ" ro,
>           SYS."_CURRENT_EDITION_OBJ" o,
>           SYS.cdef$ c,
>           SYS.obj$ oi,
>           SYS.user$ ui
53c77,78
---
>       AND (c.type# 17)                                                      /* don't include supplog cons   */
>       AND (c.type# != 12)                                                                     /* don't include log group cons */


主要的不同 SYS."_CURRENT_EDITION_OBJ"与 SYS.obj$不同。SYS."_CURRENT_EDITION_OBJ"是一个视图,好像与这个Edition-Based Redefinition有关。
正是这样的复杂定义导致执行变得更加复杂。


2.当然修改视图定义问题不大,总之不好,问题是为什么第3次执行会快呢?
SQL> column a format a100
SQL> select sql_id,child_number,substr(sql_text,1,100) a from v$sql where sql_text like '%f.constraint_name%';
SQL_ID        CHILD_NUMBER A
------------- ------------ ----------------------------------------------------------------------------------------------------
gmzkkrbp9s3zb            0 SELECT    f.constraint_name, f.owner, f.r_owner, p.table_name, SYS.all_cons_columns.column_name, f.d
gmzkkrbp9s3zb            1 SELECT    f.constraint_name, f.owner, f.r_owner, p.table_name, SYS.all_cons_columns.column_name, f.d


可以发现执行计划生成了2个光标。查看执行计划:

SQL> select * from table(dbms_xplan.display_cursor('gmzkkrbp9s3zb',NULL));
....太长。
 100 - access("U2"."TYPE#"=2 AND "U2"."SPARE2"=TO_NUMBER(SYS_CONTEXT('userenv','current_edition_id')))
       filter(("U2"."TYPE#"=2 AND "U2"."SPARE2"=TO_NUMBER(SYS_CONTEXT('userenv','current_edition_id'))))
 101 - access("O2"."DATAOBJ#"=:B1 AND "O2"."TYPE#"=88 AND "O2"."OWNER#"="U2"."USER#")
 103 - access("U2"."TYPE#"=2 AND "U2"."SPARE2"=TO_NUMBER(SYS_CONTEXT('userenv','current_edition_id')))
       filter(("U2"."TYPE#"=2 AND "U2"."SPARE2"=TO_NUMBER(SYS_CONTEXT('userenv','current_edition_id'))))
 104 - access("O2"."DATAOBJ#"=:B1 AND "O2"."TYPE#"=88 AND "O2"."OWNER#"="U2"."USER#")

Note
-----
   - cardinality feedback used for this statement

可以发现 CHILD_NUMBER=1,使用11G的新特性cardinality feedback,执行计划发生了改变。这是这个原因导致执行计划第3次变快了。






目录
相关文章
|
4月前
|
SQL Java 数据库连接
解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
92 0
|
4月前
|
SQL Java 数据库连接
解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
65 0
|
3月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
2月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
52 13
|
2月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
2月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
43 6
|
24天前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
96 0
|
2月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
|
2月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
111 3
|
2月前
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。
下一篇
DDNS