|
Страница 1 из 11 Правил разработки SQL программ 1.0 Введение Назначением этого документа явлется определение требований и правил разработки SQL программ в нашем подразделении, соблюдение которых позволит создавать качественные приложения. А также обратить внимание на стиль написания программ, поскольку правильный стиль облегчает процесс поддержки программ. Разработчикам следует принимать во внимание, что в языках четвертого поколения (как и в языках третьего поколения) первый и очевидный вариант программы не обязательно является лучшим. Особое внимание надо обратить на необходимость придерживаться определенного стиля при написании SQL операторов, помимо всего прочего это позволит программам воспользоваться преимуществом SQL кэша в Oracle V7. Седьмая версия Oracle имеет некий SQL кэш, в котором содержатся разобранные (parsed) SQL запросы. Oracle определяет находится ли запрос в кэше с помощью не чувствительного к регистру сравнения. Следует иметь ввиду, что возможет просмотр кода, который используется для доступа к БД на сервере с помощью SQLtrace, с последующей обработкой вывода программой tkprof.

| 1.0 Введение | 
| 2.0 Стиль написания SQL операторов 
| 2.1 Основные положения | 
| 2.2 Ключевые слова SQL | 
| 2.3 Константы и переменные | 
| 2.4 Внешние объединения (outer joins) | 
| 2.5 Синонимы таблиц (aliases) | 
| 2.6 Порядок условий в предложении WHERE | | 
| 3.0 Запросы к БД 
| 3.1 Порядок перечисления таблиц в предложении FROM | 
| 3.2 Непреднамеренное запрещение индексов | 
| 3.3 Намеренное запрещение использования индексов | 
| 3.4 Различные варианты написания запросов | 
| 3.5 Использование оператора EXISTS | 
| 3.6 Не делайте ненужных объединений (joins) | 
| 3.7 Ресурсоемкие операции | 
| 3.8 Используйте для тестов реальные данные | 
| 3.9 Применение оператора != | 
| 3.10 Использование Oracle trace | 
| 3.11 Управление курсорами Oraclе | 
| 3.12 Правило 10,15,20 процентов | | 
| 4.0 Оператор INSERT 
| 4.1 Применение * в операторе INSERT | | 
| 5.0 Оператор UPDATE 
| 5.1 Согласованные изменения | | 
| 6.0 Оптимизация запросов 
| 6.1 Доступ к таблицам | 
| 6.2 Индексы и NULL значения | 
| 6.3 Индексы и предикаты 'NOT =' | 
| 6.4 Предложение GROUP BY | 
| 6.5 Использование нескольких индексов | 
| 6.6 Когда не выполняется слияние индексов | 
| 6.7 Подавление слияния индексов | 
| 6.8 Составные индексы | 
| 6.9 Оптимизация запросов с OR | 
| 6.10 Не соотнесенные подзапросы | 
| 6.11 Соотнесенные подзапросы | | 
| Приложение A Весовые коэффиценты предикатов в запросах | 
| Приложение B Структура таблиц, используемых в примерах | 
| Приложение C Correlated updates and PL/SQL. | 
| Приложение D Guidelines for outer join syntax | 
| Приложение E Десять правил создания быстро выполняющихся запросов | 
| Приложение F EXPLAIN Facility |
2.0 Стиль написания SQL операторов 2.1 Основные положения SQL операторы следует писать таким образом, чтобы облегчить процесс их чтения, понимания и исправления. Логически обособленная последовательность операторов должна находиться в отдельном файле. 1. Операторы следует выравнивать так, чтобы текст программы они выглядел аккуратно. 2. Каждое из запрашиваемых в SELECT полей должно быть на отдельной строке. 3. Каждая из таблиц, перечисленных в FROM должна быть на отдельной строке. 2.2 Ключевые слова SQL 1. Ключевые слова Oracle следует писать ПРОПИСНЫМИ БУКВАМИ 2. Перечисленные ниже ключевые слова следует писать с новой строки: SELECT INTO FROM WHERE AND/OR GROUP BY HAVING CONNECT BY FOR UPDATE OF ORDER BY 3. Все ключевые слова в пределах одного SQL оператора следует писать с одной и той же позиции. При использовании вложенных операторов SELECT их следует сдвигать внутрь предложения на позицию второго слова в предыдущей строке, например: SELECT sal, Job, ename, dept FROM emp WHERE sal > any (SELECT sal FROM emp WHERE deptno = 30) ORDER BY sal; 4. Строки, которые не начинаются с приведенных выше ключевых слов следует начинать с позиции второго слова в предыдущей строке, например: SELECT ename, dept FROM emp 2.3 Константы и переменные 1. Константы, переменные и т.п. следует располагать с правой стороны от слов WHERE или HAVING. SELECT ename FROM emp WHERE empno = '1232' Or SELECT ename FROM emp WHERE empno = :1 2.4 Внешние объединения (outer joins) Поля, которые вовлекаются в операцию внешнего объединения (outer join) следует писать с правой стороны от слов WHERE или HAVING. SELECT ename FROM emp e, dept d WHERE e.empno = d.empno(+) 2.5 Синонимы таблиц (aliases) Синонимы для таблиц следует применять во всех запросах, в которых упоминается больше одной таблицы в предложении FROM. Использование синонимов (alias) в таких запросах ускоряет операцию разбора SQL оператора ядром Oracle, поскольку уменьшает рекурсию запросов. SELECT count(*) FROM oe o, oe_link l, oe_link_name n WHERE o.oe = l.oe AND l.name = n.name Отметьте, что синонимы o, l, n используются в предложении WHERE. 2.6 Порядок условий в предложении WHERE В целях облегчения читаемости и понимания запроса в предложении WHERE следует сначала писать условия объединяющие таблицы, а потом условия ограничивающие выборку. 3.0 Запросы к БД 3.1 Порядок перечисления таблиц в предложении FROM Порядок перечисления таблиц в предложении FROM имеет значение для оптимизатора, когда оптимизатор выбирает способ выполнения запроса. Оптимизатор работает следующим образом. Он просматривает предложения WHERE и присваивает таблицам определенный вес, основываясь на типе предиката, т.е. field = 'const' или field = field(+). Затем он выбирает таблицу с наименьшим весом и делает ее управляющей (driving) таблицей. Однако, здесь есть один тонкий момент, если несколько таблиц получают одинаковый вес и он является наименьшим, то оптимизатор выбирает в качестве управляющей ту таблицу, которая стоит последней в предложении FROM. Список весовых коээфициентов предикатов приведен в приложении A.
|