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

Откуда: Москва
Сообщений: 366
Всем добрый день.

Есть такой вопрос.
У нас в базе есть большая табличка-справочник, более 1 млн. записей. Клиентское приложение, которое у нас используется, отправляет в базу запрос к этому справочнику - без всякой фильтрации - все записи. До поры до времени это худо-бедно работало, но, видимо, дошло до пика возможностей и сейчас приводит к ошибке.

Возможности внести изменения в клиентское приложение - нет, поэтому решение возможно только на стороне базы.

Мы попробовали такой вариант: создали представление (view), которое отбирает часть актуальных данных из этого справочника. И заменили имена, чтобы представление получило исходное имя таблицы справочника.

Когда попробовали протестировать всё это вживую, посыпалась куча deadlock`ов. База рабочая, и возможности исследовать причину deadlock`ов вживую не было, пришлось все изменения откатить. Просьба - подсказать, в чем может быть причина появления deadlock`ов.

Ниже привожу скрипт для иллюстрации того, как сделали view:
CREATE TABLE test_clients(client_id int NOT NULL
 CONSTRAINT [PK_test_clients] PRIMARY KEY CLUSTERED 
  (client_id ASC) ON [PRIMARY]
)

INSERT INTO test_clients (client_id)
SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5


CREATE TABLE test_clients_NotActual(client_id int NOT NULL
 CONSTRAINT [PK_test_clients_NotActual] PRIMARY KEY CLUSTERED 
  (client_id ASC) ON [PRIMARY]
)

INSERT INTO test_clients_NotActual (client_id)
SELECT 1
UNION ALL SELECT 2

GO
CREATE VIEW test_clients_new
AS
SELECT test_clients.client_id
FROM test_clients
LEFT JOIN test_clients_NotActual ON test_clients.client_id = test_clients_NotActual.client_id
WHERE test_clients_NotActual.client_id IS NULL
GO

SELECT * FROM test_clients
SELECT * FROM test_clients_NotActual
SELECT * FROM test_clients_new

DROP TABLE test_clients
DROP TABLE test_clients_NotActual
DROP VIEW test_clients_new

Спасибо!
22 дек 14, 16:59    [17035609]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
Glory
Member

Откуда:
Сообщений: 104760
sander1
посыпалась куча deadlock`ов.

И где хоть один граф хоть одного deadlock-а ?
22 дек 14, 17:01    [17035632]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
а где скрипт вашего реального представления (View) и скрипт реальной таблицы-справочника?
22 дек 14, 17:03    [17035641]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
SELECT test_clients.client_id
FROM test_clients
LEFT JOIN test_clients_NotActual ON test_clients.client_id = test_clients_NotActual.client_id
WHERE test_clients_NotActual.client_id IS NULL


может вам это надо было?

SELECT T.client_id
FROM test_clients T
WHERE NOT EXISTS (SELECT * FROM test_clients_NotActual NA WHERE NA.client_id = T.client_id)
22 дек 14, 17:06    [17035667]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
хмхмхм
Guest
sander1,

У вас какая версия сервера?
Если Enterprise, то можно использовать секционирование. Если не Enterprise, то можно просто сделать таблицу _old, в которую закинуть все неактуальные данные и продолжать использовать запрос без deadlock-ов.

Если хотите разобраться с deadlock-ом, то вам надо показать хотя бы Deadlock graph. Без этого никто вам ничем помочь не сможет, увы.
22 дек 14, 17:27    [17035813]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
sander1
Member

Откуда: Москва
Сообщений: 366
Glory,
ситуация, повторюсь, такая, что пришлось откатывать в попыхах, и графов нету. К сожалению.

Konst_One,
вроде ваш вариант ничем не отличается?

Честно говоря, надеялся, что ошибка в нашем подходе может быть какая-то явная, и сразу в нее ткнут, и без графов...
22 дек 14, 17:30    [17035831]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
sander1
Member

Откуда: Москва
Сообщений: 366
Всем спасибо.

Наверное будем пробовать вариант с доп. таблицей.
22 дек 14, 17:32    [17035840]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
sander1, указанный код и запрос из представления не может вызвать dead lock.
22 дек 14, 18:14    [17036110]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
aleks2
Guest
Владислав Колосов
sander1, указанный код и запрос из представления не может вызвать dead lock.


Select ваще "не может вызвать deadlock".
Естественно, у тредстартера есть ишо где-то update/
23 дек 14, 05:41    [17037646]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
Павел-П
Member

Откуда:
Сообщений: 234
aleks2
Владислав Колосов
sander1, указанный код и запрос из представления не может вызвать dead lock.


Select ваще "не может вызвать deadlock".
Естественно, у тредстартера есть ишо где-то update/


ну это не совсем корректно. Deadlock - это всегда 2 процесса. Один может делать и select. Тут весь вопрос, что будет делать второй (может insert-update).
23 дек 14, 12:39    [17039241]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
aleks2
Guest
Павел-П
aleks2
пропущено...


Select ваще "не может вызвать deadlock".
Естественно, у тредстартера есть ишо где-то update/


ну это не совсем корректно. Deadlock - это всегда 2 процесса. Один может делать и select. Тут весь вопрос, что будет делать второй (может insert-update).

Спасибо, дорогой КО.
23 дек 14, 12:50    [17039316]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
o-o
Guest
Павел-П
aleks2
пропущено...

Select ваще "не может вызвать deadlock".
Естественно, у тредстартера есть ишо где-то update/


ну это не совсем корректно. Deadlock - это всегда 2 процесса. Один может делать и select. Тут весь вопрос, что будет делать второй (может insert-update).

не совсем корректно -- это утверждать, что "Deadlock - это всегда 2 процесса".
и 3, и 4, почему нет?
а что (как минимум) "у тредстартера есть ишо где-то update", так про то и написал aleks2, какие проблемы-то
23 дек 14, 12:52    [17039340]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
Павел-П
Member

Откуда:
Сообщений: 234
o-o
Павел-П
пропущено...


ну это не совсем корректно. Deadlock - это всегда 2 процесса. Один может делать и select. Тут весь вопрос, что будет делать второй (может insert-update).

не совсем корректно -- это утверждать, что "Deadlock - это всегда 2 процесса".
и 3, и 4, почему нет?
а что (как минимум) "у тредстартера есть ишо где-то update", так про то и написал aleks2, какие проблемы-то


ну 3, 4 - это значит, что 2 как минимум уже есть.
23 дек 14, 12:55    [17039372]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
o-o
Guest
Павел-П,

вам дважды привели цитату из aleks2 ,
он и пишет, что как минимум второй процесс есть, модифицирующий данные.
вы почему-то протестуете(!), утверждая то же самое(!), но добавив неверное,
ибо "всегда" как раз и подразумевает, что никаких вариаций на тему "больше двух" быть не может.

мне спорить дальше лень, а вам советую перечитать все заново что-ли...
23 дек 14, 13:06    [17039444]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
Павел-П
Member

Откуда:
Сообщений: 234
o-o,

я с Вами не спорю, я с Вами полностью согласен.
23 дек 14, 14:50    [17040435]     Ответить | Цитировать Сообщить модератору
 Re: View, deadlock  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
А что вы хотите? Тема вообще не имеет смысла, по изображению пальца нельзя нарисовать всего человека в точности.
23 дек 14, 14:55    [17040481]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить