AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 246972
Accepted
V_immo
V_immo
Asked: 2019-09-05 07:13:13 +0800 CST2019-09-05 07:13:13 +0800 CST 2019-09-05 07:13:13 +0800 CST

Insira os 253 principais valores onde o valor é selecionado em nomes comerciais distintos

  • 772

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.

sql-server cursors
  • 1 1 respostas
  • 49 Views

1 respostas

  • Voted
  1. Best Answer
    Kenneth Fisher
    2019-09-05T08:15:06+08:002019-09-05T08:15:06+08:00

    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.

    INSERT INTO #result (port, portdate, P, V_95, V_99, VLimit, dCnt,Trad)      
    SELECT 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 #Traders
        ON #Traders.Traders = pl.TradName
    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 var.PType = '0Trad' 
        AND dCnt <= 253
    group by  
        pl.TradName,pl.Port,pl.Portdate,pl.dtd_P,var.V_95,var.V_99
    ORDER BY Portdate DESC
    

    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.

    • 4

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve