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

Откуда:
Сообщений: 1944
INSERT INTO db_to.[dbo].TextTranslates 
SELECT *
FROM db_from.[dbo].TextTranslates AS f
WHERE f.Id NOT IN (  
  SELECT [Id]   
  FROM db_to.[dbo].TextTranslates 
  )


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TextTranslates](
	[Id] [uniqueidentifier] NOT NULL,
	[TextId] [uniqueidentifier] NOT NULL,
	[Value] [nvarchar](max) NOT NULL,
	[LangId] [uniqueidentifier] NOT NULL,
	[Deleted] [datetime] NULL,
	[Created] [datetime] NULL,
PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[TextTranslates] ADD  DEFAULT (newid()) FOR [Id]
GO

ALTER TABLE [dbo].[TextTranslates] ADD  DEFAULT (getdate()) FOR [Created]
GO

ALTER TABLE [dbo].[TextTranslates]  WITH CHECK ADD FOREIGN KEY([LangId])
REFERENCES [dbo].[Languages] ([Id])
GO

ALTER TABLE [dbo].[TextTranslates]  WITH CHECK ADD FOREIGN KEY([TextId])
REFERENCES [dbo].[Texts] ([Id])
GO
13 окт 19, 13:23    [21993041]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36499
Без плана ускоряют только телепаты.
13 окт 19, 14:27    [21993055]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
listtoview
Member

Откуда:
Сообщений: 1944
Гавриленко Сергей Алексеевич
Без плана ускоряют только телепаты.

во вложении

К сообщению приложен файл (з.sqlplan - 50Kb) cкачать
13 окт 19, 15:03    [21993064]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
listtoview
Member

Откуда:
Сообщений: 1944
estimated execution plan
13 окт 19, 15:03    [21993065]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36499
Чтобы не сканить каждый раз две таблицы, выделите базе db_from новые записи (хоть триггером в таблицу, хоть в очередь), дальше разбирайте новые записи порциями и вливайте в db_to. Непосредственно со вставкой тут мало что сделаешть, разве что поддерживать fillfactor для индекса по id регулярными редилдами.
13 окт 19, 15:15    [21993067]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 431
Гавриленко Сергей Алексеевич
Чтобы не сканить каждый раз две таблицы, выделите базе db_from новые записи (хоть триггером в таблицу, хоть в очередь), дальше разбирайте новые записи порциями и вливайте в db_to.

Как-то сложно.

Может проще? Повесить rowversion, сделать индекс по rowversion include [все поля]... И каждый раз тянуть только строки старше предыдущего rowversion. Тут только последний rowversion где-то хранить надо.
13 окт 19, 16:49    [21993096]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29546
Андрей Юниор
Повесить rowversion, сделать индекс по rowversion include [все поля]... И каждый раз тянуть только строки старше предыдущего rowversion. Тут только последний rowversion где-то хранить надо.
rowversion меняется при каждом обновлении. А ТС нужно только добавлять новые строки.
Тогда уж лучше не rowversion, а identity.
13 окт 19, 17:02    [21993101]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 431
У Id тип uniqueidentifier. Никакого identity...

Да, повторы будут. Но сканов всё равно будет меньше. Да и, собственно, если данные изменились, то в конечной таблице может тоже обновить надо, верно? Или в исходной данные не меняются - тогда всё отлично.
13 окт 19, 17:11    [21993106]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 431
Андрей Юниор
У Id тип uniqueidentifier. Никакого identity...

Только если ещё одно поле... Ну можно, конечно, но rowversion функциональнее: с ним при необходимости изменения можно отследить.
13 окт 19, 17:12    [21993107]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
invm
Member

Откуда: Москва
Сообщений: 8839
Андрей Юниор
Может проще? Повесить rowversion...Тут только последний rowversion где-то хранить надо.
1. Как будете гарантировать отсутствие выпадения строк таблицы-источника из последующих синхронизаций?
2. Как быть, если после последней синхронизации в целевой таблице некоторые строки были удалены?
13 окт 19, 17:25    [21993120]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
invm
Member

Откуда: Москва
Сообщений: 8839
listtoview,

Для начала, если допустимо блокировать таблицу
INSERT INTO db_to.[dbo].TextTranslates with (tablock)


И план актуальный покажите.
13 окт 19, 17:28    [21993121]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29546
Андрей Юниор
У Id тип uniqueidentifier. Никакого identity...
Да, разве я говорил про другое???
Андрей Юниор
Только если ещё одно поле... Ну можно, конечно, но rowversion функциональнее: с ним при необходимости изменения можно отследить.
Отслеживать изменения противоречит задаче ТС. Будут ложные срабатывания.
Можно сделать и datetime, но это вызовет некоторые технические сложности.
invm
2. Как быть, если после последней синхронизации в целевой таблице некоторые строки были удалены?
У ТС нет задачи синхронизации таблиц.
13 окт 19, 17:37    [21993130]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 431
invm
1. Как будете гарантировать отсутствие выпадения строк таблицы-источника из последующих синхронизаций?
2. Как быть, если после последней синхронизации в целевой таблице некоторые строки были удалены?

Насколько вижу я, автора эти моменты не интересуют. Меня тем более Картинка с другого сайта.

Вопрос про конкретную вставку, которая медленно ищет новые строки. Я предложил решение уменьшить время поиска новых сток.
13 окт 19, 17:40    [21993132]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6948
Непонятная дискуссия, автору надо изменить формулу кластерного индекса на IGNORE_DUP_KEY = ON и вставлять без фильтра в запросе.
14 окт 19, 12:24    [21993589]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36499
Владислав Колосов,

И каждый раз вливать всю db_from.[dbo].TextTranslates в db_to.[dbo].TextTranslates ?
14 окт 19, 12:40    [21993611]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6948
Гавриленко Сергей Алексеевич,

может это небольшая таблица, кто знает. И как она пополняется - неизвестно.
14 окт 19, 12:51    [21993627]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
PaulWist
Member

Откуда:
Сообщений: 2187
Владислав Колосов
Гавриленко Сергей Алексеевич,

может это небольшая таблица, кто знает. И как она пополняется - неизвестно.


Что гадать, в плане есть оценка:

- из db_to вынимается 1млн. 264тыс записей размером 26М

- из db_from поднимается почти 600 тыс записей размером 2.2Г

- все это для того, что бы найти ОДНУ запись в db_from в 4К, которую добавить в db_to.
14 окт 19, 13:52    [21993704]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
invm
Member

Откуда: Москва
Сообщений: 8839
Владислав Колосов
автору надо изменить формулу кластерного индекса на IGNORE_DUP_KEY = ON и вставлять без фильтра в запросе.
1. Т.е. вы уверены, что отсутствие ошибок в местах, где они раньше были, никак не скажется на работе системы?
2. Производительность данной "формулы" очень сильно зависит от объема добавляемых данных и количества дубликатов в них.
14 окт 19, 17:27    [21993969]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
Владислав Колосов
Member

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

дык есть только один способ узнать - приемлемое будет время вставки или нет. Да, логика может пострадать, а может и не пострадать. Автор сам пусть решает. Он даже не четверть задачи описал, а вырвал какой-то фрагмент из контекста. Поэтому мое предложение ничуть не хуже остальных. Иному серверу выполнить слияние в 600к записей - как чихнуть, а иной задумается.
14 окт 19, 17:42    [21993980]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить INSERT?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3997
listtoview,

используйте sequential ID , а ещё лучше INT (BIGINT если очень много).


INSERT INTO db_to.[dbo].TextTranslates WITH (TABLOCK)
SELECT *
FROM db_from.[dbo].TextTranslates AS f
WHERE f.Id NOT IN
(
SELECT [Id]
FROM db_to.[dbo].TextTranslates
)
ORDER BY f.ID
14 окт 19, 18:54    [21994032]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить