背景
最近一个千万级的普通表,经常需要通过delete方式删除7天以前的数据,删除效率特别低,后面将该改表转化成按天创建的分区表,方面高效的删除数据,结果还是出现了一意外,少建了一个索引导致入库时慢了几百倍。
问题描述
研发反应的入库非常慢,去count这个分区表时确实慢,基本上是一秒一条记录。
排查思路
1、查看表上是否有触发器、序列
2、检查该SQL语句以及其执行计划
获取sql id
select * from v$sql where sql_text like '%表名%'
根据SQL ID查看执行计划
select * from v$sql_plan where sql_id=
或是直接从研发那里查看sql
最后发现该条SQL语句是merge操作,插入时先根据某一个字段判断记录是否存在,如果不存在做插入操作。
总结
1、思维局限了,之前只考虑了insert方式入库,后面通过v$sql抓取到SQL语句看到执行计划才发现问题所在。
2、转化为分区表时少创建索引问题
3、删除分区表时全局索引会失效,需要重新rebuild索引。