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 / 340914
Accepted
Anand Sowmithiran
Anand Sowmithiran
Asked: 2024-07-12 22:42:52 +0800 CST2024-07-12 22:42:52 +0800 CST 2024-07-12 22:42:52 +0800 CST

Criação automática de índices – muitos

  • 772

Quando temos o ajuste automático definido como ON para criação de índice, o banco de dados de hiperescala SQL do Azure criou cerca de 10 índices para algumas de nossas tabelas grandes. Ao analisar os índices, alguns deles diferem apenas nas colunas 'incluídas', enquanto as colunas do índice eram iguais. Essa proliferação de índice prejudicará as operações INSERT e UPDATE nessas tabelas.

Existe uma opção no Azure para combinar/otimizar índices, em vez de eliminarmos e recriarmos manualmente índices melhores para muitas tabelas? A partir de agora, desligar a criação automática de índice parece ser a única coisa a fazer.

Existem outras sugestões?

performance
  • 2 2 respostas
  • 79 Views

2 respostas

  • Voted
  1. Best Answer
    Aleksey Vitsko
    2024-07-13T02:21:04+08:002024-07-13T02:21:04+08:00

    Ao analisar os índices, alguns deles diferem apenas nas colunas 'incluídas', enquanto as colunas do índice eram iguais

    Esse recurso de indexação automática pode ser bom em uma situação em que você não tem nenhum DBA (desenvolvedor, administrador de sistema, etc.), que pode manter os índices manualmente, verificando DMVs de índice ausentes e descobrindo como combinar combinações de índice sugeridas em índices que beneficiariam a maioria das consultas.

    Existe uma opção no Azure para combinar/otimizar índices, em vez de eliminarmos e recriarmos manualmente índices melhores para muitas tabelas?

    Infelizmente, o recurso não é inteligente o suficiente para fazer a parte “humana” do trabalho neste momento. Ele criará índices, como você mencionou, em que "alguns deles diferem apenas nas colunas 'incluídas', enquanto as colunas do índice eram iguais".

    Se você achar que muitos índices criados realmente prejudicam as operações INSERT e UPDATE ou usam muito espaço de armazenamento, desative o recurso e mantenha (crie, modifique, monitore o uso, elimine) os índices manualmente.

    • 3
  2. Francesco Mantovani
    2024-07-14T02:00:42+08:002024-07-14T02:00:42+08:00

    Use esta consulta para encontrar o índice usando o maior número de leituras:

    --- Index Read/Write stats (all tables in current DB) ordered by Reads  (Query 45) (Overall Index Usage - Reads)
    SELECT SCHEMA_NAME(t.[schema_id]) AS [SchemaName]
        ,OBJECT_NAME(i.[object_id]) AS [ObjectName]
        ,i.[name] AS [IndexName]
        ,i.index_id
        ,s.user_seeks
        ,s.user_scans
        ,s.user_lookups
        ,s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads]
        ,s.user_updates AS [Writes]
        ,i.[type_desc] AS [Index Type]
        ,i.fill_factor AS [Fill Factor]
        ,i.has_filter
        ,i.filter_definition
        ,s.last_user_scan
        ,s.last_user_lookup
        ,s.last_user_seek
        ,'Show which indexes in the current database are most active for Reads' AS Info
    FROM sys.indexes AS i WITH (NOLOCK)
    LEFT OUTER JOIN sys.dm_db_index_usage_stats AS s WITH (NOLOCK) ON i.[object_id] = s.[object_id]
        AND i.index_id = s.index_id
        AND s.database_id = DB_ID()
    LEFT OUTER JOIN sys.tables AS t WITH (NOLOCK) ON t.[object_id] = i.[object_id]
    WHERE OBJECTPROPERTY(i.[object_id], 'IsUserTable') = 1
    ORDER BY s.user_seeks + s.user_scans + s.user_lookups DESC
    OPTION (RECOMPILE);-- Order by reads
        ------
        -- Show which indexes in the current database are most active for Reads
    

    E então isso para encontrar o índice que usa mais gravações:

    --- Index Read/Write stats (all tables in current DB) ordered by Writes  (Query 46) (Overall Index Usage - Writes)
    SELECT SCHEMA_NAME(t.[schema_id]) AS [SchemaName]
        ,OBJECT_NAME(i.[object_id]) AS [ObjectName]
        ,i.[name] AS [IndexName]
        ,i.index_id
        ,s.user_updates AS [Writes]
        ,s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads]
        ,i.[type_desc] AS [Index Type]
        ,i.fill_factor AS [Fill Factor]
        ,i.has_filter
        ,i.filter_definition
        ,s.last_system_update
        ,s.last_user_update
        ,'Show which indexes in the current database are most active for Writes' AS Info
    FROM sys.indexes AS i WITH (NOLOCK)
    LEFT OUTER JOIN sys.dm_db_index_usage_stats AS s WITH (NOLOCK) ON i.[object_id] = s.[object_id]
        AND i.index_id = s.index_id
        AND s.database_id = DB_ID()
    LEFT OUTER JOIN sys.tables AS t WITH (NOLOCK) ON t.[object_id] = i.[object_id]
    WHERE OBJECTPROPERTY(i.[object_id], 'IsUserTable') = 1
    ORDER BY s.user_updates DESC
    OPTION (RECOMPILE);-- Order by writes
        ------
        -- Show which indexes in the current database are most active for Writes
    

    Você acha que estão faltando índices? Use esta consulta para encontrar índices ausentes:

    -- http://www.dharmendrakeshari.com/find-missing-indexes-sql-server-databases/
    
    SELECT 
        migs.user_seeks as [Estimated Index Uses],
        migs.avg_user_impact [Estimated Index Impact %],
        migs.avg_total_user_cost[Estimated Avg Query Cost],     
        db_name(mid.database_id) AS DatabaseID,
        OBJECT_SCHEMA_NAME (mid.OBJECT_ID,mid.database_id) AS [SchemaName],
        OBJECT_NAME(mid.OBJECT_ID,mid.database_id) AS [TableName],
        'CREATE INDEX [IX_' + OBJECT_NAME(mid.OBJECT_ID,mid.database_id) + '_'
        + REPLACE(REPLACE(REPLACE(ISNULL(mid.equality_columns,''),', ','_'),'[',''),']','') 
        + CASE
                WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL 
                THEN '_'
                ELSE ''
          END
        + REPLACE(REPLACE(REPLACE(ISNULL(mid.inequality_columns,''),', ','_'),'[',''),']','')
        + ']'
        + ' ON ' + mid.statement
        + ' (' + ISNULL (mid.equality_columns,'')
        + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns 
        IS NOT NULL THEN ',' ELSE
        '' END
        + ISNULL (mid.inequality_columns, '')
        + ')'
        + ISNULL (' INCLUDE (' + mid.included_columns + ') WITH (MAXDOP =?, FILLFACTOR=?, ONLINE=?, SORT_IN_TEMPDB=?);', '') AS [Create TSQL],
        mid.equality_columns, 
        mid.inequality_columns, 
        mid.included_columns,
        migs.unique_compiles,
        migs.last_user_seek 
    FROM sys.dm_db_missing_index_group_stats AS migs WITH (NOLOCK)
    INNER JOIN sys.dm_db_missing_index_groups AS mig WITH (NOLOCK) ON migs.group_handle = mig.index_group_handle
    INNER JOIN sys.dm_db_missing_index_details AS mid WITH (NOLOCK) ON mig.index_handle = mid.index_handle
    ORDER BY [Estimated Index Uses] DESC OPTION (RECOMPILE);
    

    Não coloque índices aleatórios no seu banco de dados. Eles disseram que a IA pode fazer isso automaticamente por você. Mas esse recurso do Azure, que deveria encontrar os índices ausentes corretos, existe desde sempre. Há muito tempo, esse fenômeno da IA ​​começou. Tenha certeza de que isso nunca irá ajudá-lo.

    • 0

relate perguntas

  • Existe um ganho de desempenho ao manipular dados com procedimentos armazenados em vez de alimentá-los em funções após a recuperação?

  • Como você ajusta o MySQL para uma carga de trabalho pesada do InnoDB?

  • 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