
- •Sql на практике введение
- •1. История развития языка sql
- •Sql в коммерческих реализациях
- •Стандартизация sql
- •Международный стандарт 1989 г.
- •Международный стандарт 1992 г. (sql2)
- •Стандарт sql:1999 (sql3)
- •Стандарт sql:2003
- •2. Sql в примерах
- •I. Простые запросы на языке sql
- •Примеры
- •II. Использование функций
- •1. Агрегатные функции
- •2. Строковые функции
- •III. Запросы, использующие соединения
- •IV. Группирование
- •V. Построение внешнего соединения и представления
- •VI. Подзапросы
- •Некоррелированные подзапросы
- •Коррелированный подзапросы
- •VIII. Обьеденение
- •IX. Оператора манипулирования данными. Удаление данных
- •X. Оператора манипулирования данными. Вставка данных
- •XI. Операторы манипулирования данными. Обновление данных
- •3. Практические советы
- •1. Хорошо знайте свои данные и бизнес-приложение
- •2. Тестируйте свои запросы на реалистических данных
- •3. Внимательно относитесь к использованию индексов на таблицах
- •4. Для фильтрации записей используйте where, а не having.
- •5. Минимизируйте число просмотров таблиц
- •6. Избыточность полезна
- •7. Где возможно, избегайте использования соединений
- •8. Если это неизбежно, соединяйте таблицы в правильном порядке
- •9. Старайтесь писать как можно более простые и «тупые» операторы sql
5. Минимизируйте число просмотров таблиц
Запросы с меньшим числом просмотров таблиц - более быстрые запросы. Вот пример. Таблица STUDENT содержит четыре столбца с именами NAME, STATUS, PARENT_INCOME и SELF_INCOME. Имя является первичным ключом. Значение статус равно 0 для обучающихся по бюджету студентов и 1 - для контрактников. Форма запроса предполагает два просмотра таблицы STUDENT:
Select name, parent_income
From student
Where status = 1
Union
Select name, self_income
From student
Where status = 0
Тот же самый результат будет получен при выполнении запроса с одним просмотром таблицы:
Select name, parent_income * status + self_income * (1 - status)
From student
6. Избыточность полезна
Помещайте в раздел WHERE как можно больше информации. Например, если указан раздел
Where col1 = col2 and col1 = 10,
оптимизатор сможет вывести, что COL2 = 10.
Но при задании раздела в форме
Where col1 = col2 and col2 = col3,
оптимизатор не будет считать, что COL1 = COL3.
7. Где возможно, избегайте использования соединений
Пример. Найти всех сотрудников некоторой организации
Select lname, fname
from Persons, Companies
Where Persons.company=Companies.Company_id
And Company.name="Sony"
При условии: Persons - N (1000) строк, Companies -M (100) строк потребуется проверка N*M строк (1 000 000)
Select lname, fname from Persons, Companies
Where Persons.company in
(Select company_id from Companies
where Company.name="Sony"
потребует проверки N+M строк (1100).
8. Если это неизбежно, соединяйте таблицы в правильном порядке
Порядок соединения таблиц в запросах с соединениями нескольких таблиц имеет критическое значение. Всегда следует выполнять сначала максимально ограничивающий поиск, чтобы отфильтровать как можно большее число строк на ранних фазах выполнения запроса с соединениями. Тогда на следующих фазах соединения оптимизатору придется иметь дело с меньшим числом строк, что повысит эффективность. Следует убедиться, что главная таблица (просматриваемая во внешнем цикле соединения на основе вложенных циклов) содержит наименьшее число строк.
9. Старайтесь писать как можно более простые и «тупые» операторы sql
Оптимизатор может не справиться со слишком сложными операторами SQL; иногда написание нескольких более простых операторов позволяет добиться лучшей эффективности, чем задание одного сложного оператора.