Aravindba Ответов: 1

Как увеличить скорость вставки объемных данных в таблицу ?


Привет,
Мы вставляем более 500000 строк из datatable в таблицу sql, перед использованием цикла for это занимает больше времени, и мы chnage bulk insert все еще медленный, а также выбрасывает истечение сеанса.

Так есть ли другой способ вставить в один кадр таблицу ?

Прежде чем я использую это для цикла, он занимает 30 минут и выше

For Each objDR As DataRow In datas.Rows
           sqlcmd.CommandText = "insert into [RRights]([RoleId],[Database],[Item Type],[Email],[Print],[Design Profile],[Check In],[Design File],[Delete/Rename File],[File Output],[Create Version],[View Version],[Reports],[Management],[ShareFile],[Annotation],[RenameAll]) values ('" & stringRoleID & "',N'" & objDR("Path") & "',N'Folder','False','False','False','False','False','False','False','False','False','False','False','False','False','False')"
          sqlcmd.ExecuteNonQuery()
     Next


Что я уже пробовал:

cmd.CommandText = "select RoleId ,Path as [Database] ,'Folder' as [Item Type]   from  DBFlow where ([Path] LIKE N'" & stringCabName & "\%') ORDER BY [Path] ASC"
        cmd.Connection = sqlcon
        da.SelectCommand = cmd
        da.Fill(datas)
        Dim sqlcmd As New SqlCommand
        sqlcmd.Connection = sqlcon
        Using cn As New SqlConnection(ConfigurationManager.ConnectionStrings("FTConnectionString").ToString())
            cn.Open()
            Using copy As New SqlBulkCopy(cn)

                copy.ColumnMappings.Add("RoleId", "RoleId")
                copy.ColumnMappings.Add("Database", "Database")
                copy.ColumnMappings.Add("Item Type", "Item Type")

                copy.DestinationTableName = "RRights"
                copy.WriteToServer(datas)
            End Using
            cn.Close()
        End Using

F-ES Sitecore

Вы можете ускорить свой код, не используя конкатенацию строк, использование sqlparams, вероятно, будет таким же медленным, хотя, возможно, попробуйте построить свой SQL с помощью StingBuilder, который вы инициализируете с размером, достаточным для размещения текста.

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

Aravindba

привет, тот же код работает с базой данных 100 Гб, но теперь в этой базе данных есть 800 ГБ. так в чем же проблема ? в коде, sql или конфигурации сервера ?

Ram Nunna

Вы можете передать datatable непосредственно в базу данных.
см. ссылку ниже:
https://stackoverflow.com/questions/9075159/how-to-insert-a-data-table-into-sql-server-database-table

Aravindba

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

1 Ответов

Рейтинг:
1

Patrice T

Построение 500000 раз Строковой команды sql - это медленный процесс, и он тоже опасен.
Вы должны погуглить о "SQL bulk insert", там всего 1200000 ответов, вы должны найти что-то полезное.
-----

sqlcmd.CommandText = "insert into [RRights]([RoleId],[Database],[Item Type],[Email],[Print],[Design Profile],[Check In],[Design File],[Delete/Rename File],[File Output],[Create Version],[View Version],[Reports],[Management],[ShareFile],[Annotation],[RenameAll]) values ('" & stringRoleID & "',N'" & objDR("Path") & "',N'Folder','False','False','False','False','False','False','False','False','False','False','False','False','False','False')"

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Aravindba

Да,
1. это y мы удаляем для цикла
2. я уже пробовал SQL bulk insert, но все еще медленно.
3. и корректно даже в одинарных кавычках, но эти данные берут из одной таблицы и вставляют в другую таблицу, и во всех значениях мы переопределяем специальные символы, одинарные кавычки которых являются причиной уязвимости SQL-инъекции.

Patrice T

Нет никакого способа, которым выдача 500000 команд одной строки может быть быстрее, чем одна массовая вставка.

Aravindba

привет, тот же код работает с базой данных 100 Гб, но теперь в этой базе данных есть 800 ГБ. так в чем же проблема ? в коде, sql или конфигурации сервера ?

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.