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.
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:
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.
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 INDEX
será a DDL para criar um índice (clustered, nonclustered, etc.) eCREATE 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):
Aqui está a aparência de uma amostra de teste de estatísticas:
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.
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.