通常,执行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中,我该怎么做才能让它工作?
提前致谢!
答案 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
)