2 Выбора или 1 запрос Соединения?

У меня есть 2 таблицы:

книга (идентификатор, заголовок, возраст)----> 100 миллионов строк

автор (идентификатор, book_id, имя, носившее)----> 10 миллионов строк

Теперь, предположение у меня есть универсальный идентификатор книги. Я должен распечатать эту страницу:

Title: mybook

authors: Tom, Graham, Luis, Clarke, George

Так..., что лучший способ состоит в том, чтобы сделать это?

1) Простое соединение как это:

Select book.title, author.name 
From book, author 
WHERE ( author.book_id = book.id ) AND ( book.id = 342 )

2) Для избегают соединения, я мог сделать 2 простых запроса:

Select title FROM book WHERE id = 342

Select name FROM author WHERE book_id = 342 

Каков самый эффективный путь?

8
задан Aaron Harun 29 June 2010 в 00:23
поделиться

5 ответов

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

Отдельные связанные запросы - плохая привычка, которая убивает вашу производительность быстрее, чем большинство других вещей.

8
ответ дан 5 December 2019 в 14:00
поделиться

Минимизация цикла туда и обратно и продвижение разумных планов выполнения - самые важные пункты в моем списке результатов.

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

Select title,NULL AS name FROM book WHERE id = 342 
UNION ALL
Select NULL,name FROM author WHERE book_id = 342 

В вашем конкретном примере я бы выбрал №1 с предупреждением, чтобы подумать, что бы произошло, если бы в файле не было авторов для данной книги.

1
ответ дан 5 December 2019 в 14:00
поделиться

Первый, особенно если у вас есть индекс по author.book_id. Клостеринг-индекс был бы лучше всего, если бы у вас много авторов, и это возможно, иначе не-клостеризованный индекс также вам очень поможет.

1
ответ дан 5 December 2019 в 14:00
поделиться

Я знаю, что это не должно рассматриваться, но первый запрос вернет вам такой набор результатов:

title     name
-----------------
mybook    Tom
mybook    Graham
mybook    Luis
mybook    Clarke
mybook    George

, тогда как вторая пара вернет вам пару таких наборов результатов :

title
-------
mybook

и

name
--------
Tom
Graham
Luis
Clarke
George

, поэтому каждый подход возвращает данные по-разному. В этом простом примере повторение названия книги не будет иметь значения, но если бы вместо названия вы возвращали первую главу (скажем), это было бы менее эффективно, так как было бы много повторяющихся данных. Таким образом, хотя второй может занять больше времени в базе данных, он может быть быстрее и эффективнее при отправке этих данных по сети.

Вам нужно проверить свои фактические результаты и посмотреть, какой из них работает лучше всего.

0
ответ дан 5 December 2019 в 14:00
поделиться

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

На этот вопрос уже давался подробный ответ: LEFT JOIN против нескольких операторов SELECT

2
ответ дан 5 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: