Estou tentando inserir os 253 principais valores para cada trader de uma tabela de traders temporários na tabela de resultados temporários.
Estou usando o seguinte código para fazer isso.
CREATE TABLE #trad ( Trad varchar(50))
IF @trad is not null
INSERT INTO #Trad
SELECT DISTINCT * FROM dbo.Split(@trad,',') -- split will have traders seperated by commas
ELSE INSERT INTO #Traders
Select distinct Trader from TraderMap tm
where traderorgroup = 'trader'
CREATE TABLE #result
(port VARCHAR(50),portdate DATE,P MONEY,V_95 MONEY,
V_99 MONEY,VLimit MONEY,V_90 MONEY,H_99 MONEY,
H_975 MONEY,H_95 MONEY,H_90 MONEY,H_80 MONEY,dCnt
INT,Trad varchar(100))
DECLARE @traderlist AS Varchar(100)
DECLARE traderlist CURSOR FOR
SELECT DISTINCT Traders FROM #traders
OPEN traderlist
FETCH next FROM traderlist INTO @traderlist
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #result (port, portdate, P, V_95, V_99, VLimit,
dCnt,Trad)
SELECT TOP 253 pl.Port,pl.Portdate,pl.dtd_P
PL,var.V_95,var.V_99, sum(gu.Guid * -1) VLimit,
Row_number() OVER(partition by pl.TradName ORDER BY Portdate DESC)
dCnt,pl.TradName
FROM Trad_PL pl INNER JOIN rep_tab var
ON pl.Portdate = var.V_Date
AND pl.Port = var.Port
AND pl.TradName = var.Trad
INNER JOIN Trad_Guid gui
ON pl.Port = gui.Port
AND pl.TradName = gui.Trad
WHERE pl.Portdate <= @portdate
AND pl.Port = CASE WHEN @port = 'Her' THEN 'Herport' ELSE
@port END
AND pl.ONA = 'Act'
AND pl.TradName = @tradlist
AND var.PType = '0Trad'
group by
pl.TradName,pl.Port,pl.Portdate,pl.dtd_P,var.V_95,var.V_99
ORDER BY Portdate DESC
FETCH next FROM tradlist INTO @tradlist
END
CLOSE tradlist
DEALLOCATE tradlist
Este código é executado por horas. Existe alguma maneira eficiente de obter as 253 principais linhas para cada negociação de Trad_PL e rep_tab.
Em geral, se você tiver um cursor, esse é o primeiro lugar para procurar problemas de desempenho. Provavelmente funciona muito bem se você tiver 10 traders, não tão bem se tiver 10.000.
Tente isso.
Eu removi a cláusula where que atingiu @tradlist e apenas juntei à sua tabela temporária (que já foi criada a partir de uma lista distinta de traders, então não se preocupe). Eu também eliminei o TOP 253. Você já está criando um número de linha com seu campo dCnt, então acabei de adicionar uma entrada à cláusula WHERE onde dCnt <= 253.
Se você ainda estiver tendo problemas de desempenho, certifique-se de ter índices relacionados a cada uma de suas junções e dê uma olhada no plano de consulta. O ajuste de desempenho em geral é um grande assunto, mas você pode fazer pior do que comprar uma cópia do livro Plano de Execução de Grant Fritchey. Existe até uma cópia gratuita do e-book.
https://www.red-gate.com/simple-talk/books/sql-server-execution-plans-third-edition-by-grant-fritchey/
Por último, mas não menos importante, completamente longe da sua pergunta real, a formatação é sua amiga ao postar pedaços de código. É muito mais provável que você obtenha respostas positivas (e respostas) se seu código for mais fácil de ler. Se você olhar, o pedaço de código que estou postando está formatado para facilitar a leitura. Você certamente não precisa usar esse layout específico, a formatação pode ser uma coisa muito pessoal, mas algo diferente de todo o código no lado esquerdo da tela geralmente é útil.