2

在我们基于 sitecore 6.6.0 (rev. 130404) 的项目中,我们需要将数据从旧系统的数据库迁移到 sitecore 数据库。我们需要迁移大约 650,000 个对象。旧数据库中的这些对象中的每一个都将在主数据库中创建大约 4 个站点核心项目。所以这是一个相当大的数据集正在迁移。

我们已将 sitecore API 与 Windows 应用程序连接起来,并从该应用程序运行数据迁移逻辑。在数据迁移开始时,速度相当快,每秒大约有 4 个对象被传输到 sitecore 主数据库。前 10,000 个对象只用了 40 分钟。按照这个速度,可以预测在 7 小时内将迁移 100,000 个对象。

但问题是随着时间的推移,事情变得越来越缓慢。在迁移了大约 100,000 个对象后,现在仅迁移 30,000 个对象需要大约 7 个小时。我什至不时重建 sitecore 数据库索引,如性能调整指南中所述。我们也不执行任何站点核心查询来查找新创建的站点核心项目的放置位置。当我们的数据迁移发生时,没有任何站点核心代理或 lucene 索引更新操作正在运行。

这是数据迁移逻辑开头的代码:

using (new Sitecore.SecurityModel.SecurityDisabler())
using (new Sitecore.Data.Proxies.ProxyDisabler())
using (new Sitecore.Data.DatabaseCacheDisabler())
using (new Sitecore.Data.BulkUpdateContext())

这种缓慢的原因可能是站点核心数据库索引的增长。我不是 SQL 专家,但经过一番阅读,我得到了一份关于索引操作统计的报告。我不确定这些数字是否表明我们的问题的原因。

索引统计(为了节省空间,从统计报告中删除了一些表)

有比我更好的 sitecore/sql 知识的人可以帮忙吗?

编辑:经过更多的挖掘,我得到了 sql server 锁存器的统计信息(不太了解这些)。

SQL 服务器闩锁统计信息

谢谢

4

3 回答 3

4

经过几天乏味的调查,我发现了这种缓慢的根本原因。这不是因为数据库索引。问题是Database.GetItem(<item path>)sitecoreMediaCreator类中的方法调用。(我们的数据迁移包括创建图像项)

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

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

我将在 sitecore 论坛上询问是否有任何方法可以在不复制MediaCreator源代码的情况下克服这个性能问题。

于 2013-06-25T12:22:58.310 回答
2

您应该首先查看的是:

  1. 在迁移期间禁用所有索引

  2. 将您的自定义逻辑包装成:SecurityDisabler()、EventDisabler()、ProxyDisabler()

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

此外,请在此处查看类似问题:将数据迁移到 Sitecore CMS 时的优化提示

于 2013-06-23T15:17:54.470 回答
0

您可以将媒体创建者路径散列为唯一的 guid。然后您可能会使用 guid 作为查找值。

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

于 2013-07-01T17:15:04.453 回答