Отличный способ клонировать довольно большое поддерево в базе данных? - PullRequest
3 голосов
/ 25 августа 2011

В настоящее время я пытаюсь оптимизировать производительность кода в приложении Windows Forms .NET 2.0, которое выполняет операции копирования объектов иерархической базы данных.

Вот пример структуры:

Example hierarchical structure

Каждый объект в дереве представлен строкой таблицы базы данных.Кроме того, для каждого объекта также есть несколько связанных «побочных объектов».Например, контрольный пример объект также имеет

  • 1..n разрешений
  • 1..n атрибутов
  • 1..n вложений
  • ...

Эти "побочные объекты" хранятся в отдельных таблицах базы данных.

Копирование деревьев

Пользователь приложений может выбрать элемент дерева, щелкнуть правой кнопкой мыши и выбрать «копировать», а затем вставить его позже в другую позицию дерева.

Эта операция копирует все дочерние объекты и все «побочные объекты» вновое местоположение.

С точки зрения базы данных это может быть несколько сотен или даже тысяч операторов SELECT и INSERT, в зависимости от размера дочернего дерева для копирования.

Изс точки зрения пользователя, отображается диалоговое окно прогресса, чтобы сохранить отзывчивость интерфейсаКроме того, большинство пользователей жалуются, что для выполнения операции «... простое копирование и вставка ...» требуется слишком много времени.

Оптимизация производительности

ИтакМоя цель - ускорить процесс.

Текущий алгоритм работает примерно так:

  1. Чтение объекта из БД.
  2. Сохранение этого объекта как новой записи в БД.
  3. Сделайте то же самое для всех «побочных объектов» для объекта.
  4. Рекурсивно сделайте то же самое для всех дочерних объектов объекта.

Как вы можете себе представить, для большогоколичество объектов, которое быстро суммируется с большим количеством операций с базой данных.

Поскольку у меня пока нет понятия о том, как оптимизировать (пакетные операции? но тогда как и для какого объекта?), мой вопросследующим образом.

Мой вопрос

Можете ли вы дать мне какие-либо советы / шаблоны / лучшие практики о том, как клонировать большое количество иерархически связанных объектов, как описано выше?

(в идеале, без учета базы данных, хотя в большинстве случаев бэкэнд является Microsoft SQL Server)

1 Ответ

1 голос
/ 25 августа 2011

Я предполагаю, что вы выполняете все операции клонирования в приложении .NET, которые вызывают многократные обращения к серверу базы данных?

Сначала убедитесь, что вы выполняете все свои операции клонирования в базе данных.и избегая этих поездок.Должна быть возможность сделать именно то, что вы делаете, но с использованием рекурсивной хранимой процедуры, просто переписав свой текущий алгоритм C # в SQL.Вы должны увидеть значительное повышение производительности.

Кто-то умнее меня может сказать, что это можно сделать с помощью одного запроса CTE, но этот пост , похоже, не позволяет этого сделать.Конечно, я не понимаю, как бы вы это сделали и сохранили отношения между новыми идентификаторами

...