Вопрос

Я сейчас вижу какое -то поведение в SQL Server 2008 R2, и я не могу решить, не работает ли сервер или нет.

Я установил тест, чтобы вставить целое число в таблицу, как определено ниже, 75 000 раз.

dbo.Test1
(
    id INT IDENTITY(1,1)
    , [text] VARCHAR(2000)
    , [timestamp] DATETIME NOT NULL DEFAULT(GETDATE())
)

Оба приложения (C# Code ниже), вставляя данные и экземпляр SQL Server находится на одном физическом поле.

Результаты: процесс занимает почти 10 минут для цикла и вставки данных. Не совсем уверен, как это может быть возможно.

for (int i = 0; i < 75000; i++)
{
     using (SqlConnection connection = new SqlConnection(@"<server>"))
     {
           connection.Open();

           using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) SELECT '" + i + "'", connection))
           {
                 command.ExecuteNonQuery();
           }

           connection.Close();
     }
}

РЕДАКТИРОВАТЬ:

Обновите, что вопрос в соответствии с ответом @Aaronbertrand.

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

Какие диски? Это 7200 SATA (http://www.seagate.com/ww/v/index.jsp?vgnextoid=2ee06c02c732f110vgnvcm100000f5ee0a0arcrd)

База данных крошечная? Да, это возможная проблема.

База данных удалена? Пожалуйста, прочитайте вопрос более внимательно. Все на одной физической коробке, прямо передо мной. Те же проблемы с двумя коробками в сети, но я сейчас не пытаюсь отладить проблемы с сетью. Просто SQL Server вставьте проблемы.

Хорошие деньги сейчас на Autogrow.

РЕДАКТИРОВАТЬ 2:

Обновите снова.

Машина виртуальная машина? Нет.

Метод подключения приложения Изучение этого. Поскольку все находится на одной коробке, я не уверен, как оно подключается.

Триггеры Никто

Губернатор ресурсов Не настроен.

Профилировщик Профилировщик не показывает Любые Задержки вообще, что, черт возьми, пробивает меня.

Блокировка Это единственное, что происходит, поэтому не должно быть никаких блокировки или ожидания, возможно, исключая ожидания бревна. На моей коробке все на одном физическом диске. Тем не менее, (большие, однако) в других коробках с той же проблемой, это не так, поэтому я не буду заниматься этим в качестве проблемы в настоящее время.

Это было полезно?

Решение

Я догадываюсь, что это как -то связано с открытием вашей петли и закрытию соединения 75 000 раз. Может, попробуйте что -то подобное и посмотрите, что произойдет:

 using (SqlConnection connection = new SqlConnection(@"<server>"))
 {
       connection.Open();

       using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) VALUES (@i)", connection))
       {
             command.Parameters.Add(new SqlParameter("@i", SqlDbType.Int));
             for (int i = 0; i < 75000; i++) {
                 command.Parameters["@i"].Value = i;
                 command.ExecuteNonQuery();
             }
       }

       connection.Close();
 }

РЕДАКТИРОВАТЬ: Еще одно ускорение, которое я обнаружил, заключается в завершении всех выполнений в одну транзакцию (предположительно, это устраняет накладные расходы постоянно блокировки и выпуска замков). Делать SqlTransaction trans = connection.BeginTransaction() Перед созданием вашего SQLCommand и trans.Commit() после того, как это сделано. Вот время заезда на моей машине разработки:

1: 08.14 - Оригинальная версия
0: 33.05 - Изменено, чтобы открыть соединение только один раз, и повторно используйте SQLConnection
0: 11.93 - Изменено, чтобы использовать одну транзакцию

Другие советы

Насколько я, грубо велик? Какие диски стоят за этим, диски вашего ноутбука 5400 об / мин? База данных крошечной и несет много событий автогровы? Я подозреваю, что есть какая -то проблема конфигурации. Я запустил следующий код за 52 секунды на своей виртуальной машине Win7 против 7200 об / мин.

CREATE TABLE dbo.Test1
(
    id INT IDENTITY(1,1)
    , [text] VARCHAR(2000)
    , [timestamp] DATETIME NOT NULL DEFAULT(GETDATE())
);
GO

INSERT dbo.Test1([text]) SELECT 'Not sure how long this text is supposed to be.';
GO 75000

Другие вопросы: машина является виртуальной машиной? Приложение подключается через TCP/IP, общую память, названную трубкой? Какое еще действие происходит на коробке? Есть ли триггеры на столе, реализованный губернатор ресурсов и т. Д.? Вы проверили sys.dm_exec_requests Или профилировщик, чтобы увидеть, как долго эти индивидуальные вставки на самом деле занимают, что еще C# отправляет на сервер, и какое блокирование или другое ожидание может произойти?

Мысли, в дополнение к проблеме «открытие/закрытие подключения к итерации».

Каждая вставка отправит пакет с (xx rows affected) который будет отправлен (evebn, если вы не справитесь с этим), если вы не используете SET NOCOUNT ON. Анкет Видеть https://stackoverflow.com/q/1483732/27535 так что еще для большего.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top