понедельник, 7 июля 2025 г.

Stored procedures, Giga

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,

выполняя минимальное количество шагов.

Комментариев нет:

Отправить комментарий