Professional Documents
Culture Documents
Improve Query
Improve Query
bid=567569
http://localhost:4915/BookingEngine/EditBooking/Booking.aspx?bid=567591 - has
discount
https://staging-booking.tourpaq.com/BookingEngine/EditBooking/Booking.aspx?
bid=567774 - many transports && hotels
DiscountID = 8079
rwbtpq
^@7yix*4Wvp4
if @internetSale = 1
begin
set @sql += N' AND AgencyDiscountSupplier.InternetSale = 1 '
end
if @forSale = 1
begin
set @sql += N' AND AgencyDiscountSupplier.ForSale = 1 '
end
set @sql += N'
and (Discount_Supplier.BkgDateStop is null or ''' +
convert(nvarchar(max), @bookingDate, 20) + N''' <= Discount_Supplier.BkgDateStop)
and (Discount_Supplier.BkgDateStart is null or ''' +
convert(nvarchar(max), @bookingDate, 20) + N''' >= Discount_Supplier.BkgDateStart)
and (Discount_Supplier.DateStop is null or ''' + convert(nvarchar(max),
@departureDate, 20) + N''' <= Discount_Supplier.DateStop)
and (Discount_Supplier.DateStart is null or ''' +
convert(nvarchar(max), @departureDate, 20) + N''' >= Discount_Supplier.DateStart)
and (Discount_Supplier.RoomType is null or ' + cast(@hotelRoomID as
nvarchar(MAX)) + N' = Discount_Supplier.RoomType)
and (Discount_Supplier.Transport is null or Discount_Supplier.Transport
= ' + cast(@transportID as nvarchar(MAX)) + N')
and (Discount_Supplier.PeriodOrTripLenght is null or
Discount_Supplier.PeriodOrTripLenght = 0 or Discount_Supplier.PeriodOrTripLenght =
' + cast(@period as nvarchar(MAX)) + N')
and (Discount_Supplier.MinimumLength is null or
Discount_Supplier.MinimumLength <= ' + cast(@nights as nvarchar(MAX)) + N')
and (Discount_Supplier.MaximumLength is null or
Discount_Supplier.MaximumLength >= ' + cast(@nights as nvarchar(MAX)) + N')
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 0)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 0 and Discount_Supplier_Resurser.Code in ( ' +
@hotelArrivalIDs + N' ))
)
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 1)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 1 and Discount_Supplier_Resurser.Code in ( ' +
@hotelResortID + N' ))
)
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 3)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 3 and Discount_Supplier_Resurser.Code in ( ' +
@transportIDs + N' ))
)
and (
' + cast(isnull(@realTransportId, 0) as nvarchar(max)) + N' = 0
or not exists(select top 1 1 from Discount_Supplier_Resurser
where Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID
and Discount_Supplier_Resurser.Type = 4)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 4 and Discount_Supplier_Resurser.Code in ( ' +
@realTransportIDs + N' ))
)
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 2)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 2 and Discount_Supplier_Resurser.Code in ( ' +
@hotelIDs + N' ) and Discount_Supplier_Resurser.SubTypeCode is null)
)
and (
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 5)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 5 and Discount_Supplier_Resurser.Code in ( ' +
@hotelIDs + N' ) and Discount_Supplier_Resurser.SubTypeCode is null)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 5 and Discount_Supplier_Resurser.Code in ( ' +
@hotelIDs + N' ) and Discount_Supplier_Resurser.SubTypeCode in ( ' + @hotelRoomIDs
+ N' ))
)
and (
Discount_Supplier.PriceType is null
or Discount_Supplier.PriceType in ( ' + @priceTypes + N' )
)
and (
Discount_Supplier.Age is null or
Discount_Supplier.Age in ( ' + @genderTypes + N' )
)
'
if @allowOneWay = 0
begin
set @sql += N' AND (discount_supplier.allowononeway is null or
discount_supplier.allowononeway = 0) '
end
if @allowOneWay = 1
begin
set @sql += N' AND Discount_Supplier.AllowOnOneWay = 1 '
end
-- (x between Discount_Supplier_Price.StartAge AND
Discount_Supplier_Price.EndAge) OR (
select @sql
END
====EVENTUAL SOLUTIONS=====
SP este apelata pentru fiecare pasager; pentru records mai mici, este bine cu SP,
dar pentru records mari, poate ar fi mai bine in chunks-> trimitere params
strict pe SP optimizare:
- renuntam la SET NOCOUNT ON;
- reducem subquery urile;
- le vom folosi in left join:
not exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 0)
or exists(select top 1 1 from Discount_Supplier_Resurser where
Discount_Supplier_Resurser.DiscountSuppID = Discount_Supplier.DiscountSuppID and
Discount_Supplier_Resurser.Type = 0 and Discount_Supplier_Resurser.Code in ( ' +
@hotelArrivalIDs + N' ))
using a left join can be more efficient and easier to understand
than using a combination of NOT EXISTS and EXISTS statements, especially when
working with large datasets.
CONCLUSION:
The NOT EXISTS statement returns rows from the first table (Discount_Supplier)
where there are no matching rows in the second table (Discount_Supplier_Resurser)
with a given condition (Discount_Supplier_Resurser.DiscountSuppID =
Discount_Supplier.DiscountSuppID and Discount_Supplier_Resurser.Type = 2).
The EXISTS statement returns rows from the first table (Discount_Supplier) where
there are matching rows in the second table (Discount_Supplier_Resurser) with a
given condition (Discount_Supplier_Resurser.DiscountSuppID =
Discount_Supplier.DiscountSuppID and Discount_Supplier_Resurser.Type = 2 and
Discount_Supplier_Resurser.Code in ( 2919 ) and
Discount_Supplier_Resurser.SubTypeCode is null).
The LEFT JOIN clause returns all the rows from the first table (Discount_Supplier)
and matching rows from the second table (Discount_Supplier_Resurser) based on the
join condition (dsrResourceHotelIDs.DiscountSuppID =
Discount_Supplier.DiscountSuppID and dsrResourceHotelIDs.Type = 2). The WHERE
clause then filters the results based on the condition
(dsrResourceHotelIDs.DiscountSuppID IS NULL or (dsrResourceHotelIDs.DiscountSuppID
IS NOT NULL and dsrResourceHotelIDs.Code in ( ' + @hotelIDs + N' ) and
dsrResourceHotelIDs.SubTypeCode IS NULL)).
HUGE COUNT DIFFERENCE: Yes, this is because using NOT EXISTS and EXISTS causes a
correlated subquery to be executed for each row of the main query, resulting in a
large number of executions. On the other hand, using a LEFT JOIN will give you the
desired result by performing a single join operation, which is generally faster for
large datasets.