Сравнение запросов SQL JOIN - PullRequest
       0

Сравнение запросов SQL JOIN

0 голосов
/ 03 декабря 2018

Следующее объяснение из книги: Граф базы данных.Робинсон, Ян, Джим Уэббер и Эмиль Эйфрем.в "O'Reilly Media, Inc.", 2013.


Скажем, есть 2 таблицы:

Человек

ID, Person
1, Alice  
2, Bob  
..,..  
99, Zach 

PersonFriend

ID, Person 
1, 2   
2, 1  
2, 99  
..,..  
99,1

Пример 2-1.Друзья Боба

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'.

Дружба не всегда является рефлексивной связью, как в примере2-2, мы задаем ответный запрос: «кто дружит с Бобом

Пример 2-2.Кто дружит с Бобом?

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) почему запрос в примере 2-2 стоит дороже, чем запрос в примере 2-1?
2) почему он называется ответным запросом?

1 Ответ

0 голосов
/ 03 декабря 2018
  1. Единственное, что я вижу, что повлияет на производительность, это то, как определяются индексы.
    Случай 1: Ваш единственный индекс находится на (PersonID, FriendID).Все известные мне БД создадут индекс B-дерева по умолчанию и смогут использовать его для поиска только по PersonID.Следствие: часть ON PersonFriend.PersonID = p2.ID WHERE p2.Person = 'Bob', вероятно, будет использовать его и будет быстрой.Для второго запроса это не будет иметь место.
    Случай 2: У вас есть 2 отдельных индекса, по одному на каждый столбец (PersonID) и (FriendID).В этой ситуации 2 запроса будут эквивалентны с точки зрения производительности (они будут просто использовать каждый из индексов).

  2. Не принимайте ответный запрос в качестве технического термина, потому что это не то, чем он является.
    Автор просто перевернул JOIN.В первом запросе FriendID появляется первым, а PersonID вторым.Это дает ответ: кому нравится Боб?
    Напротив, второй запрос делает соединения против PersonID первого и FriendID второго.Это дает ответ: кому нравится Боб?(то есть: дружба была ответная )

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