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 / 29873
Accepted
Scott
Scott
Asked: 2012-12-06 07:58:39 +0800 CST2012-12-06 07:58:39 +0800 CST 2012-12-06 07:58:39 +0800 CST

Índice do SQL Server vs Estatística

  • 772

Quais são as diferenças entre CREATE INDEXe CREATE STATISTICSe quando devo usar cada um?

sql-server index
  • 1 1 respostas
  • 12422 Views

1 respostas

  • Voted
  1. Best Answer
    Thomas Stringer
    2012-12-06T08:04:45+08:002012-12-06T08:04:45+08:00

    Os índices armazenam dados reais (páginas de dados ou páginas de índice, dependendo do tipo de índice de que estamos falando) e as estatísticas armazenam a distribuição de dados. Portanto, CREATE INDEXserá a DDL para criar um índice (clustered, nonclustered, etc.) e CREATE STATISTICSé a DDL para criar as estatísticas sobre colunas dentro da tabela.

    Recomendo que você leia sobre esses aspectos dos dados relacionais. Abaixo estão alguns artigos introdutórios para iniciantes. Esses são tópicos muito amplos e, portanto, as informações sobre eles podem ser muito amplas e profundas. Leia a ideia geral deles abaixo e faça perguntas mais específicas quando surgirem.

    Referência BOL em Tabela e Organização de Índice
    Referência BOL em Estrutura de Índice Clusterizado Referência BOL em Estruturas de Índice
    Não Clusterizado
    SQL Server Central na Introdução aos Índices
    Referência BOL em Estatísticas

    Aqui está um exemplo funcional para ver essas duas partes em ação (comentado para explicar):

    use testdb;
    go
    
    create table MyTable1
    (
        id int identity(1, 1) not null,
        my_int_col int not null
    );
    go
    
    insert into MyTable1(my_int_col)
    values(1);
    go 100
    
    -- this statement will create a clustered index
    -- on MyTable1.  The index key is the id field
    -- but due to the nature of a clustered index
    -- it will contain all of the table data
    create clustered index MyTable1_CI
    on MyTable1(id);
    go
    
    
    -- by default, SQL Server will create a statistics
    -- on this index.  Here is proof.  We see a stat created
    -- with the name of the index, and the consisting stat 
    -- column of the index key column
    select
        s.name as stats_name,
        c.name as column_name
    from sys.stats s
    inner join sys.stats_columns sc
    on s.object_id = sc.object_id
    and s.stats_id = sc.stats_id
    inner join sys.columns c
    on sc.object_id = c.object_id
    and sc.column_id = c.column_id
    where s.object_id = object_id('MyTable1');
    
    
    -- here is a standalone statistics on a single column
    create statistics MyTable1_MyIntCol
    on MyTable1(my_int_col);
    go
    
    -- now look at the statistics that exist on the table.
    -- we have the additional statistics that's not necessarily
    -- corresponding to an index
    select
        s.name as stats_name,
        c.name as column_name
    from sys.stats s
    inner join sys.stats_columns sc
    on s.object_id = sc.object_id
    and s.stats_id = sc.stats_id
    inner join sys.columns c
    on sc.object_id = c.object_id
    and sc.column_id = c.column_id
    where s.object_id = object_id('MyTable1');
    
    
    -- what is a stat look like?  run DBCC SHOW_STATISTICS
    -- to get a better idea of what is stored
    dbcc show_statistics('MyTable1', 'MyTable1_CI');
    go
    

    Aqui está a aparência de uma amostra de teste de estatísticas:

    insira a descrição da imagem aqui

    Observe que as estatísticas são a contenção da distribuição de dados. Eles ajudam o SQL Server a determinar um plano ideal. Um bom exemplo disso é imaginar que você vai dar vida a um objeto pesado. Se você soubesse quanto pesa esse peso porque havia uma marcação de peso nele, determinaria a melhor maneira de levantar e com quais músculos. Isso é o que o SQL Server faz com as estatísticas.

    -- create a nonclustered index
    -- with the key column as my_int_col
    create index IX_MyTable1_MyIntCol
    on MyTable1(my_int_col);
    go
    
    -- let's look at this index
    select
        object_name(object_id) as object_name,
        name as index_name,
        index_id,
        type_desc,
        is_unique,
        fill_factor
    from sys.indexes
    where name = 'IX_MyTable1_MyIntCol';
    
    -- now let's see some physical aspects
    -- of this particular index
    -- (I retrieved index_id from the above query)
    select *
    from sys.dm_db_index_physical_stats
    (
        db_id('TestDB'),
        object_id('MyTable1'),
        4,
        null,
        'detailed'
    );
    

    Podemos ver no exemplo acima que o índice realmente contém dados (dependendo do tipo de índice, as páginas folha serão diferentes).

    Esta postagem mostrou apenas uma visão geral muito, muito breve desses dois grandes aspectos do SQL Server. Ambos poderiam ocupar capítulos e livros. Leia algumas das referências, e então você terá uma melhor compreensão.

    • 20

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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