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 / 152901
Accepted
Marcello Miorelli
Marcello Miorelli
Asked: 2016-10-21 08:59:07 +0800 CST2016-10-21 08:59:07 +0800 CST 2016-10-21 08:59:07 +0800 CST

Operador usou tempdb para derramar dados durante a execução com nível de derramamento 2

  • 772

Estou lutando para minimizar o custo da operação de classificação em um plano de consulta com o aviso Operator usedtempdbto spill data during execution with spill level 2

Encontrei várias postagens relacionadas a dados de derramamento durante a execução com nível de derramamento 1 , mas não nível 2. O nível 1 parece ser causado por estatísticas desatualizadas , e o nível 2? Não encontrei nada relacionado a level 2.

Achei este artigo muito interessante relacionado a avisos de classificação:

Nunca ignore um aviso de classificação no SQL Server

Meu servidor SQL?

Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) 17 de junho de 2016 19:14:09 Copyright (c) Microsoft Corporation Enterprise Edition (64 bits) no Windows NT 6.3 (Build 9600: ) (Hypervisor)

Meu hardware?

executando a consulta abaixo para encontrar o harware:

-- Informações de hardware do SQL Server 2012

SELECT cpu_count AS [Logical CPU Count], hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count], 
physical_memory_kb/1024 AS [Physical Memory (MB)], affinity_type_desc, 
virtual_machine_type_desc, sqlserver_start_time
FROM sys.dm_os_sys_info WITH (NOLOCK) OPTION (RECOMPILE);

insira a descrição da imagem aqui

memória atualmente alocada

SELECT
(physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024) AS Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
FROM sys.dm_os_process_memory;

insira a descrição da imagem aqui

quando executo minha consulta com escopo de um ano não recebo nenhum tipo de aviso, conforme a figura abaixo:

insira a descrição da imagem aqui

Mas quando o executo apenas para escopo de 1 dia, recebo este aviso on the sort operator:

insira a descrição da imagem aqui

esta é a consulta:

    DECLARE @FromDate SMALLDATETIME = '19-OCT-2016 11:00'
    DECLARE @ToDate   SMALLDATETIME = '20-OCT-2016 12:00'




    SELECT      DISTINCT
                a.strAccountCode ,
                a.strAddressLine6 ,
                a.strPostalCode ,
                CASE    WHEN a.strCountryCode IN ('91','92') THEN 'GB-Int'
                        ELSE a.strCountryCode
                        END AS [strCountryCode]
    FROM        Bocss2.dbo.tblBAccountParticipant AS ap
    INNER JOIN  Bocss2.dbo.tblBAccountParticipantAddress AS apa ON ap.lngParticipantID = apa.lngParticipantID
                                                                AND apa.sintAddressTypeID = 2
    INNER JOIN  Bocss2.dbo.tblBAccountHolder AS ah ON ap.lngParticipantID = ah.lngParticipantID
    INNER JOIN  Bocss2.dbo.tblBAddress AS a ON apa.lngAddressID = a.lngAddressID
                                            AND a.blnIsCurrent = 1
    INNER JOIN  Bocss2.dbo.tblBOrder AS o ON ap.lngParticipantID = o.lngAccountParticipantID
                                        AND o.sdtmOrdCreated >= @FromDate
                                        AND o.sdtmOrdCreated < @ToDate

OPTION(RECOMPILE)

o plano de consulta está aqui

o plano de consulta usando pastetheplan

Dúvidas: 1) no plano de consulta vejo isso:

StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="70" 

por que 70? Estou usando o sql server 2014

2) como faço para me livrar desse operador de classificação (se possível)?

3) Eu vi a expectativa de vida da página muito baixa, além de adicionar mais memória a este servidor, há alguma outra coisa que eu possa dar uma olhada para ver se posso evitar esse aviso?

Felicidades

Atualização após a resposta de Shanky e Paul White

Eu verifiquei minhas estatísticas de acordo com o script abaixo e elas parecem estar corretas e atualizadas.

estes são todos os índices e tabelas usados ​​nesta consulta.

DBCC SHOW_STATISTICS ('dbo.tblBAddress','IDXF_tblBAddress_lngAddressID__INC')
GO
DBCC SHOW_STATISTICS  ('dbo.tblBOrder','IX_tblBOrder_sdtmOrdCreated_INCL')
GO
DBCC SHOW_STATISTICS ('dbo.tblBAccountHolder','PK_tblAccountHolder')
GO
DBCC SHOW_STATISTICS ('dbo.tblBAccountParticipant','PK_tblBAccountParticipants')
GO
DBCC SHOW_STATISTICS ('dbo.tblBAccountParticipantAddress','IDXF_tblBAccountParticipantAddress_lngParticipantID')
GO

isso é o que eu tenho retornado:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Este é um resultado parcial, mas eu revisei todos eles.

Para atualização de estatísticas, atualmente tenho Ola Hallengren

o Index Optimize Job - programado para ser executado uma vez por semana - aos domingos

EXECUTE [dbo].[IndexOptimize] 
@Databases = 'USER_DATABASES,-%Archive', 
@Indexes = 'ALL_INDEXES' , 
@FragmentationLow = NULL,
@FragmentationMedium = NULL,
@FragmentationHigh = NULL,
@PageCountLevel=1000,
@StatisticsSample =100
,@UpdateStatistics = 'Index', 
@OnlyModifiedStatistics = 'Y',
@TimeLimit=10800, 
@LogToTable = 'Y'

Embora as estatísticas pareçam estar atualizadas Depois de executar o script a seguir, não recebi mais nenhum aviso no operador de classificação.

UPDATE STATISTICS [Bocss2].[dbo].[tblBOrder]  WITH FULLSCAN
--1 hour  04 min 14 sec

UPDATE STATISTICS [Bocss2].[dbo].tblBAddress  WITH FULLSCAN
-- 45 min 29 sec

UPDATE STATISTICS  [Bocss2].[dbo].tblBAccountHolder WITH FULLSCAN
-- 26 SEC

UPDATE STATISTICS  [Bocss2].[dbo].tblBAccountParticipant WITH FULLSCAN
-- 4 min

UPDATE STATISTICS  [Bocss2].[dbo].tblBAccountParticipantAddress WITH FULLSCAN
-- 7 min 3 sec
sql-server performance
  • 1 1 respostas
  • 22929 Views

1 respostas

  • Voted
  1. Best Answer
    Shanky
    2016-10-21T09:37:18+08:002016-10-21T09:37:18+08:00

    e o nível 2? Não encontrei nada relacionado ao nível 2.

    De acordo com este antigo documento do MS , o número no derramamento de Tempdb significa quantas passagens são necessárias sobre os dados para classificá-los. Então Spill 1 significa que tem que passar 1 vez para classificar os dados e 2 significa que tem que passar 2 vezes.

    Citando do blog:

    Se uma consulta envolvendo uma operação de classificação gerar uma classe de evento Sort Warnings com um valor de nível de derramamento de 2, o desempenho da consulta poderá ser afetado porque várias passagens pelos dados são necessárias para classificar os dados. No exemplo abaixo, vemos um valor de nível de derramamento de 1, o que significa que uma passagem sobre os dados foi suficiente para concluir a classificação.

    por que 70? Estou usando o sql server 2014

    Isso ocorre porque o nível de compatibilidade do banco de dados na imagem NÃO é 120 (o que significa nível de compatibilidade do banco de dados 2014), pois não é 120. A consulta será processada usando o modelo antigo de estimativa de cardinalidade (CE), conhecido como CardinalityEstimationModelVersion="70". Tenho certeza de que você está ciente de que, a partir do SQL Server 2014, temos o novo CE.

    como faço para me livrar desse operador de classificação (se possível)?

    O comando distinto que você está usando está causando a operação de classificação. Os dados que estão sendo classificados não cabem na memória, portanto, são transferidos para o tempdb e, quando isso acontece, um aviso de classificação com um ponto de exclamação amarelo é fornecido no plano de execução. Os avisos de classificação nem sempre são um problema.

    Você pode ver no plano de execução que o número estimado de linhas a serem classificadas é 1, mas 16.353 são encontradas no tempo de execução. A quantidade de memória reservada para a classificação é baseada no tamanho esperado (estimado) da entrada e não pode crescer durante a execução (neste caso).

    A pequena concessão de memória para a consulta (1632 KB) também é compartilhada entre os operadores que consomem memória em execução simultânea (classificação e junções de loop 'otimizadas' ). Em seu plano, isso significa que 33,33% (544 KB) estão disponíveis para a classificação durante a leitura de linhas (fração de memória de entrada). Isso não é memória suficiente para classificar as 16.353 linhas, portanto, ela é transferida para tempdb . Um derramamento de nível único não é suficiente para concluir a triagem, portanto, é necessário um segundo nível de derramamento (consulte a referência no final para obter mais detalhes sobre os níveis de derramamento).

    Classificar propriedades

    Classifique as propriedades conforme visualizadas no SQL Sentry Plan Explorer

    A atualização das estatísticas provavelmente ajudará com o problema de estimativa de cardinalidade. Você pode estar enfrentando o problema da chave ascendente, principalmente na tabela tblBOrder. Uma simples seleção dessa tabela com as datas literais de sua pergunta provavelmente estimará uma linha agora.

    Eu vi a expectativa de vida da página muito baixa, além de adicionar mais memória a este servidor, há alguma outra coisa que eu possa dar uma olhada para ver se posso evitar esse aviso?

    PLE é uma indicação da quantidade de atividade de E/S, aumentou? Isso acontece com frequência ou apenas quando você executa determinada consulta ou isso ocorreu apenas hoje. Evite a reação instintiva, primeiro precisamos ter certeza de que você realmente está enfrentando pressão de memória ou alguma consulta desonesta que está gerando muita E/S está causando isso. De qualquer forma, você já possui 97 G de memória atribuída ao SQL Server.

    Para obter mais informações sobre os níveis de derramamento e o problema da chave ascendente, consulte:

    • O tipo que chega ao nível 15.000 por Paul White
    • Estatísticas sobre colunas ascendentes por Fabiano Amorim
    • 21

relate perguntas

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

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

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

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