При написании SQL запросов есть ряд правил, которым нужно просто следовать. Можно вдаваться в поиски, почему надо писать так, а не иначе, но для понимания нужен багаж и некоторый практический опыт, а ведь зачастую SELECT’ы надо писать уже сейчас, да так, чтобы они летали и после не переписывать.
Правило WHERE
Условие можно записать так, что оно полностью отключит оптимизатор. Как следствие: запрос выполняется дольше, несмотря на имеющийся индекс.
Так пишут новички: | Гораздо лучше: |
SELECT doc_dd, customer_n, total_doc | SELECT doc_dd, customer_n |
var ls_n VARCHAR2( 20) | var ls_n VARCHAR2( 20) |
SELECT doc_dd, customer_n, total_doc | SELECT doc_dd, customer_n |
SELECT doc_dd, customer_n | SELECT doc_dd, customer_n |
SELECT doc_dd, customer_n, total_doc | SELECT doc_dd, customer_n |
SELECT doc_dd, customer_n, total_doc | SELECT doc_dd, customer_n |
Правило HAVING
Так пишут новички: | Гораздо лучше: |
SELECT a.customer_n | SELECT a.customer_n |
Комбинированные подзапросы
Так пишут новички: | Гораздо лучше: |
SELECT customer_n | SELECT customer_n |
Операции EXISTS, IN, Join
Эффективность следующих трёх конструкций зависит от данных в таблицах. Выбирайте исходя из ситуации.
SELECT customer_n |
SELECT customer_n |
SELECT a.customer_n |
Операция DISTINCT
Для выполнения DISTINCT требуется, во-первых, иметь под рукой всю выборку, во-вторых, её нужно будет отсортировать и затем удалить дубликаты. Скорость выполнения последних напрямую связана с размером выборки. Поэтому если в запросе есть соединение таблиц, которое порождает большой объём, лучше переписать запрос, используя уникальный ключ (в примере: doc_nd).
Так пишут новички: | Гораздо лучше: |
SELECT DISTINCT a.doc_nd | SELECT a.doc_nd |
Функция DECODE
Сокращайте количество просмотров одной и той же таблицы (особенно если фильтрация идёт по колонкам, не имеющих индекса), используя возможности DECODE.
SELECT COUNT(*) |
SELECT COUNT( DECODE( doc_nd, 139, 'X', NULL )) cnt_139 |
Операция UNION ALL
Есть существенное различие между UNION и UNION ALL. Первая операция формирует общую выборку из данных всех подзапросов, затем сортирует её, удаляет дубли, и возвращает результат. Операция UNION ALL ничего этого не делает — сразу возвращает общую выборку. Если достоверно известно, что данные в подзапросах уникальны, используйте UNION ALL.
Так пишут новички: | Гораздо лучше: |
SELECT doc_nd, sum_tax | SELECT doc_nd, sum_tax |
Anti-Join
Запросы, возвращающие записи, для которых нет данных в связанной таблице, называют anti-join. Далее три типичных варианта (но лучше их избегать, если честно )).
SELECT * |
SELECT * |
SELECT a.* |
0 коммент.:
Отправить комментарий