hello
I have the following query but it is coplex and slow
can you help me to optimize it please?
thank you
indent preformatted text by 4 spaces
SELECT
CONVERT(VARCHAR(20), DAT_Bon.CreationDate, 104) + ' ' + CONVERT(VARCHAR(20), DAT_Bon.CreationDate, 108) Erstellungsdatum,
DAT_Article_HISTArchive.ArticleNumber Artikelnummer,
DAT_CashPoint_HISTArchive.CashPointNumber Kassennummer,
DAT_BonLine.Quantity Multiplikator,
REPLACE(CONVERT(decimal(10,2),DAT_BonLine.Subsidy), '.', ',') Subvention,
REPLACE(CONVERT(decimal(10,2),DAT_BonLine.Discount), '.', ',') Rabatt,
CONVERT(INT, DAT_BonLine.VATValue * 100) Umsatzsteuer,
REPLACE(CONVERT(decimal(10,2),DAT_BonLine.Quantity * DAT_BonLine.NetPrice * (1+DAT_BonLine.VATValue) * (1-DAT_BonLine.Discount)), '.', ',') Bruttosumme,
DAT_Bon.CardNumber Kartennummer,
ISNULL(LOV_PriceLevel_Restaurant.PriceLevelNumber, -1) Preislevelnummer,
SEC_User.PersonalNumber Personennummer,
LOV_ArticleGroup.ArticleGroupNumber Artikelgruppennummer,
LOV_ProductGroup.ProductGroupNumber Produktgruppennummer,
ISNULL(EVENT_Event.EventNumber,'') Eventnummer,
DAT_Bon.GeneratedBonNumber Bonnummer
FROM
(
select DAT_Bon.*,
case
when cancelBon.CreationDate < DAT_Bon.CreationDate then cancelBon.CreationDate
else DAT_Bon.CreationDate
end OriginalCreationDate from DAT_Bon
INNER JOIN DAT_Bon cancelBon on DAT_Bon.CancelBon_ID = cancelBon.ID
UNION ALL
select DAT_Bon.*, DAT_Bon.CreationDate OriginalCreationDate from DAT_Bon
WHERE DAT_Bon.CancelBon_ID IS NULL
)DAT_Bon
--DAT_Bon b
INNER JOIN dbo.DAT_BonLine ON DAT_BonLine.Bon_ID = DAT_Bon.ID
INNER JOIN dbo.DAT_CashPoint_HISTArchive ON dbo.GetCashPointArchiveID(DAT_Bon.CashPoint_ID, DAT_Bon.OriginalCreationDate) = DAT_CashPoint_HISTArchive.ID
INNER JOIN dbo.DAT_Restaurant_HISTArchive ON dbo.GetRestaurantArchiveID(DAT_CashPoint_HISTArchive.Restaurant_ID, DAT_Bon.OriginalCreationDate) = DAT_Restaurant_HISTArchive.ID
INNER JOIN dbo.DAT_Article_HISTArchive ON dbo.GetArticleArchiveID_New(DAT_BonLine.Article_ID, DAT_Bon.OriginalCreationDate) = DAT_Article_HISTArchive.ID
INNER JOIN dbo.LOV_ArticleGroup ON LOV_ArticleGroup.ID = DAT_Article_HISTArchive.ArticleGroup_ID
INNER JOIN dbo.LOV_ProductGroup ON LOV_ProductGroup.ID = DAT_Article_HISTArchive.ProductGroup_ID
INNER JOIN dbo.DAT_Person_HISTArchive ON dbo.GetPersonArchiveID_NEW(DAT_Bon.Person_ID, DAT_Bon.OriginalCreationDate) = DAT_Person_HISTArchive.ID
INNER JOIN dbo.DAT_CustomerGroup_HISTArchive ON dbo.GetCustomerGroupArchiveID_New(DAT_Person_HISTArchive.CustomerGroup_ID, DAT_Bon.OriginalCreationDate) = DAT_CustomerGroup_HISTArchive.ID
INNER JOIN dbo.SEC_User ON SEC_User.ID = DAT_Bon.CreationUser_ID
LEFT JOIN dbo.LOV_PriceLevel_Restaurant ON LOV_PriceLevel_Restaurant.ID = DAT_Bon.PriceLevelRestaurant_ID
LEFT JOIN dbo.LOV_PriceLevel ON LOV_PriceLevel.ID = LOV_PriceLevel_Restaurant.PriceLevel_ID
LEFT JOIN dbo.EVENT_Event_Bon ON EVENT_Event_Bon.Bon_ID = DAT_Bon.ID
LEFT JOIN dbo.EVENT_Event ON EVENT_Event.ID = EVENT_Event_Bon.Event_ID
where dat_bon.creationdate between '2016-01-01' and '2016-01-10'
AND DAT_Bon.IsCancel = 0 AND DAT_BonLine.Cancel_ID IS NULL AND (DAT_CustomerGroup_HISTArchive.CustomerGroupNumber >= 0 OR DAT_Bon.CardNumber = 'EVENT') AND DAT_Article_HISTArchive.ArticleNumber > 0
ORDER BY DAT_Bon.CreationDate, DAT_CashPoint_HISTArchive.CashPointNumber, DAT_Article_HISTArchive.ArticleNumber, DAT_BonLine.Quantity