আমার কাছে একটি প্রোডাকশন ডাটাবেজে একটি টেবিল রয়েছে যার আকার রয়েছে ৫২৫ গিগাবাইট, যার মধ্যে 383 জিবি অব্যবহৃত:
আমি এই স্থানটির কিছুটা দাবি করতে চাই, তবে, প্রোডাকশন ডিবি নিয়ে গণ্ডগোল করার আগে, আমি কম ডাটা সহ টেস্ট ডিবিতে অভিন্ন টেবিলে কিছু কৌশল পরীক্ষা করছি। এই টেবিলের অনুরূপ সমস্যা রয়েছে:
টেবিল সম্পর্কে কিছু তথ্য:
- ফিল ফ্যাক্টর 0 তে সেট করা আছে
- প্রায় 30 টি কলাম রয়েছে
- কলামগুলির মধ্যে একটি হ'ল এলওবি টাইপ ইমেজ, এবং এটি ফাইলগুলি স্টোর করে যা কিছু কেবি থেকে কয়েকশ এমবি আকারের আকারের হয়
- সারণীতে এর সাথে কোনও অনুমান সূচক নেই
সার্ভারটি এসকিউএল সার্ভার 2017 (আরটিএম-জিডিআর) (KB4505224) চলছে - 14.0.2027.2 (এক্স 64)। ডাটাবেস SIMPLE
পুনরুদ্ধার মডেল ব্যবহার করছে ।
কিছু জিনিস আমি চেষ্টা করেছি:
- ইনডেক্স পুনর্নির্মাণ:
ALTER INDEX ALL ON dbo.MyTable REBUILD
। এটির একটি নগণ্য প্রভাব ছিল। - ইনডেক্স গঠনের:
ALTER INDEX ALL ON dbo.MyTable REORGANIZE WITH(LOB_COMPACTION = ON)
। এটির একটি নগণ্য প্রভাব ছিল। এলওবি কলামটি অন্য টেবিলে অনুলিপি করেছেন, কলামটি নামিয়েছেন, কলামটি পুনরায় তৈরি করেছেন এবং তথ্যটি অনুলিপি করেছেন (এই পোস্টে উল্লিখিত হিসাবে: অব্যবহৃত স্থান এসকিউএল সার্ভার সারণী মুক্ত করা হবে )। এটি অব্যবহৃত স্থান হ্রাস পেয়েছে, তবে মনে হচ্ছে এটি কেবল ব্যবহৃত স্থানে রূপান্তরিত হবে:
সারণিটি রফতানি করতে, এটি কেটে ফেলা এবং পুনরায় লোড করতে বিসিপি ইউটিলিটি ব্যবহার করুন (এই পোস্টে উল্লিখিত হিসাবে: কোনও টেবিলের জন্য অব্যবহৃত স্থান কীভাবে মুক্ত করবেন? )। এটি অব্যবহৃত স্থানও হ্রাস করেছে এবং ব্যবহৃত স্থানটিকে উপরের চিত্রের মতো একই পরিমাণে বাড়িয়েছে।
- যদিও এটি প্রস্তাবিত নয়, আমি ডিবিসিসি শ্রিনকফিল এবং ডিবিসিসি শ্রিনকদাটাবেস কমান্ড চেষ্টা করেছিলাম, তবে অব্যবহৃত স্থানে তাদের কোনও প্রভাব পড়েনি।
- দৌড়াতে
DBCC CLEANTABLE('myDB', 'dbo.myTable')
কোনও তফাত হয়নি - আমি চিত্র এবং পাঠ্য ডেটাটাইপগুলি বজায় রেখে এবং ডেটাটিপগুলি ভের্বিনারি (সর্বাধিক) এবং ভার্চার (সর্বাধিক) পরিবর্তন করার পরে উপরের উভয়টিই চেষ্টা করেছি।
- আমি একটি তাজা ডাটাবেসে একটি নতুন টেবিলের মধ্যে ডেটা আমদানি করার চেষ্টা করেছি এবং এটি কেবল অব্যবহৃত স্থানটিকে ব্যবহৃত স্থানে রূপান্তর করেছে। আমি এই প্রচেষ্টার বিবরণ রূপরেখা পোস্টটি ।
আমি যদি ফলাফল আশা করতে পারি তবে ফলাফল ডিবিতে এই প্রচেষ্টাগুলি করতে চাই না, তাই:
- কেন এই অব্যবহৃত স্থানটিকে কিছু চেষ্টা করার পরে কেন ব্যবহৃত স্থানটিতে পরিবর্তিত করা হচ্ছে? আমার মনে হচ্ছে হুডের নীচে কী ঘটছে সে সম্পর্কে আমার ভাল ধারণা নেই।
- ব্যবহৃত স্থান না বাড়িয়ে অব্যবহৃত স্থান হ্রাস করার জন্য আমি আরও কিছু করতে পারি?
সম্পাদনা করুন: টেবিলের জন্য এখানে ডিস্ক ব্যবহারের প্রতিবেদন এবং স্ক্রিপ্ট রয়েছে:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MyTable](
[Column1] [int] NOT NULL,
[Column2] [int] NOT NULL,
[Column3] [int] NOT NULL,
[Column4] [bit] NOT NULL,
[Column5] [tinyint] NOT NULL,
[Column6] [datetime] NULL,
[Column7] [int] NOT NULL,
[Column8] [varchar](100) NULL,
[Column9] [varchar](256) NULL,
[Column10] [int] NULL,
[Column11] [image] NULL,
[Column12] [text] NULL,
[Column13] [varchar](100) NULL,
[Column14] [varchar](6) NULL,
[Column15] [int] NOT NULL,
[Column16] [bit] NOT NULL,
[Column17] [datetime] NULL,
[Column18] [varchar](50) NULL,
[Column19] [varchar](50) NULL,
[Column20] [varchar](60) NULL,
[Column21] [varchar](20) NULL,
[Column22] [varchar](120) NULL,
[Column23] [varchar](4) NULL,
[Column24] [varchar](75) NULL,
[Column25] [char](1) NULL,
[Column26] [varchar](50) NULL,
[Column27] [varchar](128) NULL,
[Column28] [varchar](50) NULL,
[Column29] [int] NULL,
[Column30] [text] NULL,
CONSTRAINT [PK] PRIMARY KEY CLUSTERED
(
[Column1] ASC,
[Column2] ASC,
[Column3] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DF_Column4] DEFAULT (0) FOR [Column4]
GO
ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DF_Column5] DEFAULT (0) FOR [Column5]
GO
ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DF_Column15] DEFAULT (0) FOR [Column15]
GO
ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DF_Column16] DEFAULT (0) FOR [Column16]
GO
এখানে ম্যাক্স ভার্ননের উত্তরে আদেশগুলি কার্যকর করার ফলাফল রয়েছে:
╔════════════╦═══════════╦════════════╦═════════════════╦══════════════════════╦════════════════════╗
║ TotalBytes ║ FreeBytes ║ TotalPages ║ TotalEmptyPages ║ PageBytesFreePercent ║ UnusedPagesPercent ║
╠════════════╬═══════════╬════════════╬═════════════════╬══════════════════════╬════════════════════╣
║ 9014280192║ 8653594624║ 1100376║ 997178 ║ 95.998700 ║ 90.621500 ║
╚════════════╩═══════════╩════════════╩═════════════════╩══════════════════════╩════════════════════╝
╔═════════════╦═══════════════════╦════════════════════╗
║ ObjectName ║ ReservedPageCount ║ UsedPageCount ║
╠═════════════╬═══════════════════╬════════════════════╣
║ dbo.MyTable ║ 5109090 ║ 2850245 ║
╚═════════════╩═══════════════════╩════════════════════╝
হালনাগাদ:
আমি ম্যাক্স ভার্ননের পরামর্শ অনুসারে নিম্নলিখিতটি চালিয়েছি:
DBCC UPDATEUSAGE (N'<database_name>', N'<table_name>');
এবং এখানে আউটপুট ছিল:
DBCC UPDATEUSAGE: Usage counts updated for table 'MyTable' (index 'PK_MyTable', partition 1):
USED pages (LOB Data): changed from (568025) to (1019641) pages.
RSVD pages (LOB Data): changed from (1019761) to (1019763) pages.
এটি টেবিলের জন্য ডিস্কের ব্যবহার আপডেট করেছে:
এবং সামগ্রিক ডিস্ক ব্যবহার:
সুতরাং, দেখে মনে হচ্ছে সমস্যাটি হ'ল এসকিউএল সার্ভারের দ্বারা ট্র্যাক করা ডিস্কের ব্যবহার প্রকৃত ডিস্কের ব্যবহারের সাথে খুব সহজেই সিঙ্ক হয়ে যায়। আমি এই সমস্যাটিকে সমাধান করা বিবেচনা করব, তবে কেন এটি প্রথম স্থানে ঘটত তা জানতে আগ্রহী হব!
DBCC UPDATEUSAGE
অব্যবহৃত স্থান এবং অব্যবহৃত পৃষ্ঠা গণনা আপডেট করেছে। দেখে মনে হচ্ছে যে এসকিউএল সার্ভারের দ্বারা প্রতিবেদন করা ডিস্কের ব্যবহার এবং পৃষ্ঠার তথ্যটি অত্যন্ত সিঙ্কের বাইরে ছিল - আমি আমার পোস্টটি বিশদ সহ আপডেট করেছি। আমি প্রথমে এটি কীভাবে হত তা সম্পর্কে আগ্রহী, তবে কমপক্ষে সমস্যাটি পাওয়া গেল। আপনার সমস্ত সহায়তার জন্য আপনাকে ধন্যবাদ, আমি সত্যিই এটির প্রশংসা করি!