2013-06-23 90 views
2

在我们基于sitecore 6.6.0(rev。130404)的项目中,我们需要将数据从旧系统的数据库迁移到sitecore数据库。我们需要迁移650,000个物体。来自旧数据库的这些对象中的每一个都将在master数据库中创建大约4个sitecore项目。所以这是一组相当大的数据被迁移。Sitecore - 增加大号码时性能越来越差。的项目

我们将sitecore API与windows应用程序连接起来,并从该应用程序运行数据迁移逻辑。在数据迁移初期,情况非常快,每秒钟大约有4个对象被传输到sitecore master数据库。前10,000个对象只需要40分钟。按照这个速度,人们会预测在7个小时内将有10万个物体被迁移。

但问题是随着时间的推移,事情变得越来越慢,速度明显变慢。迁移了大约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专家,但经过一番阅读后,我得到了关于指数运营统计的报告。我不确定这些数字是否表明我们问题的原因。

Index statistics (some tables were removed from the statistics report to save space)

任何人可以用比我好Sitecore的/ SQL的知识,帮助这个吗?

编辑:经过多点挖掘后,我得到了sql服务器锁存器的统计数据(不太了解这些)。

SQL server latch statistics

感谢

回答

4

经过繁琐的调查几天我发现这种缓慢的根源。这不是因为数据库索引。问题是Database.GetItem(<item path>)在sitecore MediaCreator类中的方法调用。(我们的数据迁移包括图像项目的创建)

在我们网站的sitecore树中,有些项目有相当多的数量(数以万计)的子项。 Allthough不建议拥有大号。 sitecore中的项目,这是我们项目的正确设计。如果我们对其中一个子项目进行GetItem(<item path>)调用,则需要很长时间才能返回该项目。很显然GetItem()使用项目路径比通过ID获取要慢得多。不幸的是,我们无法控制这种情况,因为sitecore MediaCreator使用项目路径来创建媒体项目。

通过使用dotPeek,我能够调查sitecore源代码,并创建了一个版本的MediaCreator类,它不使用GetItem()的项目路径,并且数据迁移开始快速运行。

我打算从sitecore论坛询问是否有任何方法可以克服此性能问题,而不需要复制MediaCreator源代码。

+0

现在有点老了,但是您是否从Sitecore论坛获得了有关解决您的问题的其他方法的任何反馈? –

+1

Sitecore支持提到他们不支持在媒体库之外创建媒体项目,并且他们的代码未针对我们的用例进行优化。他们基本上说要遵循sitecore的最佳实践。但是这已经是Sitecore 6.5的一段时间了。我已经与Sitecore脱离了很长一段时间,所以事情可能现在已经改变了。但我记得我们设法使用重复的MediaCreator类来解决这个问题。 – ravinsp

2

你应该看的第一件事情是:

  1. 禁用迁移

  2. 包住您的定制逻辑 到时所有索引:SecurityDisabler (),EventDisabler(),ProxyDisabler()

  3. SQL服务器的性能可能是问题 - 确保数据库的增长设定适当 值 - https://www.simple-talk.com/sql/database-administration/sql-server-database-growth-and-autogrowth-settings/

而且,看到类似的问题在这里:Optimisation tips when migrating data into Sitecore CMS

+0

谢谢亚历山大。我们已经在我们的应用中遵循了这些优化技巧(包括链接中的那些技巧)。我也更新了我的帖子以反映这一点。随着进一步的研究和SQL统计,我被引导去相信我们的问题是否因为重复的SQL索引扫描。不幸的是,我不熟悉SQL服务器内部,因此不能从这些统计数据中获得任何意义。 – ravinsp

0

您可以将媒体创建者路径散列到唯一的GUID中。那么你可以使用guid作为查找值。

也不要忘记运行“碎片整理”您的数据库索引(SQL作业,我忘记了索引维护的正确名称,但它非常重要)的数据库作业。