Знание источников и объемов получения данных является обязательным. Вы также должны иметь полное понимание используемой модели данных (равно как и связей между разными бизнес-объектами) до написания требуемых операторов SQL.
Тестируйте свои запросы на реалистических данных
Внимательно относитесь к использованию индексов на таблицах
Постарайтесь создать все необходимые индексы. Создание индекса:
Create index <имя_индекса> on <имя_таблицы> (<имя_поля>,.. имя_поля>,..)
Создание индекса сводится к созданию набора данных, в котором указанные поля таблицы сортируются в соответствии с физическим расположением записи (rowid), что позволяет в последствии при поиске использовать бинарные и другие методы поиска.
Запрос
Select . . . from Persons where company_id=105
потребует незначительного времени, поскольку значения индексов в наборе данных будут искаться как минимум двоичным поиском.
Однако слишком большое число индексов может привести к снижению эффективности. Основные правила:
Создавайте индексы только в тех случаях, когда число строк > 200.
Создавайте индексы на столбцах, которые часто используются в разделе WHERE.
Индексируйте столбцы, часто используемые в операторах SQL для соединения таблиц.
Используйте для индексирования только те столбцы, в которые входит небольшой процент строк с одним и тем же значением.
Не индексируйте столбцы, которые используются только в функциях.
Не индексируйте часто изменяемые столбцы.
Не применяйте индексацию в тех случаях, когда повышение эффективности за счет создания индекса приводит к снижению эффективности при выполнении операций INSERT, UPDATE и DELETE, поскольку при выполнении каждой из отмеченных операций набор индексов будет перестраиваться.
4. Для фильтрации записей используйте WHERE, а не HAVING.
При использовании having вместе с group by на индексированных столбцах индекс не используется. Фильтруйте строки с помощью раздела where. Если для таблицы EMP существует индекс на столбце DEPTID, при выполнении следующего запроса этот индекс использоваться не будет:
Select deptid, sum(salary)
From emp
Group by deptid
Having deptid = 100;
Однако этот запрос можно переписать так, чтобы индекс применялся: