Posts

Showing posts with the label 外键

A New Collection of Thoughtful Learning Apps — Now Available on iOS & Android

Image
I’m excited to share a set of mobile apps I’ve recently completed and published on both the Google Play Store and the Apple App Store. These apps are designed with a simple goal in mind: to make meaningful, structured content more accessible, whether you’re studying theology or improving your English vocabulary. 📱 Now Available on Both Platforms All apps are live and available for download: Google Play Developer Page: https://play.google.com/store/apps/dev?id=5835943159853189043 Apple App Store Developer Page: https://apps.apple.com/ca/developer/q-z-l-corp/id1888794100 📖 Theology & Confession Study Apps For those interested in Reformed theology and classical Christian teachings, I’ve developed a series of apps that present foundational texts in a clean, focused reading format: The Belgic Confession Canons of Dort Heidelberg Catechism Westminster Shorter Catechism Each app is designed to provide a distraction-free experience, making it easier to read, reflect, and revisit these im...

一次数据清理引发的教训:缺失外键索引导致 DELETE 性能问题

Image
一次数据清理引发的教训:缺失外键索引导致 DELETE 性能问题 最近在做一次数据清理(data purge)时,我遇到了一个之前没有预料到的问题。 从业务逻辑上看,这只是一个很普通的 DELETE 操作,根据条件删除历史数据而已。 但实际执行时, DELETE 语句几乎卡住了 。 没有报错,看起来也在运行,但迟迟没有完成。 问题出在哪里? 在 DBA 的帮助下,我们开始从数据库层面分析这个问题。 最终发现,真正的原因是: 部分外键(Foreign Key)字段缺少对应的索引。 在 Oracle 中,当对父表执行 DELETE 操作时,数据库需要检查子表中是否存在 引用该记录的外键数据。 如果外键列没有索引,Oracle 就只能对子表做全表扫描。 当数据量变大时,这种全表扫描会极大地拖慢 DELETE 操作, 甚至导致长时间锁表,看起来就像 SQL “卡住”了一样。 解决方案 在确认问题后,我们为所有缺失的外键字段补充了索引(涉及多个关联表)。 效果非常明显: DELETE 操作执行速度大幅提升 锁定时间明显缩短 数据库整体负载显著下降 SQL 没变,数据没变,只是补了索引,结果却完全不同。 如何定位缺失的外键索引 DBA 使用下面的 SQL 来检查哪些外键约束没有对应的索引。 以下示例中,schema 名、表名和索引名均已做匿名处理。 WITH fk_constraints AS ( SELECT c.table_name, c.constraint_name AS fk_name, LISTAGG(c.column_name, ', ') WITHIN GROUP (ORDER BY c.position) AS fk_columns FROM dba_cons_columns c JOIN dba_constraints k ON k.constraint_name = c.constraint_name WHERE k...

安全数据清理:从大型 Oracle 表删除旧数据

Image
安全数据清理:如何从大型 Oracle 表中删除旧数据 为了遵守数据保留规定,我们定期清理旧数据。但是,从生产数据库删除数百万条记录需要非常谨慎。以下是我们的做法。 第一步:数据目录与计划 统计所有表并确定保留期限 与法律团队确认保留计划 与其他团队协作,识别下游依赖 第二步:备份表 删除前备份受影响表,确保出现问题时可以快速恢复。 第三步:理解表结构 先识别子表和父表。先删除子表,以避免外键约束错误。 第四步:批量删除 vs 直接删除 在 PT 环境中测试批量删除正常。但在生产环境中: 表超过 700 万行,需要删除超过 100 万行 20K 批量删除导致等待 1.5 小时并触发 FK 错误 出现自动回滚 现在采用增量删除: 每次删除 1 万条并提交 循环执行直到清理完成 速度慢但可控,易于定位 FK 错误 第五步:SQL 示例 -- 删除旧数据示例 SELECT '子表1', COUNT(*) FROM child_table_1 WHERE created_on < ADD_MONTHS(TRUNC(SYSDATE), -144); DELETE FROM child_table_1 WHERE created_on < ADD_MONTHS(TRUNC(SYSDATE), -144); COMMIT; DECLARE v_batch_size CONSTANT PLS_INTEGER := 20000; v_rows PLS_INTEGER; v_cutoff_date DATE := ADD_MONTHS(TRUNC(SYSDATE), -144); BEGIN LOOP DELETE FROM large_table WHERE created_on < v_cutoff_date AND ROWNUM <= v_batch_size; v...