วิธีการป้องกันการกระจายตัวของดัชนีรายวัน 99%


11

ฉันมีตารางคะแนนสูงสุดสำหรับผู้เล่น 100,000 คนที่ถูกแทรกลงในวันละ 2 ครั้งโดยมีหนึ่งระเบียนต่อผู้เล่นหนึ่งคน ในตอนท้ายของวันการกระจายตัวของดัชนีสำหรับดัชนีในตารางนั้นคือ 99% มีวิธีการป้องกันโดยการปรับการตั้งค่า?

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

1
คำถามโง่ ๆ แต่ครอบคลุมทุกพื้นฐาน - คุณสร้างใหม่ / ปรับโครงสร้างองค์กรใหม่ทุกวันหรือไม่?
JHFB

ไม่มีตาราง DDL ใครก็ตามที่โพสต์จะเดาว่า คุณใช้ GUID เป็นคีย์หลักหรือไม่
SQL Learner

ฉันกำลังสร้างใหม่ทุกวันในขณะนี้ แต่ฉันสงสัยว่าฉันสามารถป้องกันไม่ให้เกิดขึ้นทุกวันเพราะฉันสามารถคาดการณ์ได้ดีว่าข้อมูลวิวัฒนาการ
olle

1
คุณพิจารณาระดับการแตกแฟรกเมนต์อย่างไร ฉันไม่คิดว่าจะมีการแยกส่วนแบบลอจิคัลมากนักสำหรับดัชนีคลัสเตอร์ การแยกส่วนภายในบางอย่างคุณไม่จำเป็นต้องFILLFACTOR = 80มี มันจะเสียพื้นที่ คอลัมน์ทั้งหมดมีความยาวคงที่ดังนั้นแถวจะไม่สามารถขยายเมื่อมีการอัปเดตและเม็ดมีดจะไม่เกิดขึ้นกลางตาราง 99% ดูเหมือนว่าจะสูงเกินไปสำหรับดัชนีอื่นเช่นกัน แต่ละหน้ามีดัชนีกี่หน้า
Martin Smith

99% หลังจากการสร้างใหม่ในแต่ละวันจะมีบ้างคุณสามารถแสดงsys.dm_db_index_physical_statsผลงานของคุณได้หรือไม่?
Martin Smith

คำตอบ:


3

ฉันคิดว่าคุณควรลองFILLFACTORตั้งค่าที่สูงขึ้นในHighScore_RoundGroup_Nidx(เช่น 50 หรือ 40) คุณสามารถตั้งค่าFILLFACTORเป็น 0 หรือ 100 สำหรับPRIMARY KEYมันเพราะมันไม่ควรแยกส่วนถ้ามันยังคงFILLFACTORไม่ได้ช่วยเพราะเหตุผลคือหน้าที่ได้รับการจัดสรรใหม่ interleave กับหน้าการจัดสรรใหม่อื่น ๆ นี่เป็นปัญหาของ SQL Server ที่รู้จักกันดี คุณสามารถย้ายดัชนีนี้ไปยังกลุ่มไฟล์ของตนเองซึ่งจะหยุดปัญหานี้


2

บางทีคุณคิดว่าคุณกำลังสร้างใหม่ แต่ดัชนีไม่ได้ถูกสร้างขึ้นมาใหม่เนื่องจากดัชนีมีขนาดไม่ใหญ่พอ

ดูคำถามนี้ ทำไมดัชนี REBUILD ไม่ลดการแยกส่วนดัชนี

คุณตรวจสอบการกระจายตัวหลังจากสร้างใหม่หรือไม่? มันจัดเรียงข้อมูลจริงหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.