Как оптимизировать SQL запрос его выполнение занимает много времени
У меня есть запрос, когда я выполняю его на сервере разработки и производства, это требует увеличения потребления процессора до 100%.
это из-за внешнего применения я также попытался с подзапросом и с внутренним соединением, но возникает же вопрос
Что я уже пробовал:
declare @fJno varchar (50)=820, @noOfRows int =10, @toJno varchar (50)=828 select top (@noOfRows) z.AgentName Nick, upper(agnt.AgentName)AgentName ,sum (z.[Local])[Local] ,sum(z.[Foreign])[Foreign] ,(sum (z.[Local])+sum(z.[Foreign]))Total from ( select * from( SELECT Substring(LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(upper(AgentName), '&', ''), '(', ''), ')', ''), ',', ''), '.', ''), '-', ''))), 1,Charindex(' ', LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(upper(AgentName), '&', ''), '(', ''), ')', ''), ',', ''), '.', ''), '-', '')))+' ')-1) [AgentName] ,( [Local])[Local] ,( [Foreign])[Foreign] , [Local]+[Foreign] as Total FROM ( SELECT LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(upper(p.AgentName), '&', ''), '(', ''), ')', ''), ',', ''), '.', ''), '-', '')))AgentName ,(case when CompanyCountry like '%pakistan%' then 'Local' when CompanyCountry != '%pakistan%' then 'Foreign' else '' end) as CompanyCountry --,JournalNo ,FORMAT( JournalDate,'MMMyy')JournalDate FROM [TheLegalFiles-Dev].dbo.SearchProductGoodsClass p where LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(upper(p.AgentName), '&', ''), '(', ''), ')', ''), ',', ''), '.', ''), '-', ''))) like ''+Substring(LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(upper(p.AgentName), '&', ''), '(', ''), ')', ''), ',', ''), '.', ''), '-', ''))), 1,Charindex(' ', LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(upper(p.AgentName), '&', ''), '(', ''), ')', ''), ',', ''), '.', ''), '-', '')))+' ')-1)+'%' and JournalNo >= @fJno and JournalNo<=@toJno ) t PIVOT( count(CompanyCountry) FOR CompanyCountry IN ([Local], [Foreign]) ) AS pivot_table )pvt )z outer apply ( select top 1 agentname from [TheLegalFiles-Dev].dbo.SearchProductGoodsClass where DataEntryStatusid=1 and JournalNo> = @fJno and JournalNo<=@toJno and agentname is not null and Substring(LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(upper(AgentName), '&', ''), '(', ''), ')', ''), ',', ''), '.', ''), '-', ''))), 1,Charindex(' ', LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(upper(AgentName), '&', ''), '(', ''), ')', ''), ',', ''), '.', ''), '-', '')))+' ')-1) like ''+ z.AgentName +'' ) agnt group by z.AgentName--,LTRIM(RTRIM( z.JournalDate)) ,agnt.AgentName order by (sum (z.[Local])+sum(z.[Foreign])) desc
Richard MacCutchan
Удалите все эти команды обрезки и замены, вы создаете огромные накладные расходы в своем запросе.
Noman Suleman
если я удалю команду replace, то получу дубликаты записей, после того как команда replace вернет свою уникальную запись
Richard MacCutchan
Ну, это будет медленно делать таким образом.
Noman Suleman
не, когда я удалить наружный применить, этот запрос будет возвращать в течение 1 сек, после космического применить его идет на большой расход, его из-за условия where параметр @ФНО и @Tjno , и эта внешняя предложении return тысяч записей, поэтому ее становится медленным, я хочу знать, есть ли способ, чтобы заменить с другими apprach?
Sinisa Hajnal
Просто слепо...делать замены, как высоко, как вы можете так, что они запускаются на меньшее количество строк
Сделать памяти или временных таблиц, заполнить их самостоятельно, а потом присоединиться к ним
явно выпишите соединения вместо локальных, внешних
подумайте о том, чтобы иметь столбец в таблице, который уже имеет "поисковую" версию имени, чтобы вы могли делать все эти замены при вставке или обновлении вместо этого в предложении WHERE (плохая практика)
Noman Suleman
хорошо, спасибо за предложение. дай мне попробовать