Руководство по созданию эффективных запросов



Download 17,08 Mb.
Pdf ko'rish
bet88/210
Sana25.06.2022
Hajmi17,08 Mb.
#704548
TuriРуководство
1   ...   84   85   86   87   88   89   90   91   ...   210
Bog'liq
OptimizZaprvPostgreSQL

113
Рис. 6.7 

План выполнения с антисоединением
Рис. 6.8 

План выполнения без антисоединения
Полу- и антисоединения с использованием 
оператора JOIN
На этом этапе внимательный читатель может задаться вопросом, почему 
нельзя использовать явное соединение и указать именно то, что нужно. За-
чем использовать операторы 
EXISTS
и 
IN
? Отвечаем: это возможно и в некото-
рых случаях действительно лучше, чем использовать полусоединения. Нужно 
только аккуратно построить логически эквивалентный запрос.
Запросы в лис тингах 6.3 и 6.4 семантически эквивалентны, но запрос 
в лис тинге 6.9 не эквивалентен им. Напомним, что запросы в лис тингах 6.3 
и 6.4 возвращают информацию о рейсах, на которые есть хотя бы одно бро-
нирование.
Листинг 6.9 

Соединение возвращает дубликаты
SELECT f.*
FROM flight f
JOIN booking_leg bl USING (flight_id)
В отличие от них, запрос в лис тинге 6.9 вернет для каждого рейса столько 
строк, сколько найдется бронирований с соответствующим 
flight_id
. Чтобы 
вернуть только по одной записи на рейс, как в исходном варианте, запрос 
необходимо переписать, как показано в лис тинге 6.10.


114

Длинные запросы и полное сканирование
Листинг 6.10 

Запрос с соединением, возвращающий по одной строке на рейс
SELECT *
FROM flight f
JOIN (SELECT DISTINCT flight_id FROM booking_leg) bl
USING (flight_id)
План выполнения этого запроса показан на рис. 6.9, и он не содержит 
полусоединение.
Рис. 6.9 

План выполнения для запроса из лис тинга 6.10
Из плана выполнения не очевидно, будет ли этот запрос выполняться 
быст рее или медленнее, чем запрос с полусоединением. На практике он вы-
полняется более чем в два раза быстрее, чем запрос из лис тинга 6.3.
Если вам нужны только идентификаторы рейсов, на которые имеется бро-
нирование, достаточно выполнить запрос из лис тинга 6.11.
Листинг 6.11 

Запрос с соединением, возвращающий только flight_id
SELECT flight_id
FROM flight f
JOIN (SELECT DISTINCT flight_id FROM booking_leg) bl USING (flight_id)
План выполнения этого запроса, показанный на рис. 6.10, значительно 
отличается от плана на рис. 6.9, а выполнение идет еще быстрее.
Рис. 6.10 

План выполнения с соединением слиянием
А что насчет антисоединений? Антисоединение не может создавать дуб-
ликаты, а это означает, что можно использовать 
OUTER
JOIN
с последующим 


Длинные запросы и порядок соединений 


Download 17,08 Mb.

Do'stlaringiz bilan baham:
1   ...   84   85   86   87   88   89   90   91   ...   210




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish