【问题标题】:Oracle DDL statment ( like CTAS) , after executed, not show in V$SQLOracle DDL 语句(如 CTAS),执行后,不在 V$SQL 中显示
【发布时间】:2021-11-21 06:41:12
【问题描述】:

为什么 Oracle “DDL” 语句(如“CTAS”)在执行后不显示在 V$SQL 视图中? 怎样才能得到“SQL_ID”呢?我想在 SQl 计划基线中使用“SQL_ID”。 TNX

【问题讨论】:

    标签: sql oracle sql-execution-plan


    【解决方案1】:

    CTAS 操作出现在v$sql 视图中

    SQL> create table t1 as select * from dba_objects ;
    
    Table created.
    
    SQL> select sql_text,sql_id from v$sql where sql_text like '%create table t1 as select%' ;
    
    SQL_TEXT
    --------------------------------------------------------------------------------
    SQL_ID
    -------------
    create table t1 as select * from dba_objects
    4j5kv6x7cz5r7
    
    select sql_text,sql_id from v$sql where sql_text like '%create table t1 as selec
    t%'
    5n4xnjkt3vz3h
    

    SQL 计划基线是 SPM(SQL 计划管理)的一部分

    SQL 计划基线。计划基线是一组接受的计划, 允许优化器用于 SQL 语句。在典型的 用例,数据库只接受一个计划进入计划基线 在验证计划执行良好后。在这种情况下,一个计划 包括所有与计划相关的信息(例如,SQL 计划 标识符、提示集、绑定值和优化器环境) 优化器需要重现一个执行计划。

    如果您经常使用 CTAS,我猜您是在批处理模式下执行此操作,因此删除表,然后使用上述 CTAS 命令重新创建它。我宁愿尝试看看该语句的 SELECT 本身有什么问题。

    但 SQL 基线更侧重于解决可以修复和改进计划的查询,因为优化器并不总是选择最好的。

    【讨论】:

    • 我创建了一个测试表并在下面的查询中使用,但没有显示在 V$SQL 视图中 "select sql_text,sql_id from v$sql where sql_text like '%create table t1 as select%'" .我正在使用 Oracle 数据库 11g。
    • 当然不是。您的查询包含selec t%',它应该是select%
    【解决方案2】:

    V$SQL 仅显示 CTAS 的前 20 个字符。这是 Oracle 数据库 11g 中的一个错误。更多详情请见:(https://stackoverflow.com/questions/27623646/oracle-sql-text-truncated-to-20-characters-for-create-alter-grant-statements/28087571#28087571\)1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多