2010-06-13 2 views
8

У меня есть 2 таблицы:2 Выберите или 1 Присоедините запрос?

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

автор (идентификатор, 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

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

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

+0

БД не сворачивает строки в список, разделенный запятыми, клиент, предположительно, может использовать некоторый язык сценариев. –

+1

@Evan - Он может работать с GROUP_CONCAT или аналогичным. –

+0

Я не сказал, что это невозможно. Я просто хотел сказать, что это не делается, и это является внешним по отношению к вопросу. –

2

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

Это было отвечено в глубине перед: LEFT JOIN vs. multiple SELECT statements

1

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

0

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

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

в то время как вторая пара вернет вам пару наборов результатов, как это:

title 
------- 
mybook 

и

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

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

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

+0

Да, я знаю ... но я хочу знать, что является самым эффективным способом :) – xRobot

+1

Вы могли бы также, если бы это было лучше, чем в VI или Emacs. Для всех ситуаций нет «правильного» ответа. Выполните сто или тысячу тестовых запросов с использованием циклов и посмотрите, что требуется больше времени. Используйте другой. –

+0

@Aaron, хорошая аналогия. – ChrisF

1

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

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

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

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

Смежные вопросы