Будет ли разница в производительности между этими 2 запросами? - PullRequest
2 голосов
/ 07 декабря 2011

1)

select * from student_tbl A ,result_tbl B where
A.student_name = B.student_name and
A.student_name = "xyz" ;

2)

select * from student_tbl A ,result_tbl B where
A.student_name = "xyz" and
A.student_name = B.student_name ;

Я знаю, что результат этих запросов одинаков. Есть ли разница в производительности? Если да, пожалуйста, объясните, почему.

Ответы [ 3 ]

6 голосов
/ 07 декабря 2011

Запросы не выполняются как программы. Это не процедуры, которые выполняют шаг 1, а затем шаг 2. Вместо этого они являются декларативными утверждениями о том, каких результатов вы хотите получить. В большинстве современных СУБД любой заданный запрос может быть выполнен с помощью нескольких различных планов запросов. Как правило, создаются различные планы запросов, а затем оценивается, какой план будет выполняться быстрее всего. При создании набора планов запросов он будет учитывать такие вещи, как, какие условия должны оцениваться в первую очередь, следует ли выполнять объединения до или после оценки условий и тому подобное, чтобы попытаться выяснить, какие из них постятся (основываясь на его знании размеры таблицы и предположения о том, какой процент таблицы будет включен в данное условие). Многие из них также смотрят на предыдущие результаты, чтобы информировать будущие решения о том, когда их приближения неверны.

Скорее всего, в любой современной СУБД эти два запроса будут генерировать один и тот же набор планов запросов, и, следовательно, будет сделан один и тот же выбор, в результате чего для обоих запросов будет выполнен один и тот же план запросов. В зависимости от того, какую СУБД вы используете, обычно доступны инструменты для просмотра конкретных планов запросов, которые выбираются для данного запроса, поэтому вы можете использовать их, чтобы ответить на вопрос абсолютно для двух конкретных запросов в конкретной базе данных.

Теперь, говоря это, я должен отметить, что это не эквивалентно высказыванию "Любые два запроса, которые всегда будут давать один и тот же ответ на одни и те же данные, всегда будут занимать одинаковое количество времени". Можно писать действительно плохие запросы, в основном из-за ненужной сложности, и нет никакой гарантии, что планировщик запросов поймет, что вы перестарались. Это вероятно поймает простые случаи. Так, например:

SELECT * FROM student_tbl A, result_tbl B WHERE 
A.student_name = B.student_name AND
A.student_name = 'xyz' AND
B.student_name = A.student_name

также, вероятно, выдаст тот же план запроса. И это также вероятно:

SELECT * FROM student_tbl A, result_tbl B WHERE 
A.student_name = B.student_name AND
A.student_name = 'xyz' AND
B.student_name = 'xyz'

Но если вы делаете что-то действительно сложное, как

(SELECT * FROM student_tbl A, result_tbl B WHERE
 A.student_name = B.student_name AND
 A.student_name = 'xyz')
UNION
(SELECT * FROM student_tbl A, result_tbl B WHERE
 A.student_name = B.student_name AND
 B.student_name = 'xyz')
INTERSECT
(SELECT * FROM student_tbl A, result_tbl B WHERE
 A.student_name = 'xyz')

Может выполняться более сложный план запроса. (Несмотря на то, что этот совершенно неоправданно сложный запрос будет давать те же результаты, что и два других (при условии отсутствия значений NULL)).

Итак, оптимизаторы не всеведущие, но они склонны признавать, что X и Y - это то же самое, что Y и X, и что A = B и B = C - это то же самое, что A = C и A = B и скорректировать соответственно для этих случаев. Они на самом деле делают различные преобразования, чтобы попытаться найти лучший запрос, и, как правило, довольно хорошо его находят. Можно переопределить решения планировщика запросов, но это следует делать только тогда, когда вы уверены, что есть лучший способ выполнить запрос и что изменения данных вряд ли это изменит.

2 голосов
/ 07 декабря 2011

Предполагая, что вы используете сервер Sql, вы можете отобразить план выполнения для каждого и посмотреть, что на самом деле происходит, это покажет вам стоимость каждой операции и то, что запрос фактически делает с каждой таблицей.

Для более глубокого изучения вы также можете просто выполнить запросы и проверить время выполнения.

Я подозреваю, что реальный вопрос здесь заключается в следующем: "Влияет ли порядок условий в предложении where на производительность?»в этом случае вы можете прочитать этот пост SO Имеет ли значение порядок столбцов в предложении WHERE?

2 голосов
/ 07 декабря 2011

Это то же самое. Условие в предложении where означает, что A.student_name и B.student_name имеют значение «xyz». Скорее всего, оптимизатор запросов сгенерирует одинаковый план выполнения для обоих, но вы можете проверить это, изучив план выполнения (например, в SQL Server Management Studio, если вы используете MS SQL Server).

...