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