ускорить операцию обновления - PullRequest
0 голосов
/ 30 июля 2011

Пожалуйста, помогите мне ускорить операцию обновления на столе. Таблица имеет уникальный идентификатор, который используется для поиска записи и ОБНОВЛЕНИЯ ее полей. В таблице 1M записей. Индекс не используется. Только уникальный идентификатор. Вставка занимает некоторое время .. где я ожидал миллисекунд.

Структура таблицы:

create table customers
(
    id int IDENTITY(1,1) UNIQUE NOT NULL,
    phonenum varchar(15) UNIQUE NOT NULL,
    date datetime,
    company varchar(150),
    full_name varchar(150),
    address varchar(150),   
    street varchar(100),
    zip varchar(100),
    city varchar(100),
    info varchar(300),
    op_data varchar(150),
    op_date datetime,
    op_user_taken varchar(100),
    op_time_taken  datetime,
    op_status varchar(100),
    user_taken varchar(100),
    time_taken  datetime,
    status varchar(100),        
    );

Я использую метод SqlConnection System.Data.SqlClient.SqlConnection и ExecuteNonQuery для записи UPDATE.

Нужно ли переделывать мою таблицу, или ExecuteNonQuery такой медленный?

РЕДАКТИРОВАТЬ: Обновить команду:

"UPDATE customers SET user_taken=@param1, time_taken=@param2,
 date=@param3, company=@param4, full_name=@param55,
 address=@param6, street=@param8, zip=@param9,
 city=@param10, info=@param11 , status=\'Completed\',
op_data=@param12 WHERE id=@param7";

Ответы [ 3 ]

7 голосов
/ 30 июля 2011

Сделайте ваш идентификатор столбца первичным ключом. Первичные ключи автоматически становятся индексом. Если вы используете простую инструкцию обновления, такую ​​как:

UPDATE customers SET <something> WHERE id = @id 

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

Еще одна хитрость заключается в том, чтобы взять оператор обновления, запустить его на SQL Server и посмотреть план выполнения. Это скажет вам, где находится узкое место. Также вы можете перейти к параметрам запроса | Расширенный | и установите статистику для отображения на вкладке вывода.

0 голосов
/ 30 июля 2011

Я думаю, это потому, что у вас нет кластерного индекса (unique не является кластеризованным по умолчанию), поэтому SQL Server использует некластеризованный индекс в куче, чтобы найти вашу запись для обновления (UNIQUE - это индекс).Id должен быть первичным ключом (который кластеризован по умолчанию), а не UNIQUE.

0 голосов
/ 30 июля 2011

Попробуйте -

using (SqlCommand comm = new SqlCommand("update sql", conn))
{
      SqlDataReader results = (SqlDataReader)comm.ExecuteReader();
}

Просто любопытно ...

...