Stored procedures, Giga
https://giga.chat/link/gcsYPVSHqM
Самый быстрый вариант (оптимизация производительности):
Если задача состоит в простом быстром удалении всех записей из таблицы
без дополнительного контроля или выдачи каких-либо уведомлений, то оптимальным решением будет следующая процедура:
CREATE PROCEDURE usp_ClearSqlLoggerFast AS BEGIN SET NOCOUNT ON; -- Отключаем лишнюю информацию о количестве затронутых строк TRUNCATE TABLE dbo.SqlLogger; -- Быстрое удаление всех записей END GOОсобенности быстрого варианта:
- Используется команда
TRUNCATE TABLE, которая быстро удаляет все записи, - минуя журнал транзакций (если таблица не связана внешними ключами).
- Режим
NOCOUNT ONпредотвращает ненужную отправку дополнительных сообщений о количестве удалённых строк. - Никаких дополнительных параметров или проверок — простая и быстрая очистка таблицы.
--------------------------------------------------------------------------------------------------------------------
Самый медленный вариант (максимум функционала и безопасности):
Если приоритетом является максимальная безопасность, контроль ошибок, поддержка транзакций,
логирование и детализация процессов, тогда процедура может стать гораздо сложнее и менее производительной:
CREATE PROCEDURE usp_ClearSqlLoggerVerbose @DebugMode BIT = 0, -- Включить режим отладки @RowsDeleted INT OUTPUT, -- Количество удалённых записей @ErrorMessage NVARCHAR(MAX) OUTPUT -- Возвращаемое сообщение об ошибке AS BEGIN DECLARE @StartTime DATETIME = GETDATE(); -- Начало процедуры DECLARE @TransactionName NVARCHAR(32) = 'ClearLogTrans'; -- Имя транзакции DECLARE @LogTable NVARCHAR(128) = 'dbo.Logs'; -- Логирующая таблица -- Настройка журнала IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Logs') EXEC('CREATE TABLE Logs (EventType NVARCHAR(50), EventText NVARCHAR(MAX));'); -- Контроль режима отладки IF (@DebugMode = 1) PRINT 'Starting procedure at ' + FORMAT(@StartTime, 'yyyy-MM-dd HH:mm:ss'); -- Проверяем доступность таблицы SqlLogger IF OBJECT_ID('dbo.SqlLogger', 'U') IS NULL BEGIN SET @ErrorMessage = 'Таблицы SqlLogger не существует.'; RETURN; END -- Открываем транзакцию BEGIN TRANSACTION @TransactionName; -- Начнём выполнение удаления BEGIN TRY DELETE FROM dbo.SqlLogger; -- Присваиваем количество удалённых записей SET @RowsDeleted = @@ROWCOUNT; -- Логируем событие INSERT INTO @LogTable VALUES ('Success', 'Удалено записей: ' + CAST(@RowsDeleted AS NVARCHAR(10))); COMMIT TRANSACTION @TransactionName; END TRY BEGIN CATCH ROLLBACK TRANSACTION @TransactionName; SET @ErrorMessage = ERROR_MESSAGE(); INSERT INTO @LogTable VALUES ('Error', @ErrorMessage); END CATCH -- Завершаем работу IF (@DebugMode = 1) PRINT 'Finished procedure at ' + FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss'); END
GO
--------------------------------------------------------------------------------------------------------------------------
Особенности медленного варианта:
- Имеется дополнительный режим отладки, позволяющий выводить промежуточные отчёты.
- Поддерживается ведение подробного лога всех событий (успешных и неудачных).
- Все действия выполняются в рамках транзакции, обеспечивая атомарность операций.
- Есть проверка существования целевой таблицы и управление исключительными ситуациями.
- Выводится подробное сообщение о результатах (количество удалённых записей, возможные ошибки).
Итог:
- Быстрая версия оптимизирует скорость за счёт отказа от избыточных проверок и журналов.
- Медленная версия добавляет максимум контроля, логирования и безопасности, снижая общую производительность.
-----------------------------------------------------------------------------------------------------------------------------
Если необходимо оставить операцию удаления через команду DELETE,
но добиться максимальной скорости исполнения и отказаться от ненужных проверок и информационных сообщений,
можно реализовать следующую упрощённую версию процедуры:
CREATE PROCEDURE usp_ClearSqlLoggerFastDelete AS BEGIN SET NOCOUNT ON; -- Отключаем лишнюю информацию о количестве затронутых строк DELETE FROM dbo.SqlLogger; -- Простое удаление всех записей END GO
-----------------------------------------------------------------------------------------------------------------------
Ключевые отличия быстрой версии с использованием DELETE:
- Мы применяем обычную команду
DELETE, которая удаляет записи по одной, задействуя журнал транзакций. - Тем не менее, эта версия оптимальна для небольших или средних объёмов данных.
- За счёт отключения вывода информации (
SET NOCOUNT ON) мы уменьшаем накладные расходы - на передачу сообщений о количестве удалённых строк.
- Процедуру запускают только для прямого удаления всех записей без дополнительных проверок,
- логирования или управления транзакциями.
Когда использовать такую версию:
- Эта версия полезна, если:
- Размер таблицы невелик.
- Необходимость полного восстановления данных маловероятна.
- Требуется простота и быстрота исполнения.
Таким образом, данная процедура обеспечит простое и быстрое удаление всех записей из таблицы dbo.SqlLogger,
выполняя минимальное количество шагов.
Комментариев нет:
Отправить комментарий