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 / 337859
Accepted
Obscure_21
Obscure_21
Asked: 2024-03-20 04:41:28 +0800 CST2024-03-20 04:41:28 +0800 CST 2024-03-20 04:41:28 +0800 CST

O plano de consulta parece bom, mas a consulta é lenta

  • 772

Tenho uma tabela com representação hierárquica e para modelar a estrutura em árvore é utilizada a enumeração de caminhos. Apesar de o plano de consulta ser otimizado e a consulta em si ser direta, a execução da consulta leva 4 segundos. Porém, quando removo a classificação, a consulta é rápida, mas preciso dessa classificação.

Basicamente, a consulta deve retornar os principais pais relevantes cujos filhos satisfaçam determinados critérios.

Aqui está o link para a consulta e plano de consulta: https://www.brentozar.com/pastetheplan/?id=S1njIuPRT

SELECT TOP 50 Id
FROM   Site root
WHERE  Archive = 288
       AND TypeId IN( 1 )
       AND EXISTS (SELECT 1
                   FROM   Site ch
                   WHERE  ch.[path] LIKE concat(root.Path, '%')
                          AND ch.Commercial = 0
                          AND ch.Archive = 288)
ORDER  BY root.Score DESC 

insira a descrição da imagem aqui

sql-server
  • 1 1 respostas
  • 110 Views

1 respostas

  • Voted
  1. Best Answer
    Martin Smith
    2024-03-21T01:59:10+08:002024-03-21T01:59:10+08:00

    4 segundos de tempo de CPU para classificar 6.718 linhas certamente parecem excessivos, mas minha suposição é que esse tempo foi de fato gasto avaliando os valores no escalar de computação.

    Eu poderia produzir algo semelhante com Setup

    CREATE TABLE Site
    (
    Id INT IDENTITY PRIMARY KEY,
    Archive INT,
    TypeId INT, 
    path nvarchar(300) collate latin1_general_cs_as,
    Commercial bit,
    Score decimal(28,10),
    index [Test] (TypeId, Archive) INCLUDE (path, Score),
    index [NonClusteredIndex-20240318-221753] (path)
    )
    
    INSERT Site (Archive, TypeId, path, Commercial, Score)
    select top (6718) 
    Archive = 288, 
    TypeId = 1, 
    path = CAST(CRYPT_GEN_RANDOM(300) AS NCHAR(150)), 
    Commercial = 0, 
    Score = CRYPT_GEN_RANDOM(1) +0
    from sys.all_columns
    

    Consulta

    WITH root AS
    (
    SELECT Id, path
    FROM Site
    WHERE  Archive = 288
           AND TypeId IN( 1 )
    ORDER BY Score DESC
    OFFSET 0 ROWS
    )
    SELECT Id
    FROM   root
    WHERE  EXISTS (SELECT 1
                       FROM   Site ch WITH (FORCESEEK)
                       WHERE  ch.[path] LIKE concat(root.Path, '%')
                              AND ch.Commercial = 0
                              AND ch.Archive = 288)
    

    Plano de execução

    insira a descrição da imagem aqui

    Saída do gravador de desempenho do Windows

    insira a descrição da imagem aqui

    O gravador de desempenho do Windows mostra que a maior parte do tempo da CPU é consumida dentro do método Open do operador Sort quando ele está construindo a tabela de classificação e que isso é aproximadamente dividido igualmente pelos três métodos

    • sqltses.dll!I4LikeRangeInfoWStrImpl
    • sqltses.dll!WStrLikeRangeStartWStrImpl
    • sqltses.dll!WStrLikeRangeEndWStrImpl

    Eles são definidos no escalar de computação e usados ​​para a busca dinâmica .

    O valor inserido na Pathcoluna acima é um lixo bastante longo e gerado aleatoriamente. A parte gerada aleatoriamente parece mais importante, pois path = CAST(CRYPT_GEN_RANDOM(20) AS NCHAR(10))também é bastante lenta, mas, por outro lado, usar path = CAST(CRYPT_GEN_RANDOM(150) AS CHAR(150))para restringir os caracteres aos mais comuns é muito mais rápido.

    Portanto, minha conclusão é que é possível colocar coisas em uma nvarcharcoluna que podem retardar consideravelmente o cálculo do intervalo de índice correto a ser buscado e que é provavelmente isso que está causando a longa duração da classificação no seu caso.

    O que foi dito acima provavelmente criará algumas strings inválidas ucs-2- mas não tenho certeza se elas são as únicas responsáveis ​​pelo desempenho mais lento.

    • 3

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