Відповіді:
Індекси зберігають фактичні дані (сторінки даних або сторінки покажчиків залежно від типу індексу, про який ми говоримо), а Статистика зберігає розподіл даних. Отже, CREATE INDEX
буде DDL для створення індексу (кластеризованого, некластеризованого тощо) і CREATE STATISTICS
DDL для створення статистики по стовпцях всередині таблиці.
Рекомендую ознайомитись з цими аспектами реляційних даних. Нижче пара початкових, вступних статей. Це дуже широкі теми, а тому інформація про них може йти дуже широко і дуже глибоко. Прочитайте загальну ідею про них нижче, і задайте більш конкретні запитання, коли вони виникають.
Посилання на BOL на організацію таблиць та індексів
Посилання на BOL на структуру
кластерних індексів Посилання на BOL на некластеризовані структури індексів
SQL Server Central на вступ до індексів
посилання на статистику BOL
Ось робочий приклад, щоб побачити ці дві частини в дії (коментується пояснення):
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
Ось як може виглядати тестовий зразок статистики:
Зауважте, що статистика - це стримування розподілу даних. Вони допомагають SQL Server визначити оптимальний план. Хороший приклад цього - уявіть, що ви збираєтеся до життя важким предметом. Якби ви знали, яка ця вага, тому що на ній була розмітка ваги, ви визначили найкращий спосіб підняття і з якими м’язами. Це те, що робить SQL Server зі статистикою.
-- 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'
);
З наведеного вище прикладу ми бачимо, що індекс насправді містить дані (залежно від типу індексу сторінки сторінки будуть різними).
Цей пост показав лише дуже короткий огляд цих двох великих аспектів SQL Server. Обидва вони могли займати глави та книги. Прочитайте деякі посилання, і тоді ви краще зрозумієте.