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 / 306740
Accepted
ahmed elbarbary
ahmed elbarbary
Asked: 2022-01-29 13:03:03 +0800 CST2022-01-29 13:03:03 +0800 CST 2022-01-29 13:03:03 +0800 CST

A busca de índice NONCLUSTERED no mslid é lenta

  • 772

Eu tenho um problema no SQL Server em que uma busca de índice NONCLUSTERED está tendo um desempenho insatisfatório.

Abaixo está o plano de execução real https://www.brentozar.com/pastetheplan/?id=Sk3-4JGAK

Como posso melhorar o desempenho?

Abaixo está a definição da tabela

 CREATE TABLE [Parts].[ManufacturingData](
     [LeadFinishId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
     [PartID] [int] NOT NULL,
     [LeadFinishMaterial] [varchar](50) NULL,
     [CreatedDate] [datetime] NULL,
     [CreatedBy] [int] NULL,
     [ModifiedDate] [datetime] NULL,
     [Modifiedby] [int] NULL,
     [DeletedDate] [datetime] NULL,
     [DeletedBy] [int] NULL,
     [Revision_Id] [int] NULL,
     [BaseMaterialID] [int] NULL,
     [MSLID] [int] NULL,
     [MSLSource_Revision_id] [int] NULL,
     [MaximumReflowTemperatureID] [int] NULL,
     [ReflowTemperatureSource_Revision_Id] [int] NULL,
     [MaximumWaveTemperatureID] [int] NULL,
     [WaveTemperatureSource_Revision_ID] [int] NULL,
     [ReflowSolderTimeID] [int] NULL,
     [WaveSolderTimeID] [int] NULL,
     [NumberOfReflowCycleID] [int] NULL,
     [LeadFinishPlatingID] [int] NULL,
     [Comment] [varchar](100) NULL,
     [LeadfinishSourceTypeID] [int] NULL,
     [MSlSourceTypeID] [int] NULL,
     [ReflowTemperatureSourceTypeID] [int] NULL,
     [BasedOnID] [int] NULL,
     [LeadFreeProcessCapabilityID] [int] NULL,
     [BaseMaterialRevisionID] [int] NULL,
     [BaseMaterialSourceTypeID] [int] NULL,
     [UnderplatingRevisionID] [int] NULL,
     [UnderplatingSourceTypeID] [int] NULL,
     [ShelfLifeCondition] [int] NULL,
  CONSTRAINT [PK_PartID] PRIMARY KEY CLUSTERED 
 (
     [PartID] ASC
 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Customer]
 ) ON [Customer]
    
 GO
    
 SET ANSI_PADDING ON
 GO

index seek used as below

 CREATE NONCLUSTERED INDEX [IDX_MSLID] ON [Parts].[ManufacturingData]
 (
     [MSLID] ASC
 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Customer]
 GO

USE [Z2DataCore]
GO


 ALTER TABLE [Parts].[ManufacturingData] ADD  CONSTRAINT [PK_PartID] PRIMARY KEY CLUSTERED 
 (
     [PartID] ASC
 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Customer]
 GO
sql-server sql-server-2016
  • 4 4 respostas
  • 513 Views

4 respostas

  • Voted
  1. J.D.
    2022-01-29T16:26:35+08:002022-01-29T16:26:35+08:00

    Eu estaria interessado no número de linhas totais que você tem em sua Parts.ManufacturingDatatabela e qual é o tempo de execução total atualmente para sua consulta. O número de linhas que o plano de execução diz que está retornando (aproximadamente 32 milhões) realmente faz sentido para sua consulta?

    Talvez você descubra que um índice filtrado economiza um pouco de tempo, pois pré-materializa apenas os dados que você deseja. Que tal um índice com essa definição, faz alguma diferença?

    CREATE NONCLUSTERED INDEX IX_ManufacfuringData_MSLID_Filtered ON Parts.ManufacturingData (MSLID) WHERE MSLID IS NOT NULL;
    

    Observe que você não precisa fazer nada diferente em sua consulta para usar o índice filtrado acima depois de criado. Mas você deve verificar o plano de execução para garantir que o otimizador escolheu esse novo índice em relação a quaisquer outros índices em sua tabela quando a consulta for executada.

    Se isso não fizer diferença, a outra coisa que você pode tentar é adicionar a FORCESCANdica à sua consulta assim:

    select  partid,mslid 
    into ExtractReports.dbo.manufactureparts
    from parts.manufacturingdata m with(nolock, FORCESCAN)
    where mslid is  not null
    

    Isso diria ao otimizador para usar uma operação de varredura em vez de buscar seus dados. Isso geralmente teria melhor desempenho se aproximadamente a maioria dos seus dados na tabela atendesse aos critérios de sua WHEREcláusula. Ou seja, geralmente é mais rápido varrer toda a tabela nesse ponto e filtrar as linhas indesejadas, do que procurar em tantas linhas. Mas é difícil dizer se isso ajudará suas circunstâncias sem conhecer seus dados ou testá-los.

    Observe que as dicas de consulta devem ser usadas com cautela e somente em circunstâncias em que métodos alternativos de otimização não são possíveis. Algumas dicas de consulta limitam o número de planos de execução disponíveis que o otimizador pode escolher e, portanto, podem resultar em um erro quando determinadas consultas que usam essas dicas tentam ser executadas.

    Nesse caso, acho que usar a FORCESCANdica provavelmente está ok, pois sua consulta é simples e não acredito que ela limite o número de planos de consulta tanto quanto outras dicas.

    • 4
  2. MBuschi
    2022-01-30T08:19:31+08:002022-01-30T08:19:31+08:00

    Talvez você possa tentar com um índice columnstore não clusterizado nos mesmos campos. Isso pode levar a um modo de lote e compactação para que você possa poupar algo na leitura.

    documento da microsoft

    exemplo:

    CREATE NONCLUSTERED COLUMNSTORE INDEX 
    [NCCIX_Parts_ManufacturingData_MSLID] ON [Parts].[ManufacturingData]
     (
         [MSLID] ASC
     )
    GO
    
    • 2
  3. Brendan McCaffrey
    2022-01-29T14:00:31+08:002022-01-29T14:00:31+08:00

    Sua busca de índice está retornando 32 milhões de linhas. Você tem um bom plano, isso é apenas um monte de dados para ler.

    Você pode considerar criar explicitamente a tabela de destino antes de tentar inseri-la.

    • 1
  4. Best Answer
    Learning_DBAdmin
    2022-01-31T02:49:34+08:002022-01-31T02:49:34+08:00

    Além de outras respostas certas, você também pode tentar um método alternativo para melhorar o desempenho, que pode ser criar uma exibição indexada como abaixo:

    CREATE VIEW parts.manufacturingdata_Indexed
    WITH SCHEMABINDING AS
    select partid,mslid from parts.manufacturingdata m with(nolock)
    where mslid is  not null
    

    Depois de criar a visualização acima, crie o índice conforme abaixo:

    CREATE UNIQUE CLUSTERED INDEX IX_manufacturingdata
        ON parts.manufacturingdata_Indexed
         (partid,mslid);
    

    Após a criação da visualização e do índice acima, você pode reescrever sua consulta como:

    insert into ExtractReports.dbo.manufactureparts
    (select * from parts.manufacturingdata_Indexed)
    

    Estou alterando a consulta para insert intoem vez de select * intoreutilização de código. No caso de select into, você sempre precisa descartar a tabela subjacente.

    Por favor, deixe-nos saber se isso ajuda.

    • 1

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