มีวิธีที่เชื่อถือได้ในการกำหนดเมื่อคุณควรเรียกใช้ DBCC CLEANTABLE เพื่อเรียกคืนพื้นที่หรือไม่


11

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

แต่มีเพียงไม่กี่กรณีที่ผมสามารถที่จะเรียกคืนพื้นที่มากยิ่งขึ้นโดยการดำเนินการDBCC CLEANTABLE ด้วยฐานข้อมูลหลายร้อยในสภาพแวดล้อมของฉันมันเป็นไปไม่ได้ที่จะรู้ว่าสิ่งที่ผู้ใช้ทำในแต่ละคนและเป็นที่ยอมรับอย่างสมบูรณ์ว่าจะมีการเปลี่ยนแปลงที่เกี่ยวข้องกับการลดลงของคอลัมน์ความยาวคงที่ ฉันมักจะพบโอกาสเหล่านี้โดยดูที่การนับแถวกับจำนวนหน้าในสคริปต์การใช้พื้นที่วัตถุบางอย่างที่ฉันเขียน ฉันต้องการดำเนินการขั้นตอนต่อไปโดยพยายามตรวจจับสถานการณ์เหล่านี้โดยอัตโนมัติ

สิ่งที่ฉันอยากรู้คือถ้ามีใครบางคนกำลังติดตามโอกาสประเภทนี้อย่างกระตือรือร้นและถ้าเป็นเช่นนั้นคุณมองหาอะไรเป็นพิเศษ

ความคิดของฉันคือการเขียนบางอย่างตามแนวการรวบรวมขนาดสูงสุดและต่ำสุดของแถวจำนวนแถวในตารางจำนวนหน้าที่จัดสรรและจำนวนหน้าที่ใช้แล้วทำคณิตศาสตร์พื้นฐานเพื่อบันทึกผลลัพธ์ที่ อยู่ข้างนอกสิ่งที่จะ "คาดหวัง"


ฉันขอแนะนำให้ใช้พารามิเตอร์ batch_size บนตารางขนาดใหญ่ สิ่งนี้จะทำให้คำสั่งรันในชุดของธุรกรรมต่างจากธุรกรรมขนาดยักษ์หนึ่งรายการ
datagod

คำตอบ:


11

วิธีแก้ปัญหาที่ฉันคิดว่าสำหรับปัญหานี้คือการเรียกใช้งานรายสัปดาห์ที่จะเรียกใช้sp_spaceusedสำหรับตารางทั้งหมดในฐานข้อมูลและบันทึกข้อมูลนี้ในตาราง หากมีความแตกต่างในขนาดสำหรับแต่ละตารางที่มากกว่า ..let บอกว่า .. 10% ฉันจะเรียกใช้ dbcc ซึ่งแยกออกได้

รหัสของฉันที่จะวนซ้ำขนาดตารางดูเหมือนว่า:

if OBJECT_ID ('tempdb.dbo.#temp') is not null
    drop table #temp;

if OBJECT_ID ('dbo.BigTables') is not null
    drop table dbo.BigTables;
go

CREATE TABLE [dbo].[BigTables] (
    [table_name] [sysname] NOT NULL,
    [row_count] [int] NULL,
    [col_count] [int] NULL,
    [data_size] [varchar](50) NULL,
    [Date] [datetime] NOT NULL,
    [DBName] [nvarchar](128) NULL
);
GO

CREATE TABLE #temp (
    table_name sysname ,
    row_count int,
    reserved_size varchar(50),
    data_size varchar(50),
    index_size varchar(50),
    unused_size varchar(50)
);
go

INSERT     #temp
EXEC       sp_msforeachtable 'sp_spaceused ''?'''

insert into dbo.BigTables
SELECT     a.table_name,
           a.row_count,
           count(*) as col_count,
           a.data_size,
           getdate() as [Date],
    'MY DB' as DBName
FROM       #temp a
INNER JOIN information_schema.columns b
           ON a.table_name collate database_default
                = b.table_name collate database_default
GROUP BY   a.table_name, a.row_count, a.data_size
ORDER BY   CAST(Replace(a.data_size, ' KB', '') as integer) desc

DROP TABLE #temp;

Select * from dbo.BigTables;

ตอนนี้คุณเพียงแค่ต้องสร้างตรรกะที่จะตรวจสอบสิ่งที่จะเปลี่ยนขนาดตลอดทั้งสัปดาห์และกำหนดเวลา


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