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

Откуда: Симферополь
Сообщений: 538
Господа, подскажите пожалуйста, как можно оптимизировать (увеличить скорость вставки) записей в таблицу с большим количеством записей, причем в эту таблицу в рабочее время одновременно пишут несколько пользователей, при этом скорость вставки становиться совсем печальной. Ночью, когда народу нету скорость вставки возрастает в разы.
28 авг 12, 21:40    [13078799]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Если с планами и блокировками все ок, то апгрейдить дисковую.
28 авг 12, 21:42    [13078804]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
Гавриленко Сергей Алексеевич
Если с планами и блокировками все ок, то апгрейдить дисковую.
Вот с блокировками кажется не совсем все хорошо...( Профайлером смотреть блокировки?
28 авг 12, 21:44    [13078809]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Andrew_vb1110,

Вопрос слишком общий.

Для начала посмотрите планы - какие ресурсы требуются для вставки записей.
Andrew_vb1110
скорость вставки становиться совсем печальной
А в цифрах это сколько, и какая операция вставки? Вы вообще какие исследования проводили, или просто вам пользователи сказали "что то программа медленно работает", а вы сразу сюда с вопросом?
28 авг 12, 21:49    [13078830]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
alexeyvg, Технология такая - при проведении документа идет вставка набора строк из оперативной таблицы (маленькая таблица) в постоянную таблицу (которая очччень большая) и вот это время вставки достигает нескольких минут, при положенных секундах, когда юзеров много. Ночью, когда юзеров нету, вставка проходит в считанные секунды.
28 авг 12, 21:59    [13078876]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Andrew_vb1110
alexeyvg, Технология такая - при проведении документа идет вставка набора строк из оперативной таблицы (маленькая таблица) в постоянную таблицу (которая очччень большая) и вот это время вставки достигает нескольких минут, при положенных секундах, когда юзеров много. Ночью, когда юзеров нету, вставка проходит в считанные секунды.
Это один запрос или огромный код с кучей вычислений?

Вы выполняли этот код в SSMS, и видите причину проблемы, или всё со слов пользователей? Если выполняли, то смотрели трейс, нашли, на каких стейтментах задержка?
28 авг 12, 22:04    [13078903]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Andrew_vb1110
Ночью, когда юзеров нету, вставка проходит в считанные секунды.
Вставка сотни записей, когда юзеров нету, должна проходить за милисекунду независимо от размера таблиц. Думается, там не вставка, а тонны простокода.
28 авг 12, 22:05    [13078910]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
alexeyvg
Andrew_vb1110
Ночью, когда юзеров нету, вставка проходит в считанные секунды.
Вставка сотни записей, когда юзеров нету, должна проходить за милисекунду независимо от размера таблиц. Думается, там не вставка, а тонны простокода.

Тормоза идут на вставку в таблицу doc_POSReceiptT_trans
Вот процедура:

Модератор: Уважайте участников форума. Прикладывайте портянки в виде файлов. В следующем сообщении...


Сообщение было отредактировано: 28 авг 12, 22:27
28 авг 12, 22:20    [13078961]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
MyNiGoo
Member

Откуда:
Сообщений: 230
я верю, что вы просто забыли тег спойлера поставить)
по теме
28 авг 12, 22:26    [13078984]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
MyNiGoo
я верю, что вы просто забыли тег спойлера поставить)
по теме
Думаю, до изучения этой ссылки ТС ещё далеко :-)

Andrew_vb1110
Тормоза идут на вставку в таблицу doc_POSReceiptT_trans
Вот процедура:
Приложите под спойлером или в файле.

И ещё нужно будет правильно настроить профайлер, что бы посмотреть, что именно тормозит внутри процедуры.
29 авг 12, 08:46    [13079638]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
alexeyvg
MyNiGoo
я верю, что вы просто забыли тег спойлера поставить)
по теме
Думаю, до изучения этой ссылки ТС ещё далеко :-)

Andrew_vb1110
Тормоза идут на вставку в таблицу doc_POSReceiptT_trans
Вот процедура:
Приложите под спойлером или в файле.

И ещё нужно будет правильно настроить профайлер, что бы посмотреть, что именно тормозит внутри процедуры.


Приложил файлик скрипта процедуры в аттачменте.
Тормозит на запись в таблицу:
INSERT INTO doc_POSReceiptT_trans


К сообщению приложен файл (dsp_POSReceiptT_Save.sql - 24Kb) cкачать
29 авг 12, 08:51    [13079652]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
denisofff
Member

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

Сдается мне, что dbo.f_GetUniqueID() - это, в любом случае, не очень быстро. Там, может и таится причина тормозов. Если приведете код - может это станет видно :-)
29 авг 12, 10:47    [13080347]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
denisofff
Andrew_vb1110,

Сдается мне, что dbo.f_GetUniqueID() - это, в любом случае, не очень быстро. Там, может и таится причина тормозов. Если приведете код - может это станет видно :-)


ALTER  FUNCTION [dbo].[f_GetUniqueID] () RETURNS int
AS
BEGIN

DECLARE @DBID int,
	@RegID int
	
SELECT @DBID=db_id()

EXEC master..xp_getid @DBID,@RegID OUTPUT
RETURN(@RegID)

END
29 авг 12, 11:56    [13081101]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
Andrew_vb1110
denisofff
Andrew_vb1110,

Сдается мне, что dbo.f_GetUniqueID() - это, в любом случае, не очень быстро. Там, может и таится причина тормозов. Если приведете код - может это станет видно :-)


ALTER  FUNCTION [dbo].[f_GetUniqueID] () RETURNS int
AS
BEGIN

DECLARE @DBID int,
	@RegID int
	
SELECT @DBID=db_id()

EXEC master..xp_getid @DBID,@RegID OUTPUT
RETURN(@RegID)

END


в продолжение:
EXEC dbo.sp_addextendedproc N'xp_getid', 'C:\Program Files (x86)\Miratech\Virtuoso Server Installation\newid.dll'
29 авг 12, 12:00    [13081136]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Сдается мне, не вставка тормозит, а выборка.
29 авг 12, 12:07    [13081199]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
Гавриленко Сергей Алексеевич
Сдается мне, не вставка тормозит, а выборка.
Спасибо, т.е. тормозит select который выбирает записи для вставки.
29 авг 12, 12:21    [13081320]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
Andrew_vb1110,

Это блокировки на локах и /или плохие планы запросов. Однозначно до реальных проблем вставки записей тут ещё очень далеко.

Судя по тому, что в многом режиме работы с бд все быстро, то дело в локах и надо мониторить блокировки.
29 авг 12, 12:43    [13081526]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
MasterZiv
Andrew_vb1110,

Это блокировки на локах и /или плохие планы запросов. Однозначно до реальных проблем вставки записей тут ещё очень далеко.

Судя по тому, что в многом режиме работы с бд все быстро, то дело в локах и надо мониторить блокировки.


Да блокировки присутствуют и их достаточно много. Я посмотрел командой sp_lock действительно их очень много.
А как бороться с блокировками?
29 авг 12, 13:04    [13081706]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Andrew_vb1110
А как бороться с блокировками?

Не делать длинных транзакций. Не допускать эскалаций. Использовать правильные уровни изоляции транзакций.
29 авг 12, 13:06    [13081733]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
TungusXan
Member

Откуда: Хочу туда где нет труда и каждый день зарплата! =)
Сообщений: 1686
Andrew_vb1110
MasterZiv
Andrew_vb1110,

Это блокировки на локах и /или плохие планы запросов. Однозначно до реальных проблем вставки записей тут ещё очень далеко.

Судя по тому, что в многом режиме работы с бд все быстро, то дело в локах и надо мониторить блокировки.


Да блокировки присутствуют и их достаточно много. Я посмотрел командой sp_lock действительно их очень много.
А как бороться с блокировками?


Например использовать with (nolock) в выборке
29 авг 12, 13:09    [13081754]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
TungusXan
Например использовать with (nolock) в выборке
Возможный, но далеко не самый лучший вариант.
29 авг 12, 13:10    [13081773]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
Гавриленко Сергей Алексеевич
TungusXan
Например использовать with (nolock) в выборке
Возможный, но далеко не самый лучший вариант.
Т.е. это на выбираемой таблице не будет блокировок?
29 авг 12, 13:17    [13081836]     Ответить | Цитировать Сообщить модератору
 Re: Нужно оптимизировать скорость вставки в таблицу с большим количеством записей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Andrew_vb1110
Гавриленко Сергей Алексеевич
Сдается мне, не вставка тормозит, а выборка.
Спасибо, т.е. тормозит select который выбирает записи для вставки.
Вы уже убедились в этом?

Если да, то во первых можно вставлять данные в промежуточную временную таблицу, а уже оттуда в doc_POSReceiptT_trans
Во вторых, нужно понять, почему выборка медленная. Это может быть по одной из трёх причин (или из за всех сразу): из за длительных блокировок таблиц doc_POSReceiptT_wtrans t, doc_POSReceiptT_wbase b_old, doc_POSReceiptT_base b_new, или из за неоптимального запроса, или из за блокировки внутри функции dbo.f_GetUniqueID()

Вы можете посмотреть этот запрос отдельно (без INSERT), потрейсить - и увидите, много ли он ест ресурсов и долго ли выполняется, заодно посмотрев на блокируемые ресурсы.

Ещё можнтн запустит в цикле функцию dbo.f_GetUniqueID(). Допустим, 100 раз вызовите получение по 100 новых ИД, посмотрите, сколько это работает. Если скажем эти 10000 ИД получаются секунду - функцию в помойку.
29 авг 12, 14:01    [13082232]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить