考虑这种表格:
create table t (
id number, -- and many many other columns of course
record_date date -- the date when the rows is inserted
);
在此表中,我们每小时增加40万行。每小时,我们使用最后一小时的数据启动查询。一个SQL
,例如:
SELECT
...
FROM t
INNER JOIN ... -- t is joined with many other tables
INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
WHERE
t.record_date >= :my_current_date - 1/24
;
我们遇到的问题是,这种情况经常使计划不好。这是原因:
Oracle
计算表的统计信息时,会将max(record_date)
存储在名为 high_value 的统计信息中。因此,在启动SQL
时,Oracle
比较过滤器t.record_date >= :my_current_date - 1/24
并使用列record_date
的high_value,并认为几乎不会返回任何行(而不是返回400k)。 。因此,以下联接的优化效果不好...
在这种情况下最好的解决方案是什么?我可以使用一个提示例如...
答案 0 :(得分:0)
我使用了提示OPT_ESTIMATE(TABLE t MIN = 400000),到目前为止,它仍然有效。谢谢piezol!