我们正在运行 Oracle 数据库 11g 版本 11.2.0.2.0 - 64 位生产/
我们有以下查询,它是用户、user_learning 和 user_group 表之间的连接。
select u.user_id, u.first_name, u.surname, u.client_company_id, u.username,
ul.completion_status
from user u, user_learning ul
where
u.user_id = ul.user_id (+)
and (ul.enrolment_status = 'E' or ul.enrolment_status is null)
and upper(u.surname) like 'CART%'
and ((u.user_id is not null and (u.client_company_id in ('ABCDEF') )
and exists (select 1
from user_group g
where g.user_id = u.user_id
and g.group_id in
(215479,215480,221934,39901,45709,45710,45712,
45713,45714,45715,45716,45717,45718)
)
)
or (u.user_id = 1209289 or u.manager_id = 1209289)
)
order by u.client_company_id, u.surname, u.first_name, u.user_id;
此查询每次交替运行时给出 0 个结果和 198 个结果,有时返回 0 等。
一些关于表格的背景信息以及我们迄今为止所做的尝试,
-- Gives 1184415 records
select count(1) from user;
-- Gives 7789332 records
select count(1) from user_learning;
-- Gives 3278032
select count(1) from user_group;
用户表列 surname 上有一个索引,如下 CREATE INDEX IDX_USER_UPPER ON USER (UPPER("SURNAME")) USER_GROUP 包含 group_id 和 user_id 作为 PRIMARY KEY user_id 是 USER 表中的 PRIMARY KEY
我们注意到的是,当我们删除 IDX_USER_UPPER 索引并运行查询时,结果始终是一致的。但是拥有索引意味着一段时间后的结果是不一样的。我们对索引存有疑问,删除它并运行查询似乎会产生一致的结果,但这最多有一段时间,然后查询再次停止给出一致的结果。我们将 'CART%' 之类的大写(u.surname)更改为 'CAR%' 或 'CARTE%' 等......然后它慢慢开始表现得很奇怪,给出 0 条或更多条记录等。
解释计划指示何时使用索引,有时不使用索引。所以也许这个索引不是问题......??
我尝试收集索引的统计信息并重建索引
CREATE INDEX IDX_USER_UPPER ON USER (UPPER("SURNAME"))
alter index IDX_USER_UPPER compute statistics
alter index IDX_USER_UPPER rebuild
也运行了以下但仍然相同的效果,除了删除索引时它似乎工作了一段时间。
exec DBMS_STATS.gather_table_stats('SCHEMA', 'USER');
exec DBMS_STATS.gather_table_stats('SCHEMA', 'USER_LEARNING');
exec DBMS_STATS.gather_table_stats('SCHEMA', 'USER_GROUP');
exec DBMS_STATS.GATHER_INDEX_STATS ( 'SCHEMA', 'IDX_USER_UPPER');
-- note SCHEMA is our schema name
-- indicates Last_analysed is updated ...
select table_name, owner, to_char(last_analyzed, 'dd-mon-yyyy hh24:mi:ss')
from dba_tables
where table_name IN ('USER', 'USER_LEARNING', 'USER_GROUP')
我尝试的另一个选项是设置“_no_or_expansion”标志,如下所示,
alter session set "_no_or_expansion"=true;
-- no impact to the query though
(有时看起来当索引被删除时,查询会在 'CAR%'、"CART%'、'CARTE%'、'CARTER%' 被查询时不断返回一致的数据 - 奇怪)
但是奇怪的行为仍然存在任何想法或问题或解决方案,如果你们中的任何人遇到过类似的事情,请。
运行 select * from dba_autotask_client 显示
自动优化器统计信息收集已启用