Почему ОБНОВЛЕНИЕ занимает намного больше времени, чем ВЫБОР? - PullRequest
8 голосов
/ 06 января 2010

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

declare @weekending varchar(6)  
set @weekending = 100103

select InvoicesCharges.orderaccnumber, Accountnumbersorders.accountnumber  
from Accountnumbersorders, storeinformation, routeselecttable,InvoicesCharges, invoice   
where InvoicesCharges.pubid = Accountnumbersorders.publication  
and Accountnumbersorders.actype = 0  
and Accountnumbersorders.valuezone = 'none'  
and storeinformation.storeroutename = routeselecttable.istoreroutenumber   
and storeinformation.storenumber = invoice.store_number  
and InvoicesCharges.invoice_number = invoice.invoice_number  
and convert(varchar(6),Invoice.bill_to,12) = @weekending  

Однако эквивалентный оператор обновления занимает 1m40s

declare @weekending varchar(6)
set @weekending = 100103
update InvoicesCharges  
set InvoicesCharges.orderaccnumber = Accountnumbersorders.accountnumber  
from Accountnumbersorders, storeinformation, routeselecttable,InvoicesCharges, invoice   
where InvoicesCharges.pubid = Accountnumbersorders.publication  
and Accountnumbersorders.actype = 0  
and dbo.Accountnumbersorders.valuezone = 'none'  
and storeinformation.storeroutename = routeselecttable.istoreroutenumber 
and storeinformation.storenumber = invoice.store_number 
and InvoicesCharges.invoice_number = invoice.invoice_number
and convert(varchar(6),Invoice.bill_to,12) = @weekending

Даже если я добавлю:

and InvoicesCharges.orderaccnumber <> Accountnumbersorders.accountnumber

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

Я что-то здесь не так делаю? Почему такая огромная разница?

Ответы [ 4 ]

22 голосов
/ 06 января 2010
  • запись в файл журнала транзакций
  • обновления индекса
  • поиск по внешнему ключу
  • Каскады внешних ключей
  • проиндексированных просмотров
  • вычисляемые столбцы
  • проверка ограничений
  • замки
  • Задвижки
  • эскалация блокировки
  • изоляция снимка
  • зеркалирование БД
  • рост файла
  • другие процессы чтения / записи
  • разбиение на страницы / неподходящий кластерный индекс
  • события прямого указателя / переполнения строки
  • плохие показатели
  • статистика устарела
  • плохое расположение дисков (например, один большой RAID-массив для всего)
  • Проверка ограничений с пользовательскими функциями, имеющими доступ к таблице
  • ...

Хотя обычный подозреваемый - это триггер ...

Кроме того, ваше условие extra не имеет значения: как SQL Server знает, что его игнорируют? Обновление по-прежнему генерируется с большей частью багажа ... даже курок все равно сработает. Блокировки должны удерживаться, пока в строках ищутся другие условия, например

Отредактировано сентябрь 2011 г. и февраль 2012 г. с дополнительными параметрами

6 голосов
/ 06 января 2010

Обновление должно блокировать и изменять данные в таблице, а также регистрировать изменения в журнале транзакций. Селект не должен делать ничего из этого.

1 голос
/ 16 мая 2012

На медленных серверах или в большой базе данных я обычно использую UPDATE DELAYED, которая ожидает "перерыва" для обновления самой базы данных.

1 голос
/ 06 января 2010

Потому что чтение не влияет на индексы, триггеры и что у тебя?

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