在C#中执行Oracle Explain Plan

时间:2016-10-28 06:39:33

标签: c# oracle stored-procedures oracle11g

通常,执行sql语句的“解释计划”会导致将记录插入到plan_table中。当通过TOAD执行时,这对我来说很好。我的要求是通过我的c#应用程序(Oracle.DataAccess.Client lib)执行此操作。不幸的是,在TAD中执行的相同语句不会导致在C#中执行时将任何记录插入到plan_table中。

奇怪的是,我确信在C#中执行时会消耗plan_id序列,尽管没有记录插入表中。我可以通过在TOAD中执行新的解释计划来确认这一点,并注意到我基于通过C#尝试的次数跳过了plan_id序列。 Notice how it went from 44 to 50.

我特别需要解释计划的原因是我想在执行之前获取给定查询中涉及的表和列的列表。我考虑过语法分析,但考虑到plan_table记录包含我想要的数据,感觉就像重新发明轮子一样。

出于所有意图和目的,同一个用户登录TOAD和C#,所以我不怀疑有限的权限。我试着有没有提交。我还尝试将解释计划放在存储过程中,并在C#中调用相同的结果。 (在TOAD上按预期工作,但在C#上没有插入记录)。为了使它能够在存储过程中工作,我必须立即执行它。

myoracon.Open();
OracleCommand myoracom = myoracon.CreateCommand();
myoracom = new OracleCommand("explain plan set statement_id = 'xd' for select * from employee", myoracon);
OracleTransaction trx;
trx = myoracom.Connection.BeginTransaction();
myoracom.Transaction = trx;
myoracom.ExecuteNonQuery();
trx.Commit();
myoracon.Close();

所以,在这之后,我的问题如下:为什么C#中的解释计划不会导致记录插入到plan_table中,我该怎么做才能让它工作?

提前致谢!

2 个答案:

答案 0 :(得分:0)

解释计划写在特定表PLAN_TABLE中。您需要选择它才能查看确切的计划。查看Using EXPLAIN PLAN

EXPLAIN PLAN FOR
SELECT last_name FROM employees;
  

这解释了PLAN_TABLE表中的计划。然后,您可以选择   PLAN_TABLE的执行计划。如果你没有,这很有用   PLAN_TABLE中的任何其他计划,或者如果您只想查看最后一个计划   言。

在您的情况下,您将使用您设置的特定ID选择它。

所以你需要另一个与db的连接:

using(OracleConnection conn = new OracleConnection(oradb))
{
    conn.Open();
    OracleCommand cmd= conn.CreateCommand();
    cmd.Connection = conn;

    cmd.CommandText = @"Select * FROM Plan_Table Where ID=@ID";
    cmd.Parameters.AddWithValue("@ID", idWhichYouSpecify);

    DataTable tbl = new DataTable();

    using(OracleDataAdapter da = new OracleDataAdapter(cmd))
    {
        da.Fill(tbl);
    }
}

答案 1 :(得分:0)

您是否控制了表:TOAD_PLAN_TABLE您在哪个用户中运行 C#

上的脚本

如果它不存在,请在您的c#用户下创建它:

CREATE TABLE **your_user**.TOAD_PLAN_TABLE
(
  STATEMENT_ID       VARCHAR2(30 BYTE),
  PLAN_ID            NUMBER,
  TIMESTAMP          DATE,
  REMARKS            VARCHAR2(4000 BYTE),
  OPERATION          VARCHAR2(30 BYTE),
  OPTIONS            VARCHAR2(255 BYTE),
  OBJECT_NODE        VARCHAR2(128 BYTE),
  OBJECT_OWNER       VARCHAR2(30 BYTE),
  OBJECT_NAME        VARCHAR2(30 BYTE),
  OBJECT_ALIAS       VARCHAR2(65 BYTE),
  OBJECT_INSTANCE    INTEGER,
  OBJECT_TYPE        VARCHAR2(30 BYTE),
  OPTIMIZER          VARCHAR2(255 BYTE),
  SEARCH_COLUMNS     NUMBER,
  ID                 INTEGER,
  PARENT_ID          INTEGER,
  DEPTH              INTEGER,
  POSITION           INTEGER,
  COST               INTEGER,
  CARDINALITY        INTEGER,
  BYTES              INTEGER,
  OTHER_TAG          VARCHAR2(255 BYTE),
  PARTITION_START    VARCHAR2(255 BYTE),
  PARTITION_STOP     VARCHAR2(255 BYTE),
  PARTITION_ID       INTEGER,
  OTHER              LONG,
  DISTRIBUTION       VARCHAR2(30 BYTE),
  CPU_COST           INTEGER,
  IO_COST            INTEGER,
  TEMP_SPACE         INTEGER,
  ACCESS_PREDICATES  VARCHAR2(4000 BYTE),
  FILTER_PREDICATES  VARCHAR2(4000 BYTE),
  PROJECTION         VARCHAR2(4000 BYTE),
  TIME               INTEGER,
  QBLOCK_NAME        VARCHAR2(30 BYTE),
  OTHER_XML          CLOB
)
相关问题