Bagaimana mencegah fragmentasi indeks harian 99%

11

Saya memiliki tabel skor tertinggi untuk 100.000 pemain yang dimasukkan ke dalam 2 kali sehari dengan satu catatan per pemain. Pada akhirnya, indeks fragmentasi untuk indeks dalam tabel tersebut adalah 99%. Apakah ada cara untuk mencegah hal ini dengan mengubah pengaturan?

CREATE TABLE HighScore(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [user] [int] NULL,
    [player] [int] NULL,
    [round] [tinyint] NULL,
    [group] [int] NULL,
    [rank] [int] NULL,
    [delta] [int] NULL,
    [roundpoints] [int] NULL,
    [totalpoints] [int] NULL,
PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [HighScore_RoundGroup_Nidx] ON .[HighScore] 
(
    [round] ASC,
    [group] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
GO
olle
sumber
1
Pertanyaan konyol, tetapi untuk mencakup semua dasar - apakah Anda membangun kembali / mengatur ulang setiap hari?
JHFB
tanpa TABEL DDL siapa pun yang memposting akan menebak. Apakah Anda menggunakan GUID sebagai kunci utama?
SQL Learner
Saya membangun kembali setiap hari sekarang tetapi saya bertanya-tanya apakah saya dapat mencegah hal ini terjadi setiap hari karena saya dapat mengantisipasi dengan cukup baik tentang bagaimana data berkembang.
olle
1
Bagaimana Anda menentukan tingkat fragmentasi? Saya tidak akan berharap banyak fragmentasi logis sama sekali untuk indeks berkerumun. Namun beberapa fragmentasi internal, Anda tidak perlu di FILLFACTOR = 80sana. Itu hanya akan membuang-buang ruang. Semua kolom adalah panjang tetap sehingga baris tidak dapat diperluas pada pembaruan dan sisipan tidak dapat terjadi di tengah tabel. 99% tampaknya terlalu tinggi untuk indeks lainnya. Berapa banyak halaman yang ada di setiap indeks?
Martin Smith
99% setelah membangun kembali setiap hari benar-benar akan berjalan, dapatkah Anda menunjukkan sys.dm_db_index_physical_statshasil Anda ?
Martin Smith

Jawaban:

3

Saya pikir Anda harus mencoba FILLFACTORpengaturan yang lebih tinggi HighScore_RoundGroup_Nidx(mis. 50 atau 40). Anda dapat mengatur FILLFACTORke 0 atau 100 untuk PRIMARY KEYkarena itu tidak boleh fragmen Jika masih, FILLFACTORtidak membantu karena alasannya adalah bahwa halaman yang baru dialokasikan interleave dengan halaman yang baru dialokasikan lainnya. Ini adalah masalah SQL Server yang terkenal. Anda bisa memindahkan indeks ini ke filegroup sendiri yang akan menghentikan masalah ini.

usr
sumber
2

Mungkin Anda berpikir Anda sedang membangun kembali tetapi indeks tidak bisa dibangun kembali karena indeksnya tidak cukup besar.

Lihat pertanyaan ini. Mengapa indeks REBUILD tidak mengurangi fragmentasi indeks?

Apakah Anda memeriksa fragmentasi setelah dibangun kembali? Apakah itu sebenarnya didefragmentasi.

Tom V - coba topanswers.xyz
sumber