Câu trả lời:
Chỉ mục lưu trữ dữ liệu thực tế (trang dữ liệu hoặc trang chỉ mục tùy thuộc vào loại chỉ mục chúng ta đang nói đến) và phân phối lưu trữ dữ liệu Thống kê. Do đó, CREATE INDEX
sẽ là DDL để tạo một chỉ mục (được nhóm, không bao gồm, v.v.) và CREATE STATISTICS
là DDL để tạo số liệu thống kê về các cột trong bảng.
Tôi khuyên bạn nên đọc về những khía cạnh của dữ liệu quan hệ. Dưới đây là một vài bài viết mới, giới thiệu. Đây là những chủ đề rất rộng, và do đó thông tin về chúng có thể đi rất rộng và rất sâu. Đọc về ý tưởng chung của chúng dưới đây, và đặt câu hỏi cụ thể hơn khi chúng phát sinh.
Tham chiếu BOL trên Bảng và Tổ chức chỉ mục
Tham chiếu BOL về Cấu trúc chỉ mục được nhóm
Tham chiếu BOL trên Cấu trúc chỉ mục không bao gồm
SQL Server Trung tâm về Giới thiệu về chỉ mục
Tham chiếu BOL về thống kê
Dưới đây là một ví dụ hoạt động để xem hai phần này hoạt động (nhận xét để giải thích):
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
Đây là mẫu thử nghiệm thống kê có thể trông như thế nào:
Lưu ý rằng Thống kê là ngăn chặn phân phối dữ liệu. Chúng giúp SQL Server xác định một kế hoạch tối ưu. Một ví dụ điển hình của việc này là, hãy tưởng tượng bạn sẽ sống một vật nặng. Nếu bạn biết trọng lượng đó là bao nhiêu vì có một trọng lượng đánh dấu trên đó, bạn sẽ xác định cách tốt nhất để nâng và với cơ bắp nào. Đó là những gì SQL Server làm với số liệu thống kê.
-- 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'
);
Chúng ta có thể thấy từ ví dụ trên rằng chỉ mục thực sự chứa dữ liệu (tùy thuộc vào loại chỉ mục, các trang lá sẽ khác nhau).
Bài đăng này chỉ cho thấy một tổng quan rất rất ngắn gọn về hai máy chủ SQL khía cạnh lớn này . Cả hai thứ này có thể chiếm các chương và sách. Đọc một số tài liệu tham khảo, và sau đó bạn sẽ có một nắm bắt tốt hơn.