Rails:rake db:migrate 在 Oracle 上*非常*慢

2024-04-11

我正在使用 Railsoracleenhanced适配器为遗留应用程序创建新接口。

数据库迁移工作成功,但在 rake 完成之前需要非常长的时间。数据库更改发生得非常快(1 或 2 秒),但是db/schema.db转储需要一个多小时才能完成。 (请参阅下面的示例迁移。)

这是一个相对较大的模式(大约 150 个表),但我确信不应该花这么长时间来转储每个表描述。

有没有办法通过只取最后一个来加快速度schema.db并将迁移中指定的更改应用于它?或者我可以完全跳过这个模式转储吗?

我明白这一点schema.db用于每次从头开始创建测试数据库,但在这种情况下,表触发器中有很大一部分数据库逻辑不包含在schema.rb无论如何,所以无论如何,rake 测试对我们来说都没有好处。 (这是一个完全不同的问题,我需要在其他时候解决。)



dgs@dgs-laptop:~/rails/voyager$ time rake db:migrate
(in /home/dgs/rails/voyager)
== 20090227012452 AddModuleActionAndControllerNames: migrating ================
-- add_column(:modules, :action_name, :text)
   -> 0.9619s
   -> 0 rows
-- add_column(:modules, :controller_name, :text)
   -> 0.1680s
   -> 0 rows
== 20090227012452 AddModuleActionAndControllerNames: migrated (1.1304s) =======


real    87m12.961s
user    0m12.949s
sys 0m2.128s
  

将所有迁移应用于数据库后,rake db:migrate 调用 db:schema:dump 任务以从当前数据库模式生成 schema.rb 文件。

db:schema:dump 调用适配器的“tables”方法来获取所有表的列表,然后为每个表调用“indexes”方法和“columns”方法。您可以在 activerecord-oracle_enhanced-adapter gem 的 oracle_enhanced_adapter.rb 文件中找到这些方法中使用的 SQL SELECT 语句。基本上它会从 ALL% 或 USER% 数据字典表中进行选择以查找所有信息。

最初,当我将原始 Oracle 适配器与具有许多不同模式的数据库一起使用时,我遇到了问题(因为性能可能会受到数据库中表总数的影响,而不仅仅是在您的模式中),因此我在 Oracle 增强型中做了一些优化适配器。最好找出您的情况下哪些方法速度慢(我怀疑它可能是为每个表执行的“索引”或“列”方法)。

调试此问题的一种方法是,将一些调试消息放入 oracle_enhanced_adapter.rb 文件中,以便您可以确定哪些方法调用花费了很长时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails:rake db:migrate 在 Oracle 上*非常*慢 的相关文章

随机推荐