要定期更新Oracle收集的统计信息,您可以使用数据库中的DBMS_STATS包
CREATE OR REPLACE PROCEDURE collect_stats AS
BEGIN
-- 收集表统计信息
DBMS_STATS.GATHER_TABLE_STATS(ownname => NULL, tabname => NULL, estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE);
-- 收集索引统计信息
DBMS_STATS.GATHER_INDEX_STATS(ownname => NULL, indname => NULL, estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE AUTO');
-- 收集系统统计信息
DBMS_STATS.GATHER_SYSTEM_STATS;
END;
/
DECLARE
job_id NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job_id, 'BEGIN collect_stats; END;', SYSDATE, 'sysdate + 7');
COMMIT;
END;
/
在这个例子中,我们创建了一个名为collect_stats
的存储过程,它会收集表、索引和系统统计信息。然后,我们创建了一个作业,每隔7天运行一次该存储过程。
注意:这个例子是基于Oracle 11g或更高版本的。如果您使用的是较旧的版本,可能需要使用DBMS_JOB包代替DBMS_SCHEDULER包来创建作业。
SELECT * FROM USER_JOBS WHERE JOB = job_id;
将job_id
替换为实际的作业ID。
通过这种方式,您可以确保Oracle数据库定期更新统计信息,从而提高查询性能。