Apa perbedaan antara CREATE INDEX
dan CREATE STATISTICS
dan kapan saya harus menggunakan masing-masing?
sumber
Apa perbedaan antara CREATE INDEX
dan CREATE STATISTICS
dan kapan saya harus menggunakan masing-masing?
Indeks menyimpan data aktual (halaman data atau halaman indeks tergantung pada jenis indeks yang kita bicarakan), dan Statistik menyimpan distribusi data. Oleh karena itu, CREATE INDEX
akan menjadi DDL untuk membuat indeks (clustered, nonclustered, dll.) Dan CREATE STATISTICS
merupakan DDL untuk membuat statistik pada kolom dalam tabel.
Saya sarankan Anda membaca tentang aspek data relasional ini. Di bawah ini adalah beberapa artikel pemula, pengantar. Ini adalah topik yang sangat luas, dan karenanya informasi mengenai mereka bisa sangat luas dan sangat dalam. Bacalah ide umum mereka di bawah ini, dan ajukan pertanyaan yang lebih spesifik ketika muncul.
Referensi BOL pada Tabel dan Indeks Organisasi
BOL referensi pada Struktur Indeks Clustered
Referensi BOL pada Struktur Indeks Nonclustered
SQL Server Central pada Pengantar Indeks
BOL referensi pada Statistik
Berikut adalah contoh yang berfungsi untuk melihat dua bagian ini beraksi (dikomentari untuk menjelaskan):
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
Berikut ini contoh sampel uji statistik:
Perhatikan bahwa Statistik adalah penahanan distribusi data. Mereka membantu SQL Server menentukan rencana optimal. Contoh yang baik dari ini adalah, bayangkan Anda akan hidup sebagai benda berat. Jika Anda tahu berapa beratnya karena ada tanda di atasnya, Anda akan menentukan cara terbaik untuk mengangkat dan dengan otot apa. Itulah yang dilakukan SQL Server dengan statistik.
-- 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'
);
Kita dapat melihat dari contoh di atas bahwa indeks sebenarnya mengandung data (tergantung pada jenis indeks, halaman daun akan berbeda).
Posting ini hanya menunjukkan gambaran yang sangat sangat singkat tentang dua aspek besar SQL Server ini. Kedua hal ini dapat mengambil bab, dan buku. Baca beberapa referensi, dan kemudian Anda akan memiliki pemahaman yang lebih baik.