在我们的sitecore 6.6.0(rev.130404)项目中,我们需要将数据从旧系统的数据库迁移到sitecore数据库。我们需要迁移大约650,000个对象。旧数据库中的每个对象都将在master数据库中创建大约4个sitecore项。因此,迁移的数据量相当大。
我们已将sitecore API与Windows应用程序连接起来,我们从该应用程序运行数据迁移逻辑。在数据迁移开始时,事情相当快,每秒大约4个对象被传输到sitecore主数据库。前10,000个物体只用了40分钟。按照这个速度,人们可以预测,在7个小时内,将迁移100,000个物体。
但问题是随着时间的推移,事情变得越来越明显。迁移了大约100,000个对象后,现在只需要大约7个小时即可迁移30,000个对象。我甚至不时重建了sitecore数据库索引,如性能调优指南中所述。我们也不会执行任何sitecore查询来查找新创建的sitecore项目的放置位置。我们的数据迁移发生时,没有运行sitecore代理或lucene索引更新操作。
以下是数据迁移逻辑开头的代码:
using (new Sitecore.SecurityModel.SecurityDisabler())
using (new Sitecore.Data.Proxies.ProxyDisabler())
using (new Sitecore.Data.DatabaseCacheDisabler())
using (new Sitecore.Data.BulkUpdateContext())
这种缓慢的原因可能是sitecore数据库索引的增长。我不是SQL专家,但经过一些阅读,我收到了关于索引运营统计数据的报告。我不确定数字是否表明我们问题的原因。
有没有比我更好的sitecore / sql知识的人,请帮忙吗?
编辑:经过多次挖掘后,我得到了sql server latches的统计信息(不太了解那些)。
由于
答案 0 :(得分:4)
经过几天繁琐的调查后,我发现了这种缓慢的根本原因。这不是因为数据库索引。问题是sitecore Database.GetItem(<item path>)
类中的MediaCreator
方法调用。 (我们的数据迁移包括创建图像项目)
在我们网站的sitecore树中,有些项目下有相当多(数万)的孩子。虽然不建议大号没有。 sitecore中的项目,这是我们项目的正确设计。如果我们对其中一个子项进行GetItem(<item path>)
调用,则返回该项需要很长时间。显然GetItem()
使用项目路径比通过ID获取要慢得多。遗憾的是,我们无法控制这种情况,因为sitecore MediaCreator使用项目路径来创建媒体项目。
通过使用dotPeek,我能够调查sitecore源代码并创建了一个版本的MediaCreator类,它没有使用GetItem()
的项目路径,数据迁移开始快速运行。
我将从sitecore论坛询问是否有任何方法可以在不重复MediaCreator
源代码的情况下克服此性能问题。
答案 1 :(得分:2)
您应该首先看到的是:
在迁移期间禁用所有索引
包装您的自定义逻辑 into:SecurityDisabler(),EventDisabler(),ProxyDisabler()
SQL服务器性能可能是问题 - 确保设置正确 数据库增长的价值 - https://www.simple-talk.com/sql/database-administration/sql-server-database-growth-and-autogrowth-settings/
此外,请在此处查看类似问题:Optimisation tips when migrating data into Sitecore CMS
答案 2 :(得分:0)
您可以将媒体创建者路径散列为唯一的guid。然后你可以使用guids作为查找值。
也不要忘记运行“碎片整理”数据库索引的DB作业(SQL作业,我忘记了索引维护的正确名称,但这非常重要)。