Oracle日志表:兼顾快速插入与最新记录高效查询的优化咨询
日志表查询性能优化问题
我有一张日志表t_logs,数据量已达约1亿条,现在哪怕查询最新条目都要花很长时间。
我想找到一种高效方案:既能让最新记录(最大log_id值)的访问速度变快,又不影响插入(追加)操作的效率。 我尽量不想删除数据,目前已经有每月清理N天前日志的机制。
理想状态下,以下查询能瞬间完成(即使查询行数增加到500条也能保持高效):
select * from t_logs order by log_id desc fetch first 50 rows only
表结构定义
CREATE TABLE t_logs ( log_id NUMBER NOT NULL, method_name VARCHAR2(128 CHAR) NOT NULL, msg VARCHAR2(4000 CHAR) NOT NULL, type VARCHAR2(1 CHAR) NOT NULL, time_stamp TIMESTAMP(6) NOT NULL, user_created VARCHAR2(50 CHAR) DEFAULT user NOT NULL ); CREATE UNIQUE INDEX logs_pk ON t_logs ( log_id ) REVERSE; ALTER TABLE t_logs ADD ( CONSTRAINT logs_pk PRIMARY KEY ( log_id ) );
我不是专业DBA,对性能调优方法不太熟悉。因为经常要用到这张日志表,想找个不影响数据的解决办法。目前已经尝试重新计算统计信息/分析表,但没有效果,同时查看了执行计划:
------------------------------------------- | Id | Operation | Name | ------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | VIEW | | | 2 | WINDOW SORT PUSHED RANK| | | 3 | TABLE ACCESS FULL | T_LOGS | -------------------------------------------
我原本以为查询会利用索引来获取数据,为什么没生效?这是不是导致查询耗时久的原因?
数据库版本:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
已采纳的解决方案(Mr Cave提供)
alter table t_logs drop constraint logs_pk; drop index logs_pk; create unique index logs_pk on t_logs ( log_id ); alter table t_logs add ( constraint logs_pk primary key ( log_id ) );
现在查询速度极快,执行计划符合预期:
------------------------------------------------- | Id | Operation | Name | ------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | VIEW | | | 2 | WINDOW NOSORT STOPKEY | | | 3 | TABLE ACCESS BY INDEX ROWID| T_LOGS | | 4 | INDEX FULL SCAN DESCENDING| LOGS_PK | -------------------------------------------------
内容的提问来源于stack exchange,提问作者michelson
相关产品推荐
相关产品推荐

