Почему следующие взаимные запросы имеют разную производительность? - PullRequest
0 голосов
/ 06 января 2020

Читая книгу «Графические базы данных» Орейли, автор утверждает, что запрос A менее интенсивен в вычислительном отношении, чем запрос B, но я не могу заметить разницу.

В частности, он представляет следующее схема: Simple join-table arrangement for recording friendships

Ниже я представляю два запроса вместе с комментариями автора:

Запрос A : (Кто друзья Боба ?)

SELECT p1.Person
FROM Person p1 JOIN
     PersonFriend
     ON PersonFriend.FriendID = p1.ID JOIN
     Person p2
     ON PersonFriend.PersonID = p2.ID
WHERE p2.Person = 'Bob'

Это не особенно дорогой или сложный запрос, поскольку он ограничивает количество рассматриваемых строк с использованием фильтра WHERE Person.person = 'Bob'.

Запрос B : (Кто дружит с Бобом?)

SELECT p1.Person
FROM Person p1 JOIN
     PersonFriend
     ON PersonFriend.PersonID = p1.ID JOIN
     Person p2
     ON PersonFriend.FriendID = p2.ID
WHERE p2.Person = 'Bob'

Этот ответный запрос все еще прост в реализации, но на стороне базы данных он более дорого, потому что база данных теперь должна учитывать все строки в таблице PersonFriend.

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

1 Ответ

0 голосов
/ 06 января 2020

Я почти уверен, что это утверждение неверно. , , по крайней мере, в том смысле, что база данных может быть структурирована таким образом, чтобы они имели одинаковую производительность. Для такой таблицы, как personfriend, нужны индексы как (personid), так и (friendid) (или, что еще лучше, (personid, friendid) и (friendid, personid)).

При использовании обоих индексов оба запроса можно оптимизировать для использования. один из индексов.

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

Но наличие индексов может дать им по существу тот же план выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...