Наиболее ограничительное условие

Правильный порядок условий связывания

Как вы уже узнали из урока «Объединение таблиц в запросах», часто для связывания таблиц используется связующая таблица, имеющая по одному или сразу по несколько общих столбцов с другими таблицами в запросе. Связующую таблицу можно назвать в запросе главной. С ней связаны почти все или даже все другие таблицы в запросе. Обычно столбец связующей таблицы в выражении ключевого слова WHERE размещают справа от знака определяющей связь операции. Таблицы, связываемые с главной таблицей, обычно располагают в порядке от самой маленькой до самой большой, точно так же, как и в списке ключевого слова FROM.

Если связующей таблицы нет, таблицы располагают по возрастанию их размеров, а справа от знака операции связывания в выражении ключевого слова WHERE указывается наибольшая из таблиц. Условия связывания должны в выражении ключевого слова WHERE предшествовать условиям фильтра приблизительно следующим образом.

FROM таблица1(Наименьшая из таблиц),

таблица2,

таблица3(Наибольшая из таблиц или связующая таблица)

WHERE таблица1.столбец = таблицаЗ.столбец Условие связывания

AND таблица2.столбец = таблицаЗ.столбец Условие связывания

[ AND условие1 ] Условие фильтра [ AND условие2 ] Условие фильтра;

В этом случае таблицаЗ используется в качестве связующей, а таблица1 и таблица2 оказываются связанными с ней.

Ввиду того, что сами по себе связывания таблиц обычно возвращают достаточно большую часть данных этих таблиц, условия связывания лучше обрабатывать после обработки более ограничительных условий

Наиболее ограничительное условие обычно оказывается наиболее важным для оптимальной работы оператора SQL, представляющего запрос. Но какое из условий является наиболее ограничительным? Это условие в выражении ключевого слова WHERE, возвращающее наименьшее число строк данных. Аналогично, наименее ограничивающим условием является условие, возвращающее наибольшее число строк данных. На этом уроке мы сконцентрируем наше внимание на наиболее ограничительном условии просто потому, что это условие наиболее жестко фильтрует возвращаемые запросом данные.

Предложить оптимизатору сначала обработать наиболее ограничительное условие желательно именно потому, что оно возвращает наименьшее число строк данных, тем самым, сокращая объем лишней работы при выполнении запроса. Правильный выбор наиболее ограничительного условия требует понимания правил работы оптимизатора. Как правило, оптимизаторы обрабатывают выражение ключевого слова WHERE от конца к началу. В таком случае наиболее ограничительное условие следует разместить в выражении последним, и тогда это условие будет обработано оптимизатором первым.

FROM таблица1(Наименьшая из таблиц), таблица2,

таблица3(Наибольшая из таблиц или связующая таблица)

WHERE таблица1.столбец = таблицаЗ.столбец(Условие связывания)

AND таблица2.столбец = таблицаЗ.столбец(Условие связывания)

[ AND условие1 ] (Наименее ограничительное)

[ AND условие2 ] (Наиболее ограничительное);

Если вы не знаете, как работает оптимизатор используемой вами реализации SQL, не знает этого администратор базы данных, и у вас нет возможности получить справку по этой теме, просто выполните несколько раз запрос, требующий обработки достаточно большого объема данных, меняя порядок размещения условий в выражении ключевого слова WHERE. При этом не забудьте в каждом случае записать время, которое будет потрачено на выполнение запроса. Довольно скоро вам станет ясно, каким образом оптимизатор обрабатывает выражение ключевого слова WHEPE – от конца к началу или наоборот

Для примера рассмотрим следующую тестовую таблицу.

Имя таблицы TEST

Число строк 95867

УСЛОВИЯWHERE LAST_NAME_= 'SMITH'

Возвращает 2000 строк

WHERE CITY = 'INDIANAPOLIS'

Возвращает 30000 строк

Наиболее ограничительное условие WHERE LAST_NAME = 'SMITH'