有下一个分区表:
CREATE TABLE "ERMB_LOG_TEST_BF"."OUT_SMS"(
"TRX_ID" NUMBER(19,0) NOT NULL ENABLE,
"CREATE_TS" TIMESTAMP (3) DEFAULT systimestamp NOT NULL ENABLE,
/* other fields... */
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "ERMB_LOG_TEST_BF"
PARTITION BY RANGE ("TRX_ID") INTERVAL (281474976710656)
(PARTITION "SYS_P1358" VALUES LESS THAN (59109745109237760) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT …
Run Code Online (Sandbox Code Playgroud) sql oracle partitioning prepared-statement sql-execution-plan
开发时,我使用'test_1%'来查找'test_123'.但在生产环境中它不起作用.使用'escape'\''正在运行.是否需要在oracle中设置任何设置?我想在不逃避的情况下使用'\''.
我知道这似乎是一个简单的问题 - 您可能认为存在现有的答案。然而 ...
了解我希望它具有合理的性能,因此它允许记录执行的每个查询(或者至少是大查询),而无需太多开销。
我的第一个想法是这个查询:
select sid,serial#,prev_sql_id from v$session where audsid=userenv('sessionid');
Run Code Online (Sandbox Code Playgroud)
我的想法是,如果我在目标查询之后立即运行此命令,我将sql_id
通过 prev_sql_id 捕获正确的结果。
然而...我不是...我得到了不同的SQL...显然在我的目标 SELECT 语句和 的查询之间prev_sql_id
,运行了其他东西。在我的例子中,审计已启用,并且我正在将插入捕获到SYS.AUD$
表中。不好。
由于我这次尝试的主要目的是捕获查询的执行计划(因为它是由共享池执行和捕获的),所以我认为我可以简单地运行此查询:
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());
Run Code Online (Sandbox Code Playgroud)
文档指出,使用NULL
SQL_ID
as 参数,它将在最近运行的查询上运行解释计划。我希望这能解决之前的问题。然而......我得到了将完全相同的插入到SYS.AUD$
表中的计划。
您可能会说,好吧,那么只需在查询中添加注释即可轻松捕获SQL_ID
,如下所示:
SELECT /* SQL: 1234-12' */ FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
然后我可以尝试按如下方式查找 SQL_ID:
SELECT * FROM V$SQLAREA WHERE sql_text like '%SQL: 1234-12%';
Run Code Online (Sandbox Code Playgroud)
这将为我提供几个可能的候选者,其中V$SQLAREA
也包括查询本身。这里的问题是我需要随机化运行的每个查询,这会导致我总是进行硬解析。
我尝试过其他解决方案来回顾历史,但这需要付出更大的代价。我尝试寻找其他解决方案。他们似乎都在某种程度上落后了。
相关文章: