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

Откуда:
Сообщений: 1132
Подскажите плз. в какую сторону копать.
Есть простенькая табличка с 200 лимонов строк, в которую активно в несколько потоков пишет .NET приложение.
Триггеров, ФК нет. Толко ПК и пара индексов.
Статистики в том числе которые авто актуальзировались несклоко дней ранее но не сейчас, т.е. не одновременно со вставками.
ПК перестраивал с неделю назад.

Иногда (не вседа!) вставки вызывают оч. высокое IO.
Чем это может быть вызвано, как бороться?


Замер:
session_idblocking_session_idreq_statusreq_cpu_time_msses_cpu_time_msreq_elapsed_sechost_process_idmemory_usagereadswriteslogical_readsrow_count
5290suspended0958501.29900011720229717775113731731
6390suspended0961781.29900011720230817839113769431
6490suspended0986411.29900011720227717857113783051
6590suspended0939890.01900011720229617707113754831
8390suspended0963890.01500011720225617681113749761
8490suspended0908971.29900011720222317397113749391
8590suspended0998701.29900011720227917794113783161
8690suspended0966641.29900011720230017678113768671
8790suspended0967391.30000011720225117817113815391
8890suspended0891011.30000011720221217602113767331
8990suspended0378561.3000001172026081086156807861
900running0381820.0210001172023141083456806811
9190suspended0401751.3000001172026651079856802581


Таблица:
CREATE TABLE [Results]
(
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[TaskDetailID] [int] NULL,
	[Created] [datetime] NULL DEFAULT (getdate()),
	[Value] [float] NULL,
	[ErrorCode] [int] NULL,
	[ErrorText] [varchar](255) NULL,
	[Duration] [float] NULL,
 CONSTRAINT [PK_Results] PRIMARY KEY CLUSTERED ([ID]));

 CREATE NONCLUSTERED INDEX [Created] ON [dbo].[Results];
 CREATE NONCLUSTERED INDEX [TaskDetailID] ON [dbo].[Results]([TaskDetailID]);

Вставки:
INSERT INTO [Results](TaskDetailID, Duration,   Value, ErrorCode,  ErrorText)
              VALUES (@TaskDetailID, @Duration, @Value, @ErrorCode, @ErrorText)



Этим делаю замеры:
SELECT 
	req.command command_type
,sqltext.TEXT command_text
, SUBSTRING(sqltext.text, (req.statement_start_offset/2)+1, 
    ((CASE req.statement_end_offset
        WHEN -1 THEN DATALENGTH(sqltext.text)
        ELSE req.statement_end_offset
        END - req.statement_start_offset)/2) + 1) AS statement_text
,db_name(req.database_id) db_name
,req.session_id
,req.blocking_session_id
,req.status as req_status
,req.cpu_time req_cpu_time_ms
,ses.cpu_time ses_cpu_time_ms
,req.total_elapsed_time / 1000.0 req_elapsed_sec
,ses.original_login_name
,ses.host_name
,ses.program_name
,ses.host_process_id
,ses.client_interface_name
,ses.memory_usage
--,ses.last_request_start_time
--,ses.last_request_end_time
,ses.reads
,ses.writes
,ses.logical_reads
,ses.row_count
--,req.[sql_handle]
FROM 
		sys.dm_exec_requests req with(nolock)
JOIN sys.dm_exec_sessions ses with(nolock) on req.session_id=ses.session_id
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext 
where 1=1
and req.database_id > 4
and req.session_id <> @@SPID
11 мар 15, 19:29    [17372157]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Alexander Us,

1) Ваше приложение пишет построчно или BULK INSERT (SqlBulkCopy)?
2) На таблице, куда вставляются данные, присутствуют триггера, констрейнты, индексы?
3) Какой уровень изоляции?
4) Используются хинты при вставке, какие?

В этих направлениях надо копать.

Подозреваю, что у вас не SQL 2014, хотя кто знает, но могу сказать, что быстрее всего вставка идёт в InMemory таблицы. Особенно при большом кол-ве параллельных потоков.

Также могу посоветовать синхронную вставку через некий Singleton, который будет накапливать данные и дозировать вставку.
11 мар 15, 19:53    [17372227]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Alexander Us
Иногда (не вседа!) вставки вызывают оч. высокое IO.



+ вангую

create table t1(id int);
go

set nocount on;
go

declare @n int = 1000000;

while (@n >0)
begin
	-- Как минимум, всякий commit сбрасывает logbuffer на диск
        -- Здесь 1 000 000 неявных commit'ов (или log buffer flush)
        -- Perfmon на моем компостере ~ 6 217 flush/sec
	insert into t1(id) values(1);
	
	set @n -= 1;
end;
go

declare @n int = 1000000;

-- 1 явная транзакция, log buffer  сбрасывается по заполнению 60 Кб (остальные мелочи опустим)
-- На моем компостере ~ 81 log buffer flush/sec
begin transaction;

while (@n >0)
begin
	insert into t1(id) values(1);

	set @n -= 1;
end;

commit transaction;
go

-- Второй вариант на порядки быстрее завершился
-- Когда IO подымается скорее всего или проблема выше или lazywrite/checkpoint совпал с заливкой...




Alexander Us
session_idblocking_session_idreq_statusreq_cpu_time_msses_cpu_time_msreq_elapsed_sechost_process_idmemory_usagereadswriteslogical_readsrow_count
5290suspended0958501.29900011720229717775113731731
6390suspended0961781.29900011720230817839113769431



Выясните что держит сессия 90, что все ее ждут.


+ в космос

Alexander Us
CREATE TABLE [Results]
(
	[ID] [int] IDENTITY(1,1) NOT NULL,
...
 CONSTRAINT [PK_Results] PRIMARY KEY CLUSTERED ([ID]));




Учитывая что очень много потоков и то что у вас индекс с монотонно возрастающим ключем и много потоков, возможно все в последствии повиснет на PAGELATCH_XX на самую правю листовую страницу кластерного индекса.
11 мар 15, 20:46    [17372370]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+

не рассматривали вариант писать не напрямую в базу а вообще в csv файлы. а потом их чем угодно (bcp, ssis) заливать в базу.
11 мар 15, 20:49    [17372381]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
a_voronin
1) Ваше приложение пишет построчно или BULK INSERT (SqlBulkCopy)?
2) На таблице, куда вставляются данные, присутствуют триггера, констрейнты, индексы?
А прочитать внимательно вопрос не? Впрочем, все как всегда...
a_voronin
3) Какой уровень изоляции?
4) Используются хинты при вставке, какие?
Можете разъяснить, как влияет вами перечисленное на IO при вставке?
a_voronin
Также могу посоветовать синхронную вставку через некий Singleton, который будет накапливать данные и дозировать вставку.
А это чем поспособствует уменьшению IO?
11 мар 15, 21:12    [17372464]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Alexander Us
Чем это может быть вызвано
Например, приращениями журнала транзакций.
И замер ваш показывает блокирование одним процессом других, но не возросшее IO.
11 мар 15, 21:17    [17372487]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Если память не изменят, дотнет забрасывает записи по одной штуке.
11 мар 15, 23:02    [17372773]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Владислав Колосов
Если память не изменят, дотнет забрасывает записи по одной штуке.
Это зависит от кривости рук разработчика.
12 мар 15, 00:40    [17372972]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
[quot invm]
a_voronin
a_voronin
4) Используются хинты при вставке, какие?
Можете разъяснить, как влияет вами перечисленное на IO при вставке?
a_voronin
Также могу посоветовать синхронную вставку через некий Singleton, который будет накапливать данные и дозировать вставку.
А это чем поспособствует уменьшению IO?


TABLOCK естественное ускоряет вставку.

Надо направить все эти вставки в отдельный модуль, который будет принимать записи от всех потоков и вставлять их BULK по мере накопления порции.

Можно, кcтати, заморочиться и сделать буферизацию через Service Broker
12 мар 15, 14:10    [17375283]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
a_voronin
TABLOCK естественное ускоряет вставку.
Совсем не естественно, может и не ускорить. И уж никак не влияет на объемы IO.
a_voronin
Надо направить все эти вставки в отдельный модуль, который будет принимать записи от всех потоков и вставлять их BULK по мере накопления порции.
Ну да. Направить и перенаправить. А потом выяснить, что БД в full recovery...

ЗЫ: Вопрос был про спорадические увеличения IO, а не про то, как что-то там улучшить.
12 мар 15, 14:28    [17375432]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
Alexander Us
Member

Откуда:
Сообщений: 1132
забыл добавить:
select @@version
Microsoft SQL Server 2005 - 9.00.5000.00 (X64)
Dec 10 2010 10:38:40
Copyright (c) 1988-2005 Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

recovery model: SIMPLE
12 мар 15, 16:59    [17376751]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Alexander Us
recovery model: SIMPLE


ну и что...
12 мар 15, 17:32    [17377005]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Alexander Us
recovery model: SIMPLE
Журнал и в simple будет расти, если все ваши вставки в одной транзакции.
12 мар 15, 17:53    [17377166]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+

log flush/sec будут с такой же частотой и такого же размера что в full, что в simple, если на каждый insert неявный commit. в simple он также успеет вырасти, если за время между checkpoint'ами успеть хорошенько накидать insert'ов...

надо подобрать размер транзакции.
12 мар 15, 18:06    [17377227]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Mind
Владислав Колосов
Если память не изменят, дотнет забрасывает записи по одной штуке.
Это зависит от кривости рук разработчика.

А что, кто-то будет изобретать передачу XML? Подключат ADO рекордсет - и вперед.
12 мар 15, 18:54    [17377445]     Ответить | Цитировать Сообщить модератору
 Re: Высокая нагрузка при вставках  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Владислав Колосов
Mind
пропущено...
Это зависит от кривости рук разработчика.

А что, кто-то будет изобретать передачу XML? Подключат ADO рекордсет - и вперед.
SqlBulkCopy
12 мар 15, 21:20    [17377916]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить