Проверьте по документации к используемой вами реализации SQL, нет ли в ней советов по поводу использования нескольких таблиц в списке ключевого слова FROM.
Правильный порядок условий связывания
Как вы уже узнали из урока 13, "Объединение таблиц в запросах", часто для связывания таблиц используется связующая таблица, имеющая по одному или сразу по несколько общих столбцов с другими таблицами в запросе. Связующую таблицу можно назвать в запросе главной. С ней связаны почти все или даже все другие таблицы в запросе. Обычно столбец связующей таблицы в выражении ключевого слова WHERE размещают справа от знака определяющей связь операции. Таблицы, связываемые с главной таблицей, обычно располагают в порядке от самой маленькой до самой большой, точно так же, как и в списке ключевого слова FROM.
Если связующей таблицы нет, таблицы располагают по возрастанию их размеров, а справа от знака операции связывания в выражении ключевого слова WHERE указывается наибольшая из таблиц. Условия связывания должны в выражении ключевого слова WHERE предшествовать условиям фильтра приблизительно следующим образом.
FROM таблица1, Наименьшая из таблиц
таблица2,
таблица3 Наибольшая из таблиц или связующая таблица
WHERE таблица1.столбец - таблицаЗ.столбец Условие связывания
AND таблица2.столбец = таблицаЗ.столбец Условие связывания
[ AND условие1 ] Условие фильтра [ AND условие2 ] Условие фильтра
В этом случае таблицаЗ используется В качестве связующей, а таблица! и таблица2 оказываются связанными с ней.
Ввиду того, что сами по себе связывания таблиц обычно возвращают достаточно большую часть данных этих таблиц, условия связывания лучше обрабатывать после обработки более ограничительных условий
Наиболее ограничительное условие
Наиболее ограничительное условие обычно оказывается наиболее важным для оптимальной работы оператора SQL, представляющего запрос. Но какое из условий является наиболее ограничительным? Это условие в выражении ключевого слова WHERE, возвращающее наименьшее число строк данных. Аналогично, наименее ограничивающим условием является условие, возвращающее наибольшее число строк данных. На этом уроке мы сконцентрируем наше внимание на наиболее ограничительном условии просто потому, что это условие наиболее жестко фильтрует возвращаемые запросом данные.
Предложить оптимизатору сначала обработать наиболее ограничительное условие желательно именно потому, что оно возвращает наименьшее число строк данных, тем самым сокращая объем лишней работы при выполнении запроса. Правильный выбор наиболее ограничительного условия требует понимания правил работы оптимизатора. Как правило, оптимизаторы обрабатывают выражение ключевого слова WHERE от конца к началу. В таком случае наиболее ограничительное условие следует разместить в выражении последним, и тогда это условие будет обработано оптимизатором первым.
FROM таблица!. Наименьшая из таблиц таблица2,
таблицаЗ Наибольшая из таблиц или связующая таблица
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'
Запрос1
SELECT COUNT(*)
FROM TEST
WHERE LAST_NAME = 'SMITH'
AND CITY = 'INDIANAPOLIS';
COUNT(*)
--------
1024
3anpoc2
SELECT COUNT<*)
FROM TEST
WHERE CITY = 'INDIANAPOLIS'
AND LAST_NAME = 'SMITH';
COUNT(*)
--------
1024
Предположим, что Запрос! выполнялся 20 секунд, а Запроса - 10 секунд. Поскольку Запрос2 был выполнен быстрее и при этом наиболее ограничительное условие было последним, то можно смело предположить, что оптимизатор обрабатывает выражение ключевого слова WHERE от конца к началу.
Читать дальше