Правила написания управляющих конструкций

Необходимо использовать следующий шаблон по управлению транзакциями

Пример.

Правильно
__BEGIN_TRAN__(PROCNAME) {операторы} if @RetVal <> 0 begin __ERR_TRAN__(PROCNAME) return@RetVal end __COMMIT_TRAN__

Все предварительные начитывания значений, проверка условий должна производиться до открытия транзакции.

Транзакции должны писаться исходя из принципа минимально возможного времени работы.

Приложения

Приложение 1. Требования на SQL запросы к базе данных 5NT

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

Цель

Добиться высокопроизводительной работы программного продукта

Требования

5.1.2.1 Список таблиц, являющиеся критичными для производительности при любой установке системы:

· сRmaket

· t(h)AccPosition

· tAccrualDetail

· tADLink

· tAudit

· tCtrCondition

· tCtrConditionContent

· t(h)Deal

· tDealOrder

· tDealProtocol

· tDealRelation

· t(h)DealTransact

· tDepartment

· tDocRelation

· tEntAttrValue

· tInstAttr

· tInstAttr2

· t(h)Institution

· tObjClassifier

· tObjClsRelation

· t(h)OperPart

· t(h)PayInstruct

· tPayInstructRelation

· tPCardTransact

· tResource

· tResourceBind

· t(h)Security

· tSmpArchive

· tSmpObject

· t(h)Swift

· t(h)SwiftLine

· tRest

· tUserRes

· tUserResSel

Во ВСЕХ запросах ко ВСЕМ таблицах необходимо проставлять индексы в запросах с использованием операторов select, update, delete.

Пример.

Правильно
select @BalanceID = BalanceID from tResource M_NOLOCK_INDEX(XPKtResource) where ResourceID = @ResourCre M_ISOLAT
deletetOperPart fromtOperPart M_INDEX(XPKtOperPart) whereOperationID = @OperationID

5.1.2.3 Для ВСЕХ таблиц в запросах, необходимо обязательно использовать "грязное чтение" , т.е. использовать макросы с префиксом NOLOCK в списке таблиц и ставить в конце запроса макрос M_ISOLAT, кроме случаев:

· Если в запросе участвуют специально оговоренные таблицы(например, tRest), из которых нельзя читать грязно.

· Если запрос специально разработан для простановки блокировок на просматриваемые таблицы в силу определенной логики (например, начитка seed-идентификаторов, начитка продуктового КЭШа в 7-ой версии и т.п.).

Пример.

Правильно Неправильно
select @Date = DealDate from tDeal M_NOLOCK_INDEX(XPKtDeal) where DealID = @DealID M_ISOLAT select @Date = DealDate from tDeal M_NOLOCK where DealID = @DealID

5.1.2.4 Не допускается использование INSERT, UPDATE, DELETE из таблиц pResource, pResList, pAccTurn, pVirtualOperTurn, pTurn в коде запросов или хранимых процедур для задач, не связанных с расчётом остатков штатными процедурами.

Категорически запрещается ссылаться на индекс по номеру.

Пример.

Правильно Неправильно
select * from tOperPartM_NOLOCK_INDEX(XPKtOperPart) M_ISOLAT select * fromtOperPartM_INDEX(1) M_ISOLAT

5.1.2.6 Для облегчения поддержки скриптов рекомендуется выносить тексты запросов с клиентской части в Stored Procedure'ы, если это не связано с поддержкой технологии сортировок и поисков

5.1.2.7 Все таблицы временного использования должны создаваться на Sybase c опцией M_ROWLOCK. Пример:

Пример.

Правильно
create tablepAccService (ID DSIDENTIFIER, SPID DSIDENTIFIER, IRTAccountServiceID DSIDENTIFIER, InstRelTypeID DSIDENTIFIER, ChangeFlag DSTINYINT )M_ROWLOCK go

Запрещается использовать view c участием таблиц п.5.1.2.1.

При написании отчетов запрещен прямой select из следующих таблиц.

· tOperPart

· tRest

· tUserRes

· tUserResSel

При написании отчетов запрещается использовать курсоры.

В запросах надо указывать правильный порядок таблиц. Для установки forceplan надо пользоваться макросом M_FORCEPLAN, который ОБЯЗАТЕЛЬНО ставится в начале каждой процедуры, а также для запросов указывать макрос M_FORCEORDER, который должен ставиться после каждого запроса, содержащего более одной таблицы.См. также п.п.4.1.27 и 4.1.28

Пример.

Правильно
M_FORCEPLAN selectop.ResourceID, sum(op.Qty) fromtResourceBind rb M_NOLOCK_INDEX(XIE3tResourceBind),tOperPart op M_NOLOCK_INDEX(XAK1tOperPart) whererb.ParentID = @ResourceID andrb.ChildResType = 1 andop.ResourceID = rb.ChildID andop.OperDate > @BegDate andop.OperDate <= @EndDate group byop.ResourceIDM_FORCEORDER

5.1.2.12 При очистке «временных» таблиц (p-таблиц) в отчетах, скриптах и запросах, идущих с клиента, обязательно указывать индекс. Несоблюдение этого требования приводит к необоснованному сканированию таблицы (Sybase) с неизбежной потерей производительности самого процесса и возрастанием риска блокировок обращений к этой же таблице со стороны других процессов.

Пример.

Правильно
delete pRestCalendarOut from pRestCalendarOut M_INDEX(pRestCalendarOut) where SPID = @@spid    

Буферные таблицы (p-таблицы) и tDocMark должны очищаться перед использованием (если только буферная таблица не является входной для данной процедуры) и после использования (если только буферная таблица не является выходной для данной процедуры)..

5.1.2.14 Для запрета эскалации блокировок необходимо использовать следующие макросы:

· Для Insert: M_WITH_ROWLOCK

· Для Update: M_UPDLOCK_INDEX

· Для Delete: M_ROWLOCK_INDEX или M_NOLOCK_INDEX, главное ВСЕГДА указывать индекс!!

· Для Select: M_NOLOCK_INDEX - всегда указывать индекс!

Пример.

Правильно
insert into pResource M_WITH_ROWLOCK select...  
update pResource set Qty = 0.0 from pResource M_UPDLOCK_INDEX(XPKpResource) where ...  

Реквизиты документа

Оформляются в соответствии с принятыми в Компании стандартами

Конфигурация документа

Атрибут документа Значение атрибута
Компания Диасофт
Клиент -
Название документа FA#. Стандарты кодирования SQL
Категория документа Стандарт
Предмет документа Стандарты разработки
Автор документа  
Документ проверил Панков Александр Владимирович
Статус документа Согласование
Номер документа -
Версия документа 0.9
Дата завершения  
Язык документа Русский
Назначение документа Для внутреннего пользования
Имя сохранившего файл Панков Александр Владимирович

Список рассылки документа

Ф.И.О Должность Версия Копий
Ломака Сергей Руководитель Управления    
Богатый Павел Руководитель Управления    
Погорельский Павел Руководитель Управления    
Шабанин Игорь Руководитель Управления    
Ревякина Валентина Руководитель Группы    
Резвых Владимир Руководитель Отдела    
Старов Дмитрий Руководитель Отдела    
Караваев Александр Руководитель Отдела    
Висич Игорь Руководитель Отдела    
Петров Владимир Руководитель Группы    
Зинин Юрий Руководитель Отдела    
Кириллова Елена Руководитель Отдела    
Ольшанский Александр Руководитель Отдела    
Сердюков Сергей Руководитель Группы    
Прихоженко Людмила Руководитель Отдела    
Хурумова Евгения Руководитель Группы    
Сауриди Александр Руководитель Группы    
Меньшиков Дмитрий Руководитель Группы    
Ильенко Мария Руководитель Группы    
Перемыщева Екатерина Заместитель Руководителя Отдела    
Какунин Максим Руководитель Группы    

История документа

Дата Версия Статус Комментарии
16.07.2003 0.1 Проект Инициирована разработка данного документа
14.02.2008 0.9 Согласование Пересмотрен
       
       
       

Лист согласований

Должность Ф.И.О. Подпись Дата
Ломака Сергей Руководитель Управления    
Богатый Павел Руководитель Управления    
Погорельский Павел Руководитель Управления    
Шабанин Игорь Руководитель Управления    
Ревякина Валентина Руководитель Группы    
Резвых Владимир Руководитель Отдела    
Старов Дмитрий Руководитель Отдела    
Караваев Александр Руководитель Отдела    
Висич Игорь Руководитель Отдела    
Петров Владимир Руководитель Группы    
Зинин Юрий Руководитель Отдела    
Кириллова Елена Руководитель Отдела    
Ольшанский Александр Руководитель Отдела    
Сердюков Сергей Руководитель Группы    
Прихоженко Людмила Руководитель Отдела    
Хурумова Евгения Руководитель Группы    
Сауриди Александр Руководитель Группы    
Меньшиков Дмитрий Руководитель Группы    
Ильенко Мария Руководитель Группы    
Перемыщева Екатерина Заместитель Руководителя Отдела    
Какунин Максим Руководитель Группы    

Нормативные ссылки

Наши рекомендации