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 / 280639
Accepted
Learning_DBAdmin
Learning_DBAdmin
Asked: 2020-12-02 00:04:09 +0800 CST2020-12-02 00:04:09 +0800 CST 2020-12-02 00:04:09 +0800 CST

Precisa de conselhos sobre Indexafobia: Índice de falta de alto valor com alto impacto. Quando o índice já existe

  • 772

Estou tentando entender o verdadeiro significado de Missing index para esta tabela específica quando já tenho índice nela e como resolvê-lo.

Tenho uma tabela muito usada e tem aproximadamente 2,5GB. Como é muito usado, um pouco hesitante em criar índices que não são muito necessários (discutível). Esta tabela foi heap anteriormente, recentemente ela é alterada para tabela após alterar a chave primária para clusterizada de não clusterizada.

Quando executo sp_blitzindex com o nome do banco de dados ou com esta tabela, dá resultado como abaixo:

Resultado do Blitzindex

Principalmente sugere criar índice na coluna APT_ID e incluir sugere LOGID, RECEIVE_TIME e algumas outras colunas. Se olharmos para a definição da tabela, a chave primária é definida em LOGID e RECEIVE_TIME. E também temos um índice NC na coluna APT_ID.

A tabela DDL é a seguinte:

CREATE TABLE [dbo].[TXN_LOG](
    [LOGID] [int] IDENTITY(1,1) NOT NULL,
    [RECEIVE_TIME] [varchar](15) NOT NULL,
    [APT_ID] [int] NOT NULL,
    [VAR32_01] [varchar](32) NULL,
    [VAR32_02] [varchar](32) NULL,
    .
    .
    .
    [ERROR_CODE] [varchar](20) NULL,
    [MESSAGE_ID] [varchar](40) NULL,
    [END_POINT_ID] [varchar](50) NULL,
    [NODE_ID] [varchar](40) NULL,
    [TIMEOUT_NETWORK_ID] [int] NULL,
    [TXN_SUMMARY] [numeric](1, 0) NULL,
    [D_FLAG] [numeric](1, 0) NULL,
     CONSTRAINT [PKTXN_LOG] PRIMARY KEY CLUSTERED 
    (
        [LOGID] ASC,
        [RECEIVE_TIME] ASC
    ))
GO

O índice NC nesta tabela é:

CREATE NONCLUSTERED INDEX [IDX_TXN_LOG_1] ON [dbo].[TXN_LOG]
(
    [APT_ID] ASC
)
INCLUDE([RECEIVE_TIME]) 
GO

O uso atual do índice não parece oferecer suporte ao índice NC, pois a gravação é maior que a contagem de leitura.

Uso do Índice

Sinceras desculpas por anexar imagens na pergunta. Agradeço se eu puder obter alguns conselhos de especialistas sobre isso. Desde já, obrigado.

Versão: Microsoft SQL Server 2014 (SP3-GDR) (KB4532095) - 12.0.6118.4 (X64) 12 de dezembro de 2019 21:46:15 Copyright (c) Microsoft Corporation Enterprise Edition: licenciamento baseado em núcleo (64 bits) no Windows NT 6.3 (Build 9600: ) (Hipervisor)

sql-server index
  • 2 2 respostas
  • 362 Views

2 respostas

  • Voted
  1. Best Answer
    Brent Ozar
    2020-12-02T02:45:16+08:002020-12-02T02:45:16+08:00

    Para limpar e simplificar um pouco sua pergunta:

    • O índice que você já tem está em [LOGID], [RECEIVE_TIME]
    • O SQL Server está solicitando um índice em APT_ID e deseja que você inclua LOGID, RECEIVE_TIME

    Esse é realmente um índice diferente do que você já tem.

    Vamos pegar o velho exemplo da lista telefônica. As páginas brancas da lista telefônica estavam em LAST_NAME, FIRST_NAME, MIDDLE_NAME. Isso é ótimo se você executar uma consulta como esta:

    SELECT *
    FROM PHONE_BOOK
    WHERE LAST_NAME = 'OZAR'
    

    Mas se você não souber o sobrenome de alguém e perguntar por isso:

    SELECT *
    FROM PHONE_BOOK
    WHERE FIRST_NAME = 'BRENT'
    

    Então você vai escanear a lista telefônica inteira procurando por mim. A primeira coluna do índice é incrivelmente importante. É por isso que o SQL Server está pedindo um índice em APT_ID, além de outras colunas incluídas.

    Então você pode perguntar: "Por que um índice existente em APT_ID sozinho não é suficiente?" O problema é que, no seu caso, o APT_ID não é seletivo o suficiente ou as pessoas estão solicitando intervalos de APT_IDs. O SQL Server está tendo que fazer várias pesquisas de chave e as recomendações de índice ausentes estão tentando removê-las.

    • 2
  2. Tibor Karaszi
    2020-12-02T00:29:39+08:002020-12-02T00:29:39+08:00

    Impossível dizer qualquer coisa, já que o índice ausente é estúpido.

    Por um lado, não leva em conta a seletividade. Ter um índice que não cobre a consulta é bom se você retornar apenas algumas linhas. Mas o MI não se preocupa com a seletividade, então quer cobrir todas as consultas. E pode sugerir um índice em (a) incluindo (b,c), e outro índice em (a) incluindo (b,c,d). Ou seja, sem esperteza (que vem do fato de não querer gastar muito tempo na hora de gerar essas recomendações).

    Você cria índices para dar suporte às suas consultas.

    Ative o armazenamento de consultas e trabalhe a partir daí.

    Ou crie índices e depois de um tempo veja se eles foram usados.

    Ou, se você conhece a carga da consulta, trabalhe com as consultas.

    Talvez eu tenha perdido algum ponto-chave no seu post, então por favor me avise. :-)

    • 1

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

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

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

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