powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что будет эффективнее? Теоретически.
5 сообщений из 30, страница 2 из 2
Что будет эффективнее? Теоретически.
    #40081775
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

вы немного не тот счетчик анализируете. у вас DD на очередь диска по сути влияет только косвенно: она должна нагрузку немного сдвинуть по времени, но сама нагрузка никуда не денется, ему как нужно было записать к примеру 5 МБ лога, так он и запишет эти 5 МБ, только асинхронно. (я не беру сейчас во внимание что он может дожидаться заполнения целых буферов и скидывать уже их)

вам нужно анализировать счетчики database:transactions/sec, log bytes flushed/sec, active transactions, log flushes/sec
...
Рейтинг: 0 / 0
Что будет эффективнее? Теоретически.
    #40081857
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DD влияет не на диски, а на скорость выполнения операций. В обычной ситуации запросы ожидают выполнения фиксации записи в журнал, в случае DD запросы доверяют серверу и не ждут фиксации.
...
Рейтинг: 0 / 0
Что будет эффективнее? Теоретически.
    #40082027
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
DD влияет не на диски, а на скорость выполнения операций. В обычной ситуации запросы ожидают выполнения фиксации записи в журнал, в случае DD запросы доверяют серверу и не ждут фиксации.

Я бы даже слегка расширил ответ.
Верхнее значение количества транзакций, которое в состоянии обработать дисковая подсистема - определяется количеством iops, которое эта система в состоянии выдать на диске, где лежит log файл базы данных.
Т.к. ни одна транзакция не может быть зафиксирована, до тех пор, пока запись о ней не будет сделана в логе (точнее - даже несколько записей), то количество insert/update/delete в секунду - не может превышать количество iops диска логов ( /3, примерно ).
Т.е. если у вас логи лежат на одиночном 5400 ВД грин, то количество транзакций, которые вы выдавите из системы - где то 50-60 в секунду.
Но это все - без кэширования.
А запись в лог - как раз и происходит без кеширования, с флагом "не кэшировать" для системы, и командой "не кэшировать" для контроллера (он ее, впрочем, может игнорировать, и, скорее всего, в принудительном write back - проигнорирует. Но это его дело, у него на это батарейка есть на кэше).
Так вооот... В режиме "отложенной устойчивости", мы просто разрешаем системе кэшировать запись данных в лог, что позволяет ей данные, предназначенные для записи - пакетировать, и отправлять на диск в рамках одной команды. И, соответственно, снижать ОБЩЕЕ количество операций ввода-вывода, которые порождаются транзакциями. Теперь 10 (предположим) пакетов о начале транзакций, произошедших одновременно - это не 10 операций ввода вывода, а одна.
Ну и, соответственно, количество обрабатываемых транзакций в секунду - растет пропорционально.
При этом скорость обмена с диском, скорость выполнения самих команд - остается прежней. Одна фиксирована железякой, другая - нууу... структурой и командами БД. Но ожидание на фиксацию изменений в бд - сокращается.

Яркий пример - База на 1С.
Любимый прием работы одинесников - "от записи к записи". Они открывают курсор на миллион записей, и начинают по одной апдейтить. Сутки.
Включаем ДД - получаем апдейт за час. :-)))
И непредсказуемые глюки, если система уйдет в ребут.
... но это - не точно :-)))
...
Рейтинг: 0 / 0
Что будет эффективнее? Теоретически.
    #40082126
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster

Но это все - без кэширования.
А запись в лог - как раз и происходит без кеширования, с флагом "не кэшировать" для системы, и командой "не кэшировать" для контроллера (он ее, впрочем, может игнорировать, и, скорее всего, в принудительном write back - проигнорирует. Но это его дело, у него на это батарейка есть на кэше).

справедливости ради надо сказать, что запись в лог буферизуется

https://sqlperformance.com/2018/11/sql-performance/understanding-log-buffer-flushes

BufferingTo alleviate the negative performance impact of frequent sequential log writes to disk, SQL Server uses a log buffer in memory. Log writes are first done to the log buffer, and certain conditions cause SQL Server to flush, or harden, the log buffer to disk. The hardened unit (aka log block) can range from a minimum of a sector size (512 bytes) to a maximum of 60 KB. Following are conditions that trigger a log buffer flush (ignore the parts that appear in square brackets for now):

SQL Server gets a commit request of a [fully durable] transaction that changes data [in a database other than tempdb]
The log buffer fills up, reaching its 60 KB capacity
SQL Server needs to harden dirty data pages, e.g., during a checkpoint process, and the log records representing the changes to those pages were not yet hardened (write ahead logging, or WAL in short)
You manually request a log buffer flush by executing the procedure sys.sp_flush_log
SQL Server writes a new sequence-cache-related recovery value [in a database other than tempdb]


Delayed DurabilityStarting with SQL Server 2014, you can use a feature called delayed durability that allows you to improve the performance of workloads with many small transactions, even if submitted by different sessions, by sacrificing the normal full durability guaranty. When committing a delayed durable transaction, SQL Server acknowledges the commit as soon as the commit log record is written to the log buffer, without triggering a log buffer flush. The log buffer is flushed due to any of the other aforementioned conditions like when it fills up, but not when a delayed durable transaction commits.

Before using this feature, you need to think very carefully whether it’s appropriate for you. In terms of performance its impact is significant only in workloads with lots of small transactions . If to begin with your workload mainly involves large transactions, you will probably not see any performance advantage. More importantly, you need to realize the potential for data loss. Say the application commits a delayed durable transaction. A commit record is written to the log buffer and immediately acknowledged (control given back to the caller). If SQL Server experiences a power failure before the log buffer is flushed, after restart, the recovery process undoes all the changes that were made by the transaction, even though the application thinks that it was committed.
...
Рейтинг: 0 / 0
Что будет эффективнее? Теоретически.
    #40082130
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad

справедливости ради надо сказать, что запись в лог буферизуется


Только вот, пока буфер не будет записан на диск - транзакция не закроется.

PS. Диск тоже "буферизует". Это способ "немного быстрее записать", а не "отложенная запись".
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что будет эффективнее? Теоретически.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]