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 / 279210
Accepted
Newbie-DBA
Newbie-DBA
Asked: 2020-11-05 14:41:11 +0800 CST2020-11-05 14:41:11 +0800 CST 2020-11-05 14:41:11 +0800 CST

Como posso ajustar abaixo do proc alterando a consulta ou adicionando o índice

  • 772

Estou tendo problemas com um dos proc rodando muito lento por aproximadamente uma hora:

Por favor, perdoe, pois tenho que escrever o código inteiro fora do sistema para colar aqui. Estarei editando a pergunta com mais detalhes sobre o esquema e os índices da tabela à medida que copio essas informações:

SP é algo como abaixo

CREATE PROCEDURE [dbo].[testsp1]
@parameter1 VARCHAR(MAX),
@parameter2 DATETIME

AS

DECLARE @Today DATETIME =GETDATE()
IF @parameter2 IS NULL
 SET @parameter2 = Getdate()

SET @parameter2 = CONVERT(VARCHAR, @parameter2 , 101)

DECLARE @table1 TABLE ( tabletypeID BIGINT)

Insert into @table1
SELECT Value from stringsplit(@parameter1, '|')

UPDATE bigtable
    SET value1 = 33, statusdate = @today
from 
    bigtable t
    INNER JOIN anotherbigtable t1 on t.id=t1.id
    INNER JOIN @table1 t3 on t.tabletypeid = t3.tabletypeid
WHERE
    t1.paydate <= @parameter2
    AND t.value1=32
    AND t1.payid =2

bigtable tem aproximadamente 800 M de linhas e foi agrupado como PK no id e NC no userid (1ª chave), tabletypeid (2ª chave)

anotherbigtable é aprox. 300 M linhas

@parameter2é na maioria das vezes recebido como NULL enquanto @parameter1 varia

plano em cache é algo como abaixo

insira a descrição da imagem aqui

sql-server query-performance
  • 2 2 respostas
  • 58 Views

2 respostas

  • Voted
  1. Best Answer
    J.D.
    2020-11-05T15:52:05+08:002020-11-05T15:52:05+08:00

    A primeira coisa que eu faria é evitar o uso de variáveis ​​de tabela em operações SQL pesadas. Você deve usar uma tabela temporária em vez disso. Inicialmente ou selecione sua variável de tabela @table1 em uma tabela temporária e use essa tabela temporária em sua instrução de atualização.

    As variáveis ​​de tabela são historicamente conhecidas por serem gargalos porque as estatísticas não são mantidas nelas e, mesmo com as melhorias da Microsoft no SQL 2014, elas ainda podem ter um desempenho ruim. Aqui está um bom artigo de Brent Ozar sobre eles: https://www.brentozar.com/archive/2014/04/table-variables-good-temp-tables-sql-2014/

    Você também pode se beneficiar do uso da dica de busca forçada em "outra tabela de bg". Mas comece com a mudança acima primeiro.

    Para referência: http://nisalbi.blogspot.com/2015/11/what-is-forceseek-and-forcescan-table.html?m=1

    E MS Docs em dicas de tabela: https://learn.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver15

    Normalmente, as dicas de consulta devem ser usadas apenas em casos muito situacionais por pessoas com experiência, mas descobri que, com tabelas maiores, às vezes o SQL Engine tenta fazer uma verificação de índice quando uma busca de índice realmente é uma escolha melhor. (A atualização das estatísticas da tabela em "anotherbg table" também pode corrigir seu problema com mais naturalidade.)

    Portanto, é situacional e você precisará testar, mas é possível que uma dica de índice de busca forçada ajude.

    Esta é a aparência da sua consulta de atualização com a dica de índice:

    UPDATE bigtable
        SET value1 = 33, statusdate = @today
    from 
        bigtable t
        INNER JOIN anotherbigtable t1 WITH (FORCESEEK) on t.id=t1.id
        INNER JOIN @table1 t3 on t.tabletypeid = t3.tabletypeid
    WHERE
        t1.paydate <= @parameter2
        AND t.value1=32
        AND t1.payid =2
    
    • 1
  2. Yunus UYANIK
    2020-11-06T00:23:51+08:002020-11-06T00:23:51+08:00

    Eu concordo com @JD disse sobre variáveis ​​de tabela temporária. Porque até a versão 2019 do SQL Server, o Query Engine pensa que a estimativa das variáveis ​​da tabela temporária retorna apenas uma linha.

    Caso contrário, acho que você deve deixar também Clustered Index Scanem anotherbigtable. Porque custou 98%

    Não conhecia seus índices, mas recomendo o índice abaixo.

    CREATE INDEX paydate_payid_inc ON anotherbigtable (paydate,payid) INCLUDE (id);
    

    Além disso, não é grande necessário, mas eu não gosto.

    SET @parameter2 = Getdate()
        
    SET @parameter2 = CONVERT(VARCHAR, @parameter2 , 101)
    

    Por favor, tente isso.

    SET @parameter2 = CONVERT(VARCHAR, GETDATE(), 101)
    

    BTW, você pode compartilhar seu plano de execução com pasttheplan , para que possamos ver muitas informações de sua consulta (estimativas, custo etc.) e podemos escrever uma resposta mais poderosa.

    • 0

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