inner против left

OldStudent
Дата: 13.07.2012 14:14:14
FB 2.5
Запрос
select
    t_bill.id_bill,
    t_bill.itogo,
    t_bill.datan,
    v_summy_billov.total as summa_billa
from t_bill
inner join v_summy_billov  on (t_bill.id_bill = v_summy_billov.id_bill)

план
PLAN JOIN ((V_SUMMY_BILLOV SUMMY_BN T_OTGRUZ NATURAL)
PLAN (V_SUMMY_BILLOV SUMMY_BN T_PLATEZHI NATURAL)
PLAN (V_SUMMY_BILLOV SUMMY_BN T_PLATA_ZA_HRANENIE NATURAL)
PLAN (V_SUMMY_BILLOV SUMMY_BN T_OTPUSK_TOVARA NATURAL), T_BILL INDEX (PK_T_BILL))
Время подготовки запроса = 31ms
Время выполнения запроса = 0ms
Ставлю left join (разница в количестве записей которые после этого будут в результате 2-3) и время выполнения запроса сразу увеличивается в разы т.е. запрос
select
    t_bill.id_bill,
    t_bill.itogo,
    t_bill.datan,
    v_summy_billov.total as summa_billa
from t_bill
left join v_summy_billov  on (t_bill.id_bill = v_summy_billov.id_bill)

план
PLAN JOIN (T_BILL NATURAL(V_SUMMY_BILLOV SUMMY_BN T_OTGRUZ NATURAL)
PLAN (V_SUMMY_BILLOV SUMMY_BN T_PLATEZHI NATURAL)
PLAN (V_SUMMY_BILLOV SUMMY_BN T_PLATA_ZA_HRANENIE NATURAL)
PLAN (V_SUMMY_BILLOV SUMMY_BN T_OTPUSK_TOVARA NATURAL))
Время подготовки запроса = 32ms
Время выполнения запроса = 982ms

понятно что во втором запросе не используется первичный индекс таблицы t_bill, но может ктонибудь подскажет что делать? как сделать выполнение второго запроса быстрее?
в таблице t_bill - только PK , v_summy_billov - представление :
with summy_bn as
(select t_otgruz.id_bill, t_otgruz.summa_bn as total
from
t_otgruz
union all
select  t_platezhi.id_bill, t_platezhi.rash_bn as total
from t_platezhi
union all
select t_plata_za_hranenie.id_bill, t_plata_za_hranenie.summa  as total
from t_plata_za_hranenie
union all
select t_otpusk_tovara.id_bill, t_otpusk_tovara.zatrati as total
from t_otpusk_tovara )
select summy_bn.id_bill, sum(summy_bn.total)
from summy_bn
group by summy_bn.id_bill
Гаджимурадов Рустам
Дата: 13.07.2012 14:17:47

Попробуй +0 отключить.

Posted via ActualForum NNTP Server 1.5

OldStudent
Дата: 13.07.2012 14:29:16
Гаджимурадов Рустам
Попробуй +0 отключить.


поясните для дилетанта пожалуйста что это значит
OldStudent
Дата: 13.07.2012 15:07:09
OldStudent
Гаджимурадов Рустам
Попробуй +0 отключить.


поясните для дилетанта пожалуйста что это значит

если +0 это отключение индекса в запросе, то не понимаю куда его вставлять здесь и как это может помочь во втором запросе?
dimitr
Дата: 13.07.2012 15:10:58
в таблицах внутри вьюхи поле id_bill индексировано?
OldStudent
Дата: 13.07.2012 15:15:03
dimitr
в таблицах внутри вьюхи поле id_bill индексировано?

нет там тоже только свои PK-шки
dimitr
Дата: 13.07.2012 15:15:46
OldStudent,

ну и что ты тогда хочешь?
OldStudent
Дата: 13.07.2012 15:30:48
dimitr
OldStudent,

ну и что ты тогда хочешь?

хочу понять
1) так и должно быть - что в данном случае left в десятки раз медленнее inner и с этим ничего не поделать?
2) изменилась бы ситуация если бы в таблицах что в представлении поле id_bill было бы связано FK с t_bill?
dimitr
Дата: 13.07.2012 15:32:17
ответ "да" на оба вопроса