ru:https://highload.today/blogs/kak-ne-povredit-bazu-dannyh-i-chto-delat-esli-pri-rabote-s-ms-sql-server-ne-hvataet-pamyati/ ua:https://highload.today/uk/blogs/kak-ne-povredit-bazu-dannyh-i-chto-delat-esli-pri-rabote-s-ms-sql-server-ne-hvataet-pamyati/
logo
Базы данных      06/09/2021

Как не повредить базу данных и что делать, если при работе с MS SQL Server не хватает памяти

Дмитрий Придатко BLOG

Test Engineer в Sigma Software

Выполнять работу, не имея соответствующих инструментов — сложно, а иногда даже невозможно. Так же и в работе тестировщика: знание и умелое использование инструментов существенно повышает производительность работы и позволяет добиться отличных результатов.

В этой статье я хочу поделиться некоторыми практическими советами по использованию инструментов для работы с MS SQL Server. Стандартный набор инструментов для MS SQL Server — это SQL Server Management Studio и SQL Server Profiler. Также расскажу об использовании интересной утилиты SQL Query Stress Tool.

Предупреждение: при работе с базами данных есть риск повредить данные, поэтому перед использованием указанных советов обязательно обратитесь за помощью к ментору или более опытным коллегам!

Что делать, если не хватает памяти?

Проблема: иногда из-за большого количества объектов, создаваемых скриптом, не хватает памяти, и SQL Server Management Studio падает. Также дополнительные операции по визуализации / созданию гридов с результатами — это трудоемкий и ресурсоемкий процесс. В целом это существенно замедляет выполнение скрипта.

Решение: переключить в SQL Server Management Studio вывод результатов выполнения запроса в текстовую консоль или в файл (самый быстрый вариант).

Переключить в SQL Server Management Studio вывод результатов выполнения запроса в текстовую консоль или в файл

Переключение в SQL Server Management Studio вывод результатов выполнения запроса в текстовую консоль или в файл

Например, некоторый скрипт создает 2000 пользователей, для чего в цикле вызывается хранимая процедура, которая после успешного добавления нового пользователя возвращает некоторые данные, а также идентификатор вновь созданного пользователя.

В режиме вывода с гридами скрипт за 35 минут создал 634 пользователя — и Management Studio закрэшилась.

После перезапуска Management Studio и переключения в режим вывода в файл за 4 минуты 40 секунд были созданы оставшиеся 1366 пользователей (без крэшей и ошибок).

Как не повредить базу данных?

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

Решение: Если нет уверенности, что скрипт, который модифицирует данные (INSERT, UPDATE, DELETE), выполнится успешно — можно для проверки обернуть скрипт в транзакцию с откатом (ROLLBACK). Затем после проверки / отладки запроса можно заменить ROLLBACK на COMMIT и выполнить транзакцию еще раз.

Онлайн-курс "Управління ІТ-командами" від Laba.
Прокачайте свої soft- і hard-скіли в управлінні кількома IT-командами, отримайте практичні стратегії та інструменти ефективного team-ліда.
Програма курсу і реєстрація

Также важно перед транзакцией указывать SET XACT_ABORT ON. Если не указать эту настройку, то может возникнуть ситуация, что при возникновении ошибки часть транзакции будет применена, а часть отменена:

-- To be sure that data will be rolled back in case of any errors
SET XACT_ABORT ON
-- New transaction
BEGIN TRAN
    -- Count of rows before manipulation
    SELECT COUNT(*) FROM [tTable]
    -- Dataset before manipulation
    SELECT * FROM [tTable]

    -- Some data manipulations
    -- ...

    -- Count of rows after manipulation
    SELECT COUNT(*) FROM [tTable]
    -- Dataset after manipulation
    SELECT * FROM [tTable]
ROLLBACK

Разбор реального кейса

Далее расскажу об одном реальном кейсе по созданию тестовых данных для проверки оптимизации работы с таблицей сбора статистики пользователей системы.

При достаточно большом количестве данных запрос, который делал выборку статистики пользователей за 2 месяца, завершался по timeout. Необходимо было сгенерировать большое количество тестовых данных для проверки.

Примечание: скриншоты приведены для иллюстрации процесса, но в целях соблюдения NDA уменьшены, чтобы сделать их нечитабельными.

Шаг 1: определить, где хранятся данные для сбора статистики пользователей системы

Запускаем трассировку в SQL Server Profiler и смотрим запросы, которые выполняются при построении отчета по статистике пользователей системы.

Запускаем трассировку в SQL Server Profiler

Запускаем трассировку в SQL Server Profiler

Затем используя SQL Server Management Studio в коде хранимой процедуры находим таблицу, которая хранит данные по статистике.

находим таблицу, которая хранит данные по статистике

Находим в коде таблицу, которая хранит данные по статистике

Шаг 2: написать запрос для вставки одной строки, содержащей тестовые данные

Следующий запрос генерирует случайным образом тестовые данные для идентификатора пользователя в диапазоне 1000-1300 и даты в диапазоне 60 дней от текущей даты:

-- Generate random data for userPropID (1000-1300) and logDate from (Today-60 days) to Today
INSERT INTO [dbo].[tUsageLog]([userPropID], [logDate])
 VALUES (CAST(1000 + RAND() * 300 AS INT), CAST(SYSDATETIME() AS DATETIME) - RAND() * 60);

Шаг 3: сгенерировать массив тестовых данных

Для этих целей можно воспользоваться утилитой SQL Query Stress Tool. Подробный пример использования утилиты можно посмотреть по этой ссылке.

Онлайн-курс "Маркетолог" від Laba.
Пройдіть повний шлях розробки маркетингових стратегій на практиці та з фідбеком від CEO бренд-маркетингової агенції.
Програма курсу і реєстрація

Запускаем SQL Query Stress Tool и подключаемся к базе данных.

Подключаемся к базе данных

Подключаемся к базе данных

Копируем запрос (в примере запрос на вставку повторяется 10 раз), заполняем количество итераций и количество потоков, нажимаем GO.

В результате выполнения генерируется большое количество тестовых данных. В приведенном ниже примере это 10 строк * 10 потоков * 1000 итераций = 100 000 строк тестовых данных.

В результате выполнения генерируется большое кол-во тестовых данных

В результате выполнения генерируется большое количество тестовых данных

Шаг 4: сделать тестовые данные более презентабельными

Чтобы сделать тестовые данные более реалистичными, можно удалить часть сгенерированных тестовых данных за выходные дни и нерабочие часы:

-- Remove holidays
DELETE FROM [dbo].[tUsageLog] WHERE [logID] IN
(SELECT TOP 95 PERCENT [logID] FROM [dbo].[tUsageLog]
 WHERE DATEPART(DW, [logDate]) IN (6,7));

-- Remove non-working hours
DELETE FROM [dbo].[tUsageLog] WHERE [logID] IN
(SELECT TOP 95 PERCENT [logID] FROM [dbo].[tUsageLog]
 WHERE DATEPART(HH, [logDate]) < 9 OR DATEPART(HH, [logDate]) > 18);

Результат:

Результат

Результат

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Курс English For IT: Communication від Enlgish4IT.
Почни легко працювати та спілкуватися з мультикультурними командами та міжнародними клієнтами. Отримайте знижку 10% за промокодом ITCENG.
Інформація про курс

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Топ-5 самых популярных блогеров марта

PHP Developer в ScrumLaunch
Всего просмотровВсего просмотров
2434
#1
Всего просмотровВсего просмотров
2434
Founder at Shallwe, Python Software Engineer (Django/React)
Всего просмотровВсего просмотров
113
#2
Всего просмотровВсего просмотров
113
Career Consultant в GoIT
Всего просмотровВсего просмотров
95
#3
Всего просмотровВсего просмотров
95
CEO & Founder в Trustee
Всего просмотровВсего просмотров
94
#4
Всего просмотровВсего просмотров
94
Рейтинг блогеров

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: