2015-01-23 3 views
3

Я читал о задержках ввода-вывода & сообщение об ошибке 833 в журнале ошибок в SQL Server. Как смоделировать длинный сценарий ввода-вывода, чтобы я мог получить это сообщение об ошибке в журнале. Кто-то может помочь?SQL Server: моделирование длинных операций ввода-вывода в SQL Server

ответ

2

Возможно, вам трудно получить сообщение об ошибке 833 в журнале ошибок SQL, используя только T-SQL, если ваша подсистема ввода/вывода имеет соответствующий размер. Однако, если вы подчеркиваете подсистему ввода-вывода с использованием SQLIO (https://www.microsoft.com/en-us/download/details.aspx?id=20163) или SQLIOSIM (на носителе установки SQL) и одновременно выполняете интенсивные запросы ввода-вывода, это может вызвать ошибку.

Ниже приведен сценарий T-SQL для создания и загрузки тестовой таблицы вместе с интенсивным запросом ввода-вывода. При необходимости запускайте несколько экземпляров цикла SELECT в разных SSMS-окнах.

--create test table 
CREATE TABLE dbo.TestTable(
     Col1 nchar(4000) NOT NULL 
    , Col2 nvarchar(MAX) NOT NULL 
    ); 

--load 10000 rows (about 2.8GB) 
WITH 
    t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n)) 
    ,t256 AS (SELECT 0 AS n FROM t4 AS a CROSS JOIN t4 AS b CROSS JOIN t4 AS c CROSS JOIN t4 AS d) 
    ,t16M AS (SELECT ROW_NUMBER() OVER (ORDER BY (a.n)) AS num FROM t256 AS a CROSS JOIN t256 AS b CROSS JOIN t256 AS c) 
INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2) 
SELECT REPLICATE(N'X', 4000), REPLICATE(CAST('X' AS nvarchar(MAX)), 10000) 
FROM t16M 
WHERE num <= 100000; 
GO 

--run query in loop (expect parallel execution plan with many read-ahead and LOB page reads) 
SET NOCOUNT ON; 
DECLARE @RowCount int, @Iteration int = 1; 
WHILE @Iteration <= 100 
BEGIN 
    CHECKPOINT; 
    DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS; 
    SELECT @RowCount = COUNT(*) FROM dbo.TestTable WHERE Col2 LIKE 'X%'; 
    RAISERROR('Iteration %d completed',0,1,@Iteration) WITH NOWAIT; --display progress message 
    SET @Iteration += 1; 
END; 
GO 

EDIT: я наткнулся на другой тестер I/O, разработанный Microsoft, DiskSpd, и был в состоянии произвести ошибку надежно на моей тестовой системе в сочетании с выше сценарием T-SQL. Этот инструмент с открытым исходным кодом является бесплатной загрузкой с https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223. DiskSpd имеет ту же функциональность, что и SQL, но немного проще в использовании, более хорошо документирован и имеет возможность выпускать XML-данные для облегчения анализа.

Параметры, которые я использовал для теста, приведены ниже. Ошибка была произведена в течение 30 секунд после запуска теста с файлом данных SQL Server также на диске D.

diskspd.exe" -h -d60 -c1G -F32 -w50 -r -b8K -o1000 -L "D:\DiskSpd.dat" 
+0

благодарит за вашу помощь. Но мне трудно понять, что вы делаете в разделе под «WITH» (т. Е. Ниже «- 10000 строк (около 2,8 ГБ)») ... от «WITH» до «GO». Не могли бы вы объяснить их? Извините за беспокойство. Не удалось получить: 1) что такое t (n), 2) Что вы делаете «cross join»? – Jean

+0

@Jean, запросы, определенные в предложении 'WITH', являются обычными табличными выражениями (CTE), которые ссылаются и повторно используются по имени. Я использую их здесь для создания тестовой таблицы строк в 100000 строк. CTE t4 возвращает таблицу с четырьмя строками с одним столбцом, CTE-перекрест 't256' присоединяется к t4 4 раза, чтобы создать 256 строк (4 * 4 * 4 * 4), а CTT' tt6M 'аналогично присоединяется к 't256' для создания 16M строк, используемых в качестве источника для 'INSERT'. «T (n)» указывает имя псевдонима таблицы и столбца для литералов конструктора строк, необходимых для синтаксиса, но не используемых здесь. См. Https://msdn.microsoft.com/en-us/library/ms175972.aspx. –

+0

Независимо от того, насколько сильно я пытался с запросом, который вы дали (с вставкой даже 100 000 записей), работающим более двух дней, SQL Server не выбрасывал ошибку 833. Любая помощь, пожалуйста? – Jean

2

Вы можете сделать что-то похожее на нижеследующее, которое будет генерировать много нагрузки ввода-вывода на SQL LOG & Data Drives.

  1. Создание простой [TestTable] с парой полей
  2. Вставьте строки в таблице выше непрерывно любым из следующего кода

    INSERT INTO [TestTable] VALUES ('Sample data') 
    GO 10000 
    

После 10000 вставок выше запрос завершает выполнение. ИЛИ

WHILE (1=1) 
BEGIN 
    INSERT INTO [TestTable] VALUES ('Sample data') 
END 
GO 

Этот запрос будет продолжать работать до тех пор, пока остановился в явном виде.

+0

Прохладный, не знал, что вы можете это сделать. Также не может intellisense, по-видимому: P – HoneyBadger

+0

Проблема с предлагаемым тестом заключается в том, что фактические операции ввода-вывода будут очень малы, наивно я бы сказал, что он будет писать только 1 страницу (8k) в db-файле, а другой в журнал. (+ некоторые накладные расходы, + некоторые индексы, если у вас есть, + ...). Возможно, вам захочется попытаться вставить большие наборы в 1 операцию, чтобы фактически наложить некоторую нагрузку на систему, а затем сделать это параллельно.Такой инструмент, как SQLIO, как предложил Стив Форд, автоматизирует такие тесты для вас. – deroby

2

Я бы рассмотрел использование бесплатного инструмента Microsoft SQLIO, который можно использовать для оценки производительности диска. Это наложило бы нагрузку на ваши диски, которые, надеюсь, позволят вам увидеть ошибки в вашей среде.

Подробности здесь: Brent Ozar article on finding SAN Bottlenecks SQL IO, Powershell and storage performance SQLIO Download

Вы также можете попробовать утилиту SQLIOSim, которая использует случайные модели, поэтому не повторяется. Это инструмент для тестирования стресса.

+0

SQLiOSim кажется подходящей утилитой, которую я ищу! Позвольте мне проверить его и вернуться! – Jean

+2

@Jean, вам нужно будет запустить некоторые запросы, требующие ввода-вывода, когда подсистема ввода-вывода подвергается стрессу инструментом, чтобы получить сообщение об ошибке в журнале ошибок SQL Server. –

+0

Спасибо, @DanGuzman! Любые примеры для таких запросов, пожалуйста? Поиск в Google дает только статьи о том, как выявлять проблемы ввода-вывода. Извините, новичок, пытающийся это изучить. Извините, если мой вопрос глуп. – Jean

Смежные вопросы