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