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

Откуда:
Сообщений: 79
Здравствуйте. имеется таблица с остатками на складах поставщиков. В нее постоянно грузятся большие объемы данных (у некоторых поставщиков прайсы по 10 млн записей). при этом таблица блокирует все запросы. Не подскажете, какие есть варианты решения проблемы? Эта таблица так же нужна для формирования заказов, к ней идет постоянное обращение пользователей с целью проверки наличия нужного товара.

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

CREATE TABLE [dbo].[Remains](
[SupplierId] [bigint] NOT NULL,
[NomenId] [bigint] NOT NULL,
[Quant] [int] NULL,
[Price] [decimal](15, 2) NOT NULL,
[SupplierProducerId] [bigint] NOT NULL,
CONSTRAINT [PK_Remains] PRIMARY KEY CLUSTERED
(
[SupplierId] ASC,
[NomenId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
18 апр 13, 16:04    [14199340]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
ScareCrow
Member

Откуда: Белый город
Сообщений: 16934
включить версионность. блокировать придется уже руками.
хинт nolock. можно, но неприятно.
оптимизировать загрузку по скорости.
18 апр 13, 16:10    [14199384]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Это все поля таблицы?
18 апр 13, 16:14    [14199413]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Тэй
Member

Откуда:
Сообщений: 79
pkarklin,
да, это все поля.

nolock не устраивает
18 апр 13, 16:16    [14199439]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
ScareCrow
Member

Откуда: Белый город
Сообщений: 16934
ну ты хоть расскажи как грузите.
18 апр 13, 16:19    [14199457]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
секционировать, отключить эскалацию...
18 апр 13, 16:19    [14199463]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Тэй
pkarklin,
да, это все поля.

nolock не устраивает


readpast
18 апр 13, 16:20    [14199469]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Тэй
Member

Откуда:
Сообщений: 79
ScareCrow,
гружу пачкой все одним инсертом из временной таблицы после некоторых манипуляций. скорость загрузки норм, в оптимизации не нуждается.
18 апр 13, 16:29    [14199518]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
Тэй
nolock не устраивает
Либо версионность, либо вставлять маленькими порциями (вплоть до одной строки).
18 апр 13, 16:32    [14199546]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
Тэй
имеется таблица с остатками на складах поставщиков.
Если вы сами эту таблицу не обновляете, а только загружаете, то можно грузить в другую таблицу, а потом переименовывать.
18 апр 13, 16:33    [14199556]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Тэй
Member

Откуда:
Сообщений: 79
alexeyvg, поставщиков много.. остатки по всем в одной таблице, так что не выйдет. и апдейт тоже идет. при осуществлении заказа вычитается заказанное кол-во из остатков.
18 апр 13, 16:40    [14199599]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
pkarklin
Member

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


Эээ... Раз нет поле даты, то предыдущие данные удаляются? PK кластерный - просто ужас. Page Split просто гарантирован.
18 апр 13, 16:44    [14199636]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Тэй
Member

Откуда:
Сообщений: 79
pkarklin, перед вставкой остатки по поставщику удаляются, загружаются новые. дата была б одинаковая по поставщику. смысл.
18 апр 13, 16:47    [14199661]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Тэй
pkarklin, перед вставкой остатки по поставщику удаляются, загружаются новые.


1. Уберите кластерность с PK;
2. Включите версионный режим;
2. Вместо DELETE\INSERT делай MERGE.

ЗЫ.

автор
у некоторых поставщиков прайсы по 10 млн записей


Что поставляет, интересно....
18 апр 13, 16:51    [14199702]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Тэй
Member

Откуда:
Сообщений: 79
pkarklin, автозапчасти) ишь любопытный))
18 апр 13, 16:53    [14199711]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Тэй
Member

Откуда:
Сообщений: 79
pkarklin,

почему-то казалось всегда, что удалить пачку и пачку вставить быстрее, чем merge. будет повод проверить.
18 апр 13, 16:55    [14199731]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
Тэй
alexeyvg, поставщиков много.. остатки по всем в одной таблице, так что не выйдет. и апдейт тоже идет. при осуществлении заказа вычитается заказанное кол-во из остатков.
Тогда можно вставить данные в другую таблицу, а потом понемножку, мелкими транзакциями, обновлять баланс в основной таблице.
18 апр 13, 16:59    [14199769]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
Тэй
pkarklin, перед вставкой остатки по поставщику удаляются, загружаются новые. дата была б одинаковая по поставщику. смысл.
Непонятно, как это сочетается с:
Тэй
и апдейт тоже идет. при осуществлении заказа вычитается заказанное кол-во из остатков.

Если верно первое, то удаление/вставка логически абсолютно идентичны операции, про которую я говорил - вставить в другую таблицу, а потом заменить эту.

Что то вы недоговариваете :-)
18 апр 13, 17:01    [14199781]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Тэй
Member

Откуда:
Сообщений: 79
alexeyvg, либо я чего-то не понимаю. либо не верно выражаюсь. поставщиков много. каждый грузит данные в свое время. у нас нет такого, чтоб опа и все данные по всем остаткам обновить. вот гружу я одного во временную таблицу, а дальше что?

а насчет апдейта кол-ва товара все логично. купили 5 деталей из 10ти. значит в остатках теперь тоже 5.
18 апр 13, 17:10    [14199824]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Тэй
alexeyvg, либо я чего-то не понимаю. либо не верно выражаюсь. поставщиков много. каждый грузит данные в свое время. у нас нет такого, чтоб опа и все данные по всем остаткам обновить. вот гружу я одного во временную таблицу, а дальше что?

а насчет апдейта кол-ва товара все логично. купили 5 деталей из 10ти. значит в остатках теперь тоже 5.


сколько поставщиков?
18 апр 13, 17:20    [14199887]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Тэй
alexeyvg, либо я чего-то не понимаю. либо не верно выражаюсь. поставщиков много. каждый грузит данные в свое время. у нас нет такого, чтоб опа и все данные по всем остаткам обновить. вот гружу я одного во временную таблицу, а дальше что?

а насчет апдейта кол-ва товара все логично. купили 5 деталей из 10ти. значит в остатках теперь тоже 5.


1) секционировать по поставщику
2) лить во временную таблицу новые данные, как поступили
3) свитч старых данных по поставщику и дроп
4) свитч новых на место старых

зы: блокировка sch-m измеряться будет в миллисекундах
18 апр 13, 17:22    [14199902]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
Knyazev Alexey

1) секционировать по поставщику
2) лить во временную таблицу новые данные, как поступили
3) свитч старых данных по поставщику и дроп
4) свитч новых на место старых

зы: блокировка sch-m измеряться будет в миллисекундах


того же мнения
18 апр 13, 17:31    [14199963]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
Тэй
Member

Откуда:
Сообщений: 79
Knyazev Alexey,

спасибо) отличный детальный совет))))
18 апр 13, 17:37    [14199992]     Ответить | Цитировать Сообщить модератору
 Re: блокировка таблицы при вставке  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
Тэй
поставщиков много. каждый грузит данные в свое время. у нас нет такого, чтоб опа и все данные по всем остаткам обновить
А, теперь понятно.

Тэй
а насчет апдейта кол-ва товара все логично. купили 5 деталей из 10ти. значит в остатках теперь тоже 5.
Купили 5, в остатках стало 5, после этого загрузили новые данные по поставщику, и эта информация об остатках стёрлась, правильно?

Если можно заменять данные по поставщику полностью, то да, можно использовать секционирование.
18 апр 13, 18:31    [14200205]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить