Вопрос индексации SQL - PullRequest
2 голосов
/ 02 мая 2011

У меня есть хранимая процедура, которая, похоже, является моей бутылочной горловиной в моем приложении. Проблема в том, что таблицы, к которым он применяется, обновляются очень часто (примерно раз в секунду с десятками записей), поэтому индексация не является тривиальной.

Похоже, что для каждого прогона ХП - есть тот, который запускается примерно за 1,5 секунды (в то время как другие работают в течение 300-400 мс или меньше). Насколько я понимаю, обновляется дерево индексации.

RBDMS - это SQL Server 2008 R2.

Вот ИП:

PK для архива и оперативной таблицы - "pk1" (например), который здесь не используется.

FK - это идентификатор пользователя (который является PK в Table_Users)

INSERT INTO Table_Archive 
       SELECT userid, longitude, latitude, direction, RcvDate 
       FROM Table_Live 
       WHERE userid = @userid

DELETE FROM Table_Live WHERE userid = @userid

-- write down the new location

INSERT INTO 
       Table_Live (userid, longitude, latitude, direction) 
    VALUES (@userid, @lon, @lat, @dir)

UPDATE Table_Users 
    SET location = 'true' 
    WHERE loginid = (SELECT MAX(loginid) as loginid 
                     FROM Logins 
                     WHERE userid = @userid)

Есть идеи, что можно сделать, чтобы он работал оптимально? Предпочтительно он должен работать под 200 мс.

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Это не обновляемое дерево индексов: это происходит как часть ACID .После завершения DML все внутренние структуры (включая индексы, проверки, проверки внешнего ключа и т. Д.) Также будут завершены.В SQL Server отсрочка таких проверок отсутствует

Вероятно, это обновление статистики и время компиляции (планы становятся недействительными при обновлении статистики).Обновление статистики (IIRC) вызвано 500 строками + 20% изменений.Поэтому, если вы вставляете «десятки строк в секунду» в таблицу с «тысячами» строк, вам потребуется обновленная статистика

Моя первая мысль - установить асинхронную статистику : не отключить их

0 голосов
/ 02 мая 2011

Единственная очевидная вещь будет: есть ли индексы loginid и userid в Table_Users ??

Оба используются для предложения WHERE в выражении UPDATE, а также есть функция MAX(), примененная к loginid

Еще одна вещь, которая может немного помочь: нена самом деле удалить строки внутри вашего хранимого процесса.Это сэкономит вам много времени.Попробуйте выполнить обновление асинхронно - отдельно от вашей базы данных.Например, записать значения @userid в «таблицу команд» и заставить задание SQL удалять эти строки, например, раз в час или около того.

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