Sql 分布式查询上是否禁用绑定窥视?
升级到Oracle11g后,我在优化Oracle查询时遇到了问题,这个问题开始让我有点恼火 注意,这个问题现在已经被完全编辑了,因为在创建了一个简单的测试用例之后,我有了更多的信息。原始问题可在此处找到: 这个问题是,当连接两个表时,其中一个表在日期列上具有Sql 分布式查询上是否禁用绑定窥视?,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,升级到Oracle11g后,我在优化Oracle查询时遇到了问题,这个问题开始让我有点恼火 注意,这个问题现在已经被完全编辑了,因为在创建了一个简单的测试用例之后,我有了更多的信息。原始问题可在此处找到: 这个问题是,当连接两个表时,其中一个表在日期列上具有between条件,如果查询连接到远程表,则不会发生绑定窥视 下面是一个帮助重现问题的测试用例。首先设置两个源表。第一个是日期列表,是一个月的第一天,可以追溯到三十年前 create table mike_temp_etl_control a
between
条件,如果查询连接到远程表,则不会发生绑定窥视
下面是一个帮助重现问题的测试用例。首先设置两个源表。第一个是日期列表,是一个月的第一天,可以追溯到三十年前
create table mike_temp_etl_control
as
select
add_months(trunc(sysdate, 'MM'), 1-row_count) as reporting_date
from (
select level as row_count
from dual
connect by level < 360
);
然后创建一个空表,以便在其中运行数据:
create table mike_temp_1
as
select
a.OWNER,
a.OBJECT_NAME,
a.SUBOBJECT_NAME,
a.OBJECT_ID,
a.CREATED,
b.REPORTING_DATE
from
mike_temp_dba_objects a
join mike_temp_etl_control b on (
b.reporting_date between add_months(a.created, -24) and a.created)
where 1=2;
然后运行代码。您可能需要创建一个更大版本的mike_temp_dba_对象来降低查询速度(或者使用其他方法来获取执行计划)。当查询运行时,我通过运行select从会话中获取执行计划*
来自不同会话的表(dbms\u xplan.display\u cursor(sql\u id=>'xxxxxxxxxx'))
declare
pv_report_start_date date := date '2002-01-01';
v_report_end_date date := date '2012-07-01';
begin
INSERT /*+ APPEND */
INTO mike_temp_5
select
a.OWNER,
a.OBJECT_NAME,
a.SUBOBJECT_NAME,
a.OBJECT_ID,
a.CREATED,
b.REPORTING_DATE
from
mike_temp_dba_objects a
join mike_temp_etl_control b on (
b.reporting_date between add_months(a.created, -24) and a.created)
cross join dual@emirrl -- This line causes problems...
where
b.reporting_date between add_months(pv_report_start_date, -12) and v_report_end_date;
rollback;
end;
通过在查询中使用远程表,mike_temp_etl_控制表的基数估计值是完全错误的,并且绑定窥视似乎没有发生
上述查询的执行计划如下所示:
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
---------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | | | 373 (100)|
| 1 | LOAD AS SELECT | | | | |
|* 2 | FILTER | | | | |
| 3 | MERGE JOIN | | 5 | 655 | 373 (21)|
| 4 | SORT JOIN | | 1096 | 130K| 370 (20)|
| 5 | MERGE JOIN CARTESIAN| | 1096 | 130K| 369 (20)|
| 6 | REMOTE | DUAL | 1 | | 2 (0)|
| 7 | BUFFER SORT | | 1096 | 130K| 367 (20)|
|* 8 | TABLE ACCESS FULL | MIKE_TEMP_DBA_OBJECTS | 1096 | 130K| 367 (20)|
|* 9 | FILTER | | | | |
|* 10 | SORT JOIN | | 2 | 18 | 3 (34)|
|* 11 | TABLE ACCESS FULL | MIKE_TEMP_ETL_CONTROL | 2 | 18 | 2 (0)|
---------------------------------------------------------------------------------------
如果我随后用本地版本替换远程双,我会得到正确的基数(139而不是2):
所以,我想问题是,我怎样才能得到正确的基数来进行估计?这是Oracle的错误还是预期的行为?我认为您应该把动态采样搞得一团糟。它在11g中的工作方式有所不同,因此可能是您遇到麻烦的原因。为了摆脱简单的东西,您是否已将其重新收集到桌面上?是的,统计数据应该都是最新的。明天我会再检查一遍。这是数据仓库ETL负载的一部分,所有数据都收集到了统计数据。我知道在版本>11.1中有一个bug,它有一个工作循环,其中包括将“_optim_peek_user_binds”参数设置为false。这可能会影响优化器,但我不知道具体如何影响。您可以检查此参数是否设置为true或false,它应该为true以获得最佳性能。该错误导致ORA-3137错误。@Gisli我可能想与_optim_peek_user_binds=false相反,因为它似乎不是在偷看。在我创建的一个跟踪文件中,该参数出现并设置为true。另外,我没有发现错误。我已经和我的DBA谈过(尽管我正在等待任何反馈),我开始认为这可能是一个bug。。。尤其是在缺乏答案的情况下。
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
---------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | | | 373 (100)|
| 1 | LOAD AS SELECT | | | | |
|* 2 | FILTER | | | | |
| 3 | MERGE JOIN | | 5 | 655 | 373 (21)|
| 4 | SORT JOIN | | 1096 | 130K| 370 (20)|
| 5 | MERGE JOIN CARTESIAN| | 1096 | 130K| 369 (20)|
| 6 | REMOTE | DUAL | 1 | | 2 (0)|
| 7 | BUFFER SORT | | 1096 | 130K| 367 (20)|
|* 8 | TABLE ACCESS FULL | MIKE_TEMP_DBA_OBJECTS | 1096 | 130K| 367 (20)|
|* 9 | FILTER | | | | |
|* 10 | SORT JOIN | | 2 | 18 | 3 (34)|
|* 11 | TABLE ACCESS FULL | MIKE_TEMP_ETL_CONTROL | 2 | 18 | 2 (0)|
---------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
-------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | | | 10682 (100)|
| 1 | LOAD AS SELECT | | | | |
|* 2 | FILTER | | | | |
| 3 | MERGE JOIN | | 152K| 19M| 10682 (3)|
| 4 | SORT JOIN | | 438K| 51M| 10632 (2)|
| 5 | NESTED LOOPS | | 438K| 51M| 369 (20)|
| 6 | FAST DUAL | | 1 | | 2 (0)|
|* 7 | TABLE ACCESS FULL| MIKE_TEMP_DBA_OBJECTS | 438K| 51M| 367 (20)|
|* 8 | FILTER | | | | |
|* 9 | SORT JOIN | | 139 | 1251 | 3 (34)|
|* 10 | TABLE ACCESS FULL| MIKE_TEMP_ETL_CONTROL | 139 | 1251 | 2 (0)|
-------------------------------------------------------------------------------------