Índice de SQL Server vs Estadística

Respuestas:

19

Los índices almacenan datos reales (páginas de datos o páginas de índice dependiendo del tipo de índice del que estamos hablando), y las estadísticas almacenan la distribución de datos. Por lo tanto, CREATE INDEXserá el DDL para crear un índice (agrupado, no agrupado, etc.) y CREATE STATISTICSes el DDL para crear las estadísticas en columnas dentro de la tabla.

Le recomiendo que lea sobre estos aspectos de los datos relacionales. A continuación hay un par de artículos introductorios para principiantes. Estos son temas muy amplios y, por lo tanto, la información sobre ellos puede ser muy amplia y profunda. Lea la idea general de ellos a continuación y haga preguntas más específicas cuando surjan.

Referencia de BOL en la tabla y organización de índice
Referencia de
BOL en estructura de índice agrupado Referencia de BOL en estructuras de índice no agrupadas
SQL Server Central en Introducción a los índices
Referencia de BOL en estadística

Aquí hay un ejemplo de trabajo para ver estas dos partes en acción (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

Así es como puede verse una muestra de prueba de estadísticas:

ingrese la descripción de la imagen aquí

Tenga en cuenta que las estadísticas son la contención de la distribución de datos. Ayudan a SQL Server a determinar un plan óptimo. Un buen ejemplo de esto es, imagina que vas a vivir un objeto pesado. Si supiera cuánto pesa ese peso porque tiene una marca de peso, determinaría la mejor manera de levantar y con qué músculos. Eso es lo que hace SQL Server con las estadí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 en el ejemplo anterior que el índice realmente contiene datos (dependiendo del tipo de índice, las páginas finales serán diferentes).

Esta publicación solo ha mostrado una muy, muy breve descripción de estos dos grandes aspectos de SQL Server. Ambos podrían ocupar capítulos y libros. Lea algunas de las referencias, y luego tendrá una mejor comprensión.

Thomas Stringer
fuente
1
Sé que esta es una publicación anterior, pero creo que es digno de mención que crear un índice (en la mayoría de los casos) generará automáticamente estadísticas para el índice. No se puede decir lo mismo de la creación de estadísticas.
Steve Mangiameli