Любая лучшая практика выполнения вставки записи таблицы с процедурой хранилища SQL CLR? - PullRequest
1 голос
/ 21 июля 2009

Недавно мы превратили набор сложной логики планирования на C # в хранимую процедуру SQL CLR (запущенную в SQL Server 2005). Мы полагали, что наш код является отличным кандидатом в SQL CLR, потому что:

  • Логика включает в себя тонны данных с сервера sQL.
  • Логика сложна и ее трудно выполнить с помощью TSQL
  • Нет потоков или синхронизации или доступа к ресурсам вне песочницы.

Результат нашего sp довольно хорош. Однако, поскольку выходные данные нашей логики представлены в виде нескольких таблиц данных, мы не можем просто вернуть один набор строк в качестве результата sp. Вместо этого, в нашем коде у нас есть много операторов «INSERT INTO ....» в циклах foreach, чтобы сохранить каждую запись из универсальной коллекции C # в таблицы SQL. Во время проверки кода кто-то выразил беспокойство по поводу того, может ли встроенный подход SQL INSERT в SQL CLR вызвать проблему производительности, и задался вопросом, есть ли другой лучший способ выгрузить данные (из наших общих коллекций C #).

Итак, есть предложения?

Ответы [ 2 ]

2 голосов
/ 21 июля 2009

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

...

Самый быстрый универсальный способ вставки данных используя стандартные конструкции ADO.NET

Теперь, когда медленный материал вышел из Кстати, давайте поговорим о каком-то хардкоре массовая загрузка. Помимо SqlBulkCopy и специализированные конструкции с участием ISAM или пользовательские классы массовой вставки от других провайдеров, просто нет бить грубую силу ExecuteNonQuery () для параметризованного Вставить заявление. Я продемонстрирую:

internal static void FastInsertMany(DbConnection cnn)
{

    using (DbTransaction dbTrans = cnn.BeginTransaction())
    {

        using (DbCommand cmd = cnn.CreateCommand())
        {

            cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)";

            DbParameter Field1 = cmd.CreateParameter();

            cmd.Parameters.Add(Field1);

            for (int n = 0; n < 100000; n++)
            {

                Field1.Value = n + 100000;

                cmd.ExecuteNonQuery();

            }

        }

        dbTrans.Commit();

    }

}
0 голосов
/ 21 июля 2009

Вы можете вернуть таблицу с 2 столбцами (COLLECTION_NAME nvarchar (max), CONTENT xml), заполненную таким количеством строк, сколько у вас есть внутренних коллекций. CONTENT будет XML-представлением данных в коллекции.

Затем вы можете использовать функции XML в SQL 2005/2008, чтобы анализировать XML каждой коллекции в таблицы и выполнять операторы INSERT INTO или MERGE для всей таблицы.

Это должно быть быстрее, чем отдельные ВСТАВКИ в вашем коде C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...