กำลังสร้างดัชนีใหม่ฐานข้อมูลขนาด 10 เท่า


13

ฉันมีฐานข้อมูล SQL Server (2008 R2 SP1) ประมาณ 15 กิ๊ก ปรากฎว่าการบำรุงรักษาไม่ได้ทำงานมาระยะหนึ่งดังนั้นฉันจึงสร้างแผนการบำรุงรักษาเพื่อสร้างดัชนีทั้งหมดขึ้นใหม่พวกเขามีการแยกส่วนมาก

งานเสร็จสิ้นและการแตกแฟรกเมนต์หายไป แต่ตอนนี้ฐานข้อมูลมีมากกว่า 120 กิ๊ก! ฉันเข้าใจว่าจะใช้พื้นที่เพิ่มเติมเพื่อสร้างใหม่ทั้งหมด แต่ตอนนี้งานเสร็จแล้วฉันคิดว่าพื้นที่ทั้งหมดนั้นจะเป็นพื้นที่ว่าง แต่พื้นที่ว่างแสดงเพียง 3 กิ๊กดังนั้นจึงมีการใช้ 117 gigs แม้ว่างานสร้างดัชนีใหม่จะเสร็จสิ้น

ฉันสับสนมากและสามารถใช้คำแนะนำบางอย่างฉันได้รับ db กลับไปเป็นขนาดที่เหมาะสมเราไม่มีพื้นที่ดิสก์สำหรับสิ่งนี้

ขอบคุณล่วงหน้า!

นี่คือผลลัพธ์ของข้อความค้นหาทั้งสองที่โพสต์:

log_reuse_wait_desc ไม่มีอะไร

name    TotalSpaceInMB  UsedSpaceInMB   FreeSpaceInMB
LIVE_Data   152             123             28
LIVE_Log    18939           89              18849
LIVE_1_Data 114977          111289          3688

ไฟล์ที่สามเป็นไฟล์. ndf ซึ่งเป็นไฟล์ที่แสดงเพียง 3688 ในพื้นที่ที่ไม่ได้ใช้ แต่มีการใช้ 111289 สำหรับข้อมูลประมาณ 15 กิ๊กกะ

คำตอบ:


15

ในระหว่างนี้ฉันเพิ่งค้นพบสิ่งนี้สมองทั้งหมดก็เรอ ฉันได้ระบุสิ่งที่ฉันคิดว่าเป็นปัจจัยเติม 90 ในงานสร้างใหม่ แต่มันพูดว่า "เปลี่ยนเปอร์เซ็นต์พื้นที่ว่างเป็น" ดังนั้นโดยใช้ค่า 90 ในนั้นจริง ๆ แล้วฉันใช้ 10 ปัจจัยเติม !! กรมทางหลวง ไม่น่าแปลกใจเลยว่ามันจะขยายใหญ่ขึ้น 10 เท่า ฉันจะสร้างใหม่โดยเติมปัจจัยที่ถูกต้องแล้วหดตัว ขอบคุณทุกคนสำหรับการป้อนข้อมูลแม้ว่า


1
ตัวช่วยสร้างนี้แย่มาก
usr

ฉันรู้ว่าฉันคุ้นเคยกับบรรทัดคำสั่งที่คุณระบุ FILL_FACTOR และไม่ว่าง% ขอให้มันสอดคล้องกัน

อย่าทำดัชนีซ้ำแล้วหดตัวมันเสียเวลา! ดูคำตอบของฉันสำหรับข้อมูลเพิ่มเติม
JNK

1
JNK ฉันรู้ว่าคุณหมายถึงอะไรอย่าหดหู่หลังจากสร้างใหม่เพราะมันจะทำให้ทุกอย่างแตกสลายอีกครั้ง อย่างไรก็ตามในสถานการณ์พิเศษนี้ที่ Jeff โดยบังเอิญเพิ่มพื้นที่ว่าง 90% ในทุกหน้าฉันไม่เห็นวิธีอื่นในการเรียกคืนพื้นที่แล้วไปที่: rebuild with fillfactor 90, ลดขนาดไฟล์ แต่คุณจะต้องสร้างใหม่อีกครั้ง ด้วยสารเติมแต่งหรือ 90% อีกครั้ง หรือจะมีวิธีอื่นในการเรียกคืนพื้นที่กลับมา (ดีอาจจะเป็นกลุ่มแฟ้มใหม่แล้วสร้างหยดลงบน filegroup ใหม่ แต่ไม่ได้ทำงานสำหรับทุกคน)
เอ็ดเวิร์ด Dortland

2

การสร้างดัชนีใหม่ทำให้เกิดพื้นที่หย่อนพิเศษในฐานข้อมูล นี่เป็นผลพลอยได้จากธรรมชาติของกระบวนการทำดัชนีใหม่ - เซิร์ฟเวอร์กำลังสร้างดัชนีเวอร์ชันใหม่ที่ต่อเนื่องกันโดยหวังว่าจะไปพร้อมกับเวอร์ชันปัจจุบันจากนั้นปล่อยเวอร์ชันปัจจุบันเมื่อเสร็จสมบูรณ์

การหดตัวหลังจากทำดัชนีใหม่นั้นไม่มีจุดหมาย!

คุณเพียงแค่จะแยกส่วนดัชนี! การลดขนาดจะลบพื้นที่หย่อนโดยการจัดสรรข้อมูลใหม่ในฐานข้อมูล

นี่เป็นบทความดีๆจาก Paul Randal ผู้ที่ทำงานกับ Microsoft อยู่ในความดูแลของDBCCรหัสรวมถึงการลดขนาดทำไมคุณไม่ควรย่อขนาด


0

SORT_IN_TEMPDB=ONคุณควรจะได้ใช้ตัวเลือกที่สร้าง

ในกรณีของคุณมีการใช้ไฟล์ข้อมูลจริงซึ่งเป็นที่ตั้งของตารางของปัญหาในการเรียงลำดับดัชนี พื้นที่ 120GB ส่วนใหญ่นั้นยังคงไม่ได้ใช้และจะเต็มไปด้วยข้อมูลหน้าเมื่อจำเป็น

คุณสามารถดูสถานะพื้นที่ใช้งาน / ว่างด้วยแบบสอบถามนี้ (นำมาจากที่นี่ ):

use [YourDatabaseNameHere]
go

select
    name,
    cast((size/128.0) as int) as TotalSpaceInMB,
    cast((cast(fileproperty(name, 'SpaceUsed') as int)/128.0) as int) as UsedSpaceInMB,
    cast((size/128.0 - cast(fileproperty(name, 'SpaceUsed') AS int)/128.0) as int) as FreeSpaceInMB
from
    sys.database_files

สำหรับการหดตัวไฟล์ฐานข้อมูลที่เฉพาะเจาะจง (ข้อมูลหรือบันทึก) คุณสามารถเห็นข้อมูลบางอย่างที่นี่ คำเตือนก่อนหน้านั้นการปล่อยพื้นที่ที่ไม่ได้ใช้กำลังใช้เวลาสักครู่สำหรับฐานข้อมูล 100+ Gb (ขึ้นอยู่กับความเร็วในการจัดเก็บ) ดังนั้นปล่อยให้มันรัน


ใช่มันเป็นรูปแบบที่ฉันจะเพิ่มในคำถามสักครู่หนึ่ง

@JeffBane: คุณสามารถเพิ่มข้อมูลนี้ในคำถามของคุณในใบเสนอราคาได้หรือไม่? ฉันไม่สามารถทำสิ่งที่อยู่ในนั้น
Marcel N.

1
เมื่อสร้างดัชนีใหม่คุณจะต้องมีพื้นที่ว่างสองเท่าของดัชนี + 20% สำหรับการเรียงลำดับ โดยทั่วไปแล้วการสร้างดัชนีทุกครั้งในฐานข้อมูลของคุณคุณต้องการเพียง 120% ของดัชนีที่ใหญ่ที่สุดในฐานข้อมูลของคุณ หากคุณใช้ SORT_IN_TEMPDB คุณจะได้รับเพียง 20% คุณยังคงต้องการ aditional 100% ในไฟล์ข้อมูลของคุณ ยิ่งไปกว่านั้นการใช้ sort in tempdb จะเพิ่มการโหลด IO ของคุณอย่างมากเนื่องจากแทนที่จะเขียนดัชนีหนึ่งครั้งไปยัง datafile ตอนนี้คุณเขียนมันหนึ่งครั้งไปยัง tempdb แล้วเขียนลงในไฟล์ข้อมูล ดังนั้นจึงไม่เหมาะเสมอไป
Edward Dortland

-1

ไม่มีรายละเอียดอื่น ๆ ฉันสงสัยว่าคุณจำเป็นต้องสำรองข้อมูลบันทึกธุรกรรมก่อนที่คุณจะสามารถเรียกคืนพื้นที่ได้

ดูสิ่งที่select name, log_reuse_wait_desc from sys.databasesบอกคุณ หากคอลัมน์ log_reuse_wait_desc แจ้งว่าLOG_BACKUPจะไม่สามารถเรียกคืนพื้นที่จนกว่าคุณจะทำการสำรองข้อมูลของบันทึก tran


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