Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как победить таймауты и блокировки  [new]
RA093
Member

Откуда:
Сообщений: 15
Добрый день!
Пожалуйста, посоветуйте как оптимизировать базу.
Имееются: мощное железо, сервер MS SQL 2008, небольшая база.
База состоит из нескольких таблиц, проблема почти со всеми, поэтому в примере опишу лишь одну.
Есть многопоточная программа (потоков 20-30), каждый поток которой (1-2 раза в мин) периодически читает данные из другой базы, обрабатывает их и пишет в базу sql (часть таблиц update, часть -- delete + insert).
Дак вот, возникают изредка блокировки и очень-очень часто [Microsoft][SQL Server Native Client 10.0]Query timeout expired.
Таймаут настроен 60 сек, но этого должно за глаза хватать, т.к. объем записи небольшой.

Таблица для примера:
MobileObjects
(ObjectId integer not null, Number nvarchar(8), GarageNumber nvarchar(25), RouteId nvarchar(15), RouteDate date not null, State nvarchar(15), TimeBegin datetime, TimeEnd datetime, CorrectnessLimit decimal(10,2), Archive decimal(1,0))

Индекс:
CLUSTERED INDEX By_RouteId_RouteDate_ObjectId ON MobileObjects (RouteId,RouteDate,ObjectId)

Самый частый запрос к этой таблице, часто при нем происходит timeout:
SET DATEFORMAT ymd;
UPDATE MobileObjects SET State = @1 WHERE ObjectId = @2 AND RouteId = @3 and RouteDate = @4
;

Как тут можно оптимизировать базу?
9 ноя 12, 10:27    [13444320]     Ответить | Цитировать Сообщить модератору
 Re: Как победить таймауты и блокировки  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
План запроса смотрели? Что именно делает сервер в момент таймаутов - ждет ли чего-то процесс, если ждет - то чего?

Вообще вопрос скорее для форума Microsort SQL Server.
9 ноя 12, 10:48    [13444444]     Ответить | Цитировать Сообщить модератору
 Re: Как победить таймауты и блокировки  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Причина вероятно в недочитанных данных и блокировке чтения.
9 ноя 12, 11:53    [13444997]     Ответить | Цитировать Сообщить модератору
 Re: Как победить таймауты и блокировки  [new]
RA093
Member

Откуда:
Сообщений: 15
Просто я не проф проектировщик баз, я программист, но кое-какие основы знаю.
Пробовал играться с индексами: сделал не кластерный индекс вместо кластерного по тем же полям -- в мониторе sql время выполнения запроса чуть снизилось, но все равно большое ~600мс (и это за update 1 строки!).
План как на картинке вот:
1. поиск в индексе (nonclustered) 25%
2. верх 0%
3. compute scalar 0%
4. обновление таблицы 75%
5. update 0%
9 ноя 12, 12:46    [13445407]     Ответить | Цитировать Сообщить модератору
 Re: Как победить таймауты и блокировки  [new]
Kasper
Member

Откуда: Брянск
Сообщений: 124
RA093,

Если у Вас
4. обновление таблицы 75%
, следовательно таблица не маленькая, а потоков много и периоды разные - порекомендовал бы секционирование по RouteDate
9 ноя 12, 13:11    [13445684]     Ответить | Цитировать Сообщить модератору
 Re: Как победить таймауты и блокировки  [new]
RA093
Member

Откуда:
Сообщений: 15
Kasper
RA093,

Если у Вас
4. обновление таблицы 75%
, следовательно таблица не маленькая, а потоков много и периоды разные - порекомендовал бы секционирование по RouteDate


Сделал тестовую копию, она всего 60 мб!
Сервер на 2-х Xeon Е5506, 8Гб ОЗУ, там правда еще кое-что крутится на этом sql, но ресурсов проца и озу хватает.
9 ноя 12, 19:14    [13448877]     Ответить | Цитировать Сообщить модератору
 Re: Как победить таймауты и блокировки  [new]
DirksDR
Member

Откуда: Пермь
Сообщений: 340
RA093,

В MSSQL 7.0 команда

SET DATEFORMAT ymd; 

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

Модератор: Тема перенесена из форума "Проектирование БД".


Сообщение было отредактировано: 16 ноя 12, 16:30
16 ноя 12, 15:47    [13484877]     Ответить | Цитировать Сообщить модератору
 Re: Как победить таймауты и блокировки  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34620
RA093
База состоит из нескольких таблиц, проблема почти со всеми, поэтому в примере опишу лишь одну.
Есть многопоточная программа (потоков 20-30), каждый поток которой (1-2 раза в мин) периодически читает данные из другой базы, обрабатывает их и пишет в базу sql (часть таблиц update, часть -- delete + insert).
Дак вот, возникают изредка блокировки и очень-очень часто


Эта проблема не решается "в общем", решается как совокупность маленьких проблем,
каждая решается в отдельности.


RA093
[Microsoft][SQL Server Native Client 10.0]Query timeout expired.
Таймаут настроен 60 сек, но этого должно за глаза хватать, т.к. объем записи небольшой.


Ну убери вообще таймауты. На самом деле не лучшее решение вообще.
ТАймауты можно применять, но надо что-то делать в приложении для их компенсации -- запросы повторять
или что-то ещё.

RA093
Таблица для примера:
MobileObjects
(ObjectId integer not null, Number nvarchar(8), GarageNumber nvarchar(25), RouteId nvarchar(15), RouteDate date not null, State nvarchar(15), TimeBegin datetime, TimeEnd datetime, CorrectnessLimit decimal(10,2), Archive decimal(1,0))

Индекс:
CLUSTERED INDEX By_RouteId_RouteDate_ObjectId ON MobileObjects (RouteId,RouteDate,ObjectId)

Самый частый запрос к этой таблице, часто при нем происходит timeout:
SET DATEFORMAT ymd;
UPDATE MobileObjects SET State = @1 WHERE ObjectId = @2 AND RouteId = @3 and RouteDate = @4
;



Этот запрос при таком индексе должен просто летать и с ним проблем быть не должно.
Значит, проблема в других запросах.
16 ноя 12, 16:47    [13485485]     Ответить | Цитировать Сообщить модератору
 Re: Как победить таймауты и блокировки  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Kasper
RA093,

Если у Вас
4. обновление таблицы 75%
, следовательно таблица не маленькая, а потоков много и периоды разные - порекомендовал бы секционирование по RouteDate
В топку секционирование, в большинстве случаев оно не для увеличесния производительности, не надо его пихать везде где нужно и не нужно.
19 ноя 12, 21:39    [13497037]     Ответить | Цитировать Сообщить модератору
 Re: Как победить таймауты и блокировки  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
RA093
Дак вот, возникают изредка блокировки и очень-очень часто [Microsoft][SQL Server Native Client 10.0]Query timeout expired.
Таймаут настроен 60 сек, но этого должно за глаза хватать, т.к. объем записи небольшой.
Ну так и смотрите, кто чего и почему ждет.
19 ноя 12, 21:40    [13497039]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить