Ускорить 1С нажатием нескольких кнопок 1. Read commited shapshot

Собсвтенно давно хотел написать небольшую статейку на эту тему, потому как уже не один и не 2 раза рассказывал, приводил примеры. Только остались все мои посты в ICQ переписке, да частями в e-mail. Естественно всё что перечисленно ниже нарушает лицензионное соглашение с 1С в пункте в котором вы обязуетесь использовать только средства платформы для работы с СУБД. Конечно я ничего такого никогда не делал :) и весь материал ниже носит чисто теоретический характер. И конечно его применение только на свой страх и риск :).


Собственно рецепт:
1) Выгоняем всех из базы
2) Открываем SQL Server Management Studio, New Query
3) Пишем:

ALTER DATABASE MyDatabase
SET ALLOW_SNAPSHOT_ISOLATION ON

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON

где "MyDatabase" естественно нужно заменить на название вашей базы данных

Для тех кому абсолютно не интересно что дальше произойдёт и как это работает - можно дальше не читать. 
Для тех, кому наоборот - очень интересно могу привести ссылки: http://msdn.microsoft.com/ru-ru/library/ms173763.aspx
и http://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.80).aspx
Собственно окончательно меня убедило в правильности данного подхода, когда нашел в официальном руководстве для разработчиков Dynamics Ax (http://crusevinaq.narod2.ru/public/spravochnik-professionala-microsoft-dynamics-ax-4.0-skachat.html
) упомянание о том что данный уровень изоляции DAX по-умолчанию включает для баз, созданных на SQL Server 2005/2008. 1С, к сожалению на момент написания данной статьи ещё этого не умеет. И мне, если честно, продвигать эту идею туда пока лень. Собственно 2 команды написать намного проще.

Что при этом изменится. Всё очень просто - часть SQL Server станет версионником. Причём в данном случае рекоммендуется всё-таки использовать SQL Server 2008, т.к. в SQL 2005 эта возможность только появилась. А сами знаете как бывает когда возможности только появляются. У тех кто понял слово "Версионник" глаза уже загорелись, вдруг вспомнился "Oracle". Хотел найти статью, которая бы объяснила чем отличается версионник от блокировочника, но как-то не сложилось.

Обясню в 2 словах: мы хотим списать с остатков 1 Ручку, которая на складе всего одна, и сосед наш тоже этого жутко хочет:
Вместе жмём на кнопку "Провести". Мы на тысячную долю секунды быстрее.

Уровень изоляции везде READ COMMITED

Как сработает блокировочник:
 
- читаем остатки мы, и блокируем их
- читает остатки сосед - ждёт пока отпустим
- записываем остатки
- читает остатки сосед , ну и уже понятно, получает отказ

Как сработает версионник:

- Читаем остатки
- Читает остатки сосед (!!!!!!!) 
- Записываем остатки
- Сосед записывает остатки, естественно дождавшись пока мы запишем

В чём разница? А в том что во втором случае сосед прочитает версию данных которая была зафиксирована до их измененеия. Концептуальному уровню READ COMMITED это всё удовлетворяет. Были прочитаны зафиксированные данные, просто прочитаны данные, которые были зафиксированы ранее. Таким образом, незафиксированных в транзакции данных мы не прочитаем, что немловажно. НО ведь в данном случае мы спишем 2-ю ручку в "-". Да - спишем, конечно если не наложимуправляемую блокировку
речь о которых пойдёт в следующем посте. Потому что уровень изоляции READ COMMITED 1С использует только при наличии управляемых блокировок. При этом поддерживается на уровне СУБД только логическая целостность данных, а о своих "заморочках" программисты должны позаботиться сами, с чем я лично не могу не согласиться.

Теперь, я думаю, должно быть понятно какой простор для творчества открывает версионирование данных в случае с уровнем изоляции READ COMMITED. В этом случае можно вообще обойтись без блокировок на уровне СУБД. У версионирования, конечно, есть и проблемы - в частности ресурсов под него нужно несколько больше чем просто для поддержания инфраструктуры блокировок. Но потому как версионирование в MS SQL производится не для всех уровней изоляции, то существенной разницы в потреблении ресурсов быть не должно. Для более высоких уровней изоляции нельзя с уверенностью утверждать что версионность лучше чем блокировки. Да и в принципе это не цель данной статьи.

Как было отмечено выше, включение версионирования возможно только для уровня изоляции READ COMMITED. А этот уровень изоляции используется при включенных управляемых блокировках. При автоматических блокировках чаще всего уровень изоляции SERIALIZABLE - поэтому включение данной опции для автоматического режима несущественно повысит производительность, поэтому настоятельно рекоммендуется их включить, если этого ещё не сделано. Если не вдаваться в подробности включение управляемых блокировок в любой конфигурации не займёт более 3-4 часов работы квалифицированного программиста. Конечно в случае когда они включаются осмысленно и осознанно, а не простым слодованием методике, описанной на ИТС. В следующей статье я опишу как это проще всего сделать.

 

 

 

joomla
spbport
^ Наверх