Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как ускорить INSERT? / 20 сообщений из 20, страница 1 из 1
13.10.2019, 13:23
    #39875640
listtoview
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Код: sql
1.
2.
3.
4.
5.
6.
7.
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 
  )



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
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
...
Рейтинг: 0 / 0
13.10.2019, 14:27
    #39875652
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Без плана ускоряют только телепаты.
...
Рейтинг: 0 / 0
13.10.2019, 15:03
    #39875659
listtoview
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Гавриленко Сергей АлексеевичБез плана ускоряют только телепаты.
во вложении
...
Рейтинг: 0 / 0
13.10.2019, 15:03
    #39875660
listtoview
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
estimated execution plan
...
Рейтинг: 0 / 0
13.10.2019, 15:15
    #39875661
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Чтобы не сканить каждый раз две таблицы, выделите базе db_from новые записи (хоть триггером в таблицу, хоть в очередь), дальше разбирайте новые записи порциями и вливайте в db_to. Непосредственно со вставкой тут мало что сделаешть, разве что поддерживать fillfactor для индекса по id регулярными редилдами.
...
Рейтинг: 0 / 0
13.10.2019, 16:49
    #39875668
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Гавриленко Сергей АлексеевичЧтобы не сканить каждый раз две таблицы, выделите базе db_from новые записи (хоть триггером в таблицу, хоть в очередь), дальше разбирайте новые записи порциями и вливайте в db_to.
Как-то сложно.

Может проще? Повесить rowversion, сделать индекс по rowversion include [все поля]... И каждый раз тянуть только строки старше предыдущего rowversion. Тут только последний rowversion где-то хранить надо.
...
Рейтинг: 0 / 0
13.10.2019, 17:02
    #39875671
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Андрей ЮниорПовесить rowversion, сделать индекс по rowversion include [все поля]... И каждый раз тянуть только строки старше предыдущего rowversion. Тут только последний rowversion где-то хранить надо.rowversion меняется при каждом обновлении. А ТС нужно только добавлять новые строки.
Тогда уж лучше не rowversion, а identity.
...
Рейтинг: 0 / 0
13.10.2019, 17:11
    #39875672
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
У Id тип uniqueidentifier. Никакого identity...

Да, повторы будут. Но сканов всё равно будет меньше. Да и, собственно, если данные изменились, то в конечной таблице может тоже обновить надо, верно? Или в исходной данные не меняются - тогда всё отлично.
...
Рейтинг: 0 / 0
13.10.2019, 17:12
    #39875673
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Андрей ЮниорУ Id тип uniqueidentifier. Никакого identity...
Только если ещё одно поле... Ну можно, конечно, но rowversion функциональнее: с ним при необходимости изменения можно отследить.
...
Рейтинг: 0 / 0
13.10.2019, 17:25
    #39875675
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Андрей ЮниорМожет проще? Повесить rowversion...Тут только последний rowversion где-то хранить надо.1. Как будете гарантировать отсутствие выпадения строк таблицы-источника из последующих синхронизаций?
2. Как быть, если после последней синхронизации в целевой таблице некоторые строки были удалены?
...
Рейтинг: 0 / 0
13.10.2019, 17:28
    #39875676
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
listtoview,

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



И план актуальный покажите.
...
Рейтинг: 0 / 0
13.10.2019, 17:37
    #39875678
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Андрей ЮниорУ Id тип uniqueidentifier. Никакого identity...Да, разве я говорил про другое???
Андрей ЮниорТолько если ещё одно поле... Ну можно, конечно, но rowversion функциональнее: с ним при необходимости изменения можно отследить.Отслеживать изменения противоречит задаче ТС. Будут ложные срабатывания.
Можно сделать и datetime, но это вызовет некоторые технические сложности.
invm2. Как быть, если после последней синхронизации в целевой таблице некоторые строки были удалены?У ТС нет задачи синхронизации таблиц.
...
Рейтинг: 0 / 0
13.10.2019, 17:40
    #39875679
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
invm1. Как будете гарантировать отсутствие выпадения строк таблицы-источника из последующих синхронизаций?
2. Как быть, если после последней синхронизации в целевой таблице некоторые строки были удалены?
Насколько вижу я, автора эти моменты не интересуют. Меня тем более


Вопрос про конкретную вставку, которая медленно ищет новые строки. Я предложил решение уменьшить время поиска новых сток.
...
Рейтинг: 0 / 0
14.10.2019, 12:24
    #39875905
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Непонятная дискуссия, автору надо изменить формулу кластерного индекса на IGNORE_DUP_KEY = ON и вставлять без фильтра в запросе.
...
Рейтинг: 0 / 0
14.10.2019, 12:40
    #39875918
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Владислав Колосов,

И каждый раз вливать всю db_from.[dbo].TextTranslates в db_to.[dbo].TextTranslates ?
...
Рейтинг: 0 / 0
14.10.2019, 12:51
    #39875926
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Гавриленко Сергей Алексеевич,

может это небольшая таблица, кто знает. И как она пополняется - неизвестно.
...
Рейтинг: 0 / 0
14.10.2019, 13:52
    #39875967
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Владислав КолосовГавриленко Сергей Алексеевич,

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

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

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

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

- все это для того, что бы найти ОДНУ запись в db_from в 4К, которую добавить в db_to.
...
Рейтинг: 0 / 0
14.10.2019, 17:27
    #39876136
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
Владислав Колосовавтору надо изменить формулу кластерного индекса на IGNORE_DUP_KEY = ON и вставлять без фильтра в запросе.1. Т.е. вы уверены, что отсутствие ошибок в местах, где они раньше были, никак не скажется на работе системы?
2. Производительность данной "формулы" очень сильно зависит от объема добавляемых данных и количества дубликатов в них.
...
Рейтинг: 0 / 0
14.10.2019, 17:42
    #39876145
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
invm,

дык есть только один способ узнать - приемлемое будет время вставки или нет. Да, логика может пострадать, а может и не пострадать. Автор сам пусть решает. Он даже не четверть задачи описал, а вырвал какой-то фрагмент из контекста. Поэтому мое предложение ничуть не хуже остальных. Иному серверу выполнить слияние в 600к записей - как чихнуть, а иной задумается.
...
Рейтинг: 0 / 0
14.10.2019, 18:54
    #39876181
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить INSERT?
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
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как ускорить INSERT? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]