অব্যবহৃত স্পেস এসকিউএল সার্ভার সারণী মুক্ত করা


11

আমার প্রচুর অব্যবহৃত স্থান সহ এসকিউএল সার্ভার 2012 এক্সপ্রেসে একটি টেবিল রয়েছে।

আমার ডাটাবেসে জায়গা খালি করা দরকার।

| নাম | রাউস | রিসার্ভড | ডেটা | INDEX_SIZE | অব্যবহৃত |
| ------------- | -------- | -------------- | ----------- --- | ------------ | -------------- |
| মাই টেবিলনাম | 158890 | 8928296 কেবি | 5760944 কেবি | 2248 কেবি | 3165104 কেবি |

আমি কীভাবে এসকিউএলকে 3165104KB প্রকাশ করতে পারি?

আমি ইতিমধ্যে চেষ্টা করেছি:

Alter table MyTableName Rebuild
DBCC CLEANTABLE (MyDbName,"MyTableName ", 0)
ALTER INDEX ALL ON MyTableName REORGANIZE ; 
ALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF) 

টেবিলটি এখানে:

CREATE TABLE [dbo].[MyTableName](
    [ImageID] [int] IDENTITY(1,1) NOT NULL,
    [DateScan] [datetime] NULL,
    [ScanImage] [image] NULL,
 CONSTRAINT [PK_Image] PRIMARY KEY CLUSTERED 
(
    [ImageID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

কেবলমাত্র আমরা যা করেছি তা ScanImageপ্রতি সারিতে অনেক ছোট চিত্রের সাথে প্রতিস্থাপন করা হয়েছে (এখানে এত অব্যবহৃত স্থান কীভাবে রয়েছে)।

উত্তর:


10

কেবলমাত্র আমরা যা করেছি তা ScanImageপ্রতি সারিতে অনেক ছোট চিত্রের সাথে প্রতিস্থাপন করা হয়েছে (এখানে এত অব্যবহৃত স্থান কীভাবে রয়েছে)

কিছু পরীক্ষা-নিরীক্ষা করা থেকে সর্বাধিক স্থান কার্যকর পদ্ধতি হ'ল বরাদ্দ ইউনিটটি ফেলে দেওয়া এবং এটি পুনরায় তৈরি করা (যদি আপনার এটিতে কোনও রক্ষণাবেক্ষণ উইন্ডো থাকে তবে)।

প্রশ্নের কোডের কাঠামো সহ আমার পক্ষে সেরা স্থান হ্রাস অর্জনকারী উদাহরণ কোডটি হ'ল:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

SET XACT_ABORT ON;

BEGIN TRAN

SELECT [ImageID],
       [ScanImage]
INTO   #Temp
FROM   [dbo].[MyTableName]

ALTER TABLE [dbo].[MyTableName]
  DROP COLUMN [ScanImage]

/*Allocation unit not removed until after this*/
ALTER INDEX PK_Image ON MyTableName REBUILD

ALTER TABLE [dbo].[MyTableName]
  ADD [ScanImage] IMAGE NULL

UPDATE [dbo].[MyTableName]
SET    [ScanImage] = T.[ScanImage]
FROM   [dbo].[MyTableName] M
       JOIN #Temp T
         ON M.ImageID = T.[ImageID]

DROP TABLE #Temp

COMMIT 

সবকিছু একটি লেনদেনের মধ্যে তাই মেশিন ক্রাশ হলে এটি আবার ঘুরিয়ে দেওয়া হবে। সম্ভবত কিছু ত্রুটি পরিচালনার সাথে বা কমপক্ষে করতে পারে SET XACT_ABORT ON। আমি SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;অনুলিপি চলাকালীন বা তার পরে এবং পরে হারিয়ে যাওয়া থেকে কোনও একই সময়ে সংশোধনগুলি রোধ করতে ব্যবহার করেছি ।

imageসমস্ত সারিতে একটির আকার হ্রাস করার পরে সংরক্ষিত এলওবি পৃষ্ঠাগুলির সংখ্যা ছিল:

+ + ------------------------------------------------- - + + --------------------- + + ------------------------- + +
| ঘটনা | lob_used_page_count | লব_আরক্ষিত_পৃষ্ঠা_কাউন্ট |
+ + ------------------------------------------------- - + + --------------------- + + ------------------------- + +
| প্রতিটি 10,000,000 বাইট ডেটা সহ 10,000 সারি .োকানো | 135005 | 135017 |
| সমস্ত সারি 10,000 বাইট চিত্রের ডেটাতে আপডেট করা হয়েছে 31251 | 135012 |
| পুনর্গঠন | 23687 | 25629 |
| ড্রপ এবং পুনরায় অ্যাড ইমেজ ডেটা | 13485 | 13489 |
+ + ------------------------------------------------- - + + --------------------- + + ------------------------- + +

1
অথবা যদি টেবিলটি বড় হয় তবে রক্ষণাবেক্ষণ উইন্ডোর সময় বিসিপি ডেটা আউট করে এবং তারপরে বুক ইনসার্টটি ফিরে আসবে।
কিন শাহ

6

চেষ্টা

ALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF)

এটি ক্লাস্টার্ড সূচকটি পুনরায় তৈরি করে, তাই ক্রিয়াকলাপটি সম্পন্ন করার জন্য আপনার ডাটাবেসে অতিরিক্ত ঘর প্রয়োজন। আপনার ডিস্কটি পূর্ণ হওয়ার কারণে আপনার কাছে অতিরিক্ত কোনও ঘর না থাকলে আপনি সম্ভবত ডাটাবেসে একটি নতুন ডেটা ফাইল যুক্ত করতে পারেন (একটি ভিন্ন ডিস্কে) এবং টেবিলটি এতে সরাতে পারেন।

এটিও সম্ভব যে ক্লাস্টারড সূচকটি 100% এরও কম একটি ফিলফেক্টর দিয়ে সংজ্ঞায়িত করা হয়। ফিল ফ্যাক্টরটি সেট করা, উদাহরণস্বরূপ% 66%, ভবিষ্যতের ব্যবহারের জন্য প্রতিটি ডেটা পৃষ্ঠার ১/৩ ফাঁকা রাখবে। এটি যদি সমস্যা হয় তবে আপনি ফিল ফ্যাক্টরটি ব্যবহার করে পরিবর্তন করতে পারেনALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF, FILLFACTOR=100)

আপনি যদি সারণী থেকে সম্প্রতি একটি পরিবর্তনশীল দৈর্ঘ্যের ক্ষেত্রটি বাদ দিয়ে থাকেন তবে আপনি চেষ্টা করতেও পারেন DBCC CLEANTABLE( Databasename, "MyTableName")

অনলাইন বই (বিএল) এর http://technet.microsoft.com/en-us/library/ms188388%28v=sql.100%29.aspx এ সূচী পুনর্নির্মাণের একটি দুর্দান্ত নিবন্ধ রয়েছে


2

ডিবি রিকভারি মোড কিনা তা নিশ্চিত করুন SIMPLE

হিসাবে কলাম পরিবর্তন VARBINARY(MAX)

তারপরে সম্পূর্ণ নতুন টেবিলটিতে ডেটা অনুলিপি করার চেষ্টা করুন।

ব্যবহার করে নতুন টেবিলের আকারটি পরীক্ষা করুন sp_spaceused "tablename"। আপনি যদি টেবিলের অব্যবহৃত স্থানের সাথে সন্তুষ্ট হন তবে কোনও সারণির নাম উল্লেখ না করে একই কমান্ড ব্যবহার করে ডাটাবেসের অব্যবহৃত স্থানটি পরীক্ষা করুন। সেই স্থানটি এখনও ডাটাবেস ফাইলের মধ্যে রয়েছে এবং ওএসে প্রকাশিত হয় নি।

আপনি আসল টেবিলটি ফেলে দিতে পারেন এবং নতুন টেবিলটির নাম পরিবর্তন করতে পারেন, বা আবার একই জিনিসটি করতে পারেন এবং আপনি যদি নামকরণের অপারেশনটিতে বিশ্বাস না করেন তবে মূল টেবিলের নামটি ব্যবহার করতে পারেন, (আমি পুরোপুরি বিশ্বাস করি না)।

যদি এটি কাজ করে তবে শেষ পদক্ষেপটি সহজ: আপনি কীভাবে ফাইলগুলি সঙ্কুচিত করবেন এবং অব্যবহৃত স্থান ছেড়ে দেবেন তা আপনি জানেন।

যদি কোনও বিদেশী কী থাকে তবে তাদের সংজ্ঞাগুলি রেকর্ড করুন, সেগুলি ফেলে দিন, উপরে উল্লিখিত কার্যগুলি সম্পাদন করুন এবং পরে বিদেশী কীগুলি পুনরায় তৈরি করুন। অবশ্যই এটি সময় নেয় এবং এই অপারেশনটি অফ টাইম সময়ে করা উচিত। এই পুরো কাজটি স্ক্রিপ্টের মাধ্যমে পাশাপাশি রাতারাতি চালানো যেতে পারে।


1

আমি কেবল একটি নতুন ডাটাবেস তৈরি করব এবং এটিতে ডেটা অনুলিপি করব। আপনার আমদানি / রফতানি উইজার্ড ব্যবহার করতে সক্ষম হওয়া উচিত। (অবশ্যই একটি ব্যাকআপ এবং পুনরুদ্ধার সমস্যাটি বজায় রাখবে)) ডেটা আমদানির ফলাফলগুলি দেখুন। যদি সমস্ত দেখতে ভাল লাগে তবে মূল ডাটাবেসটির নতুন নাম দিন এবং তারপরে আপনি যে নামটি ব্যবহার করতে চান তার নতুন নামটি পুনরায় নামকরণ করুন। (আসলটি ড্রপ করার আগে আমি সবসময় কিছুটা অপেক্ষা করি, অনলাইনে ডাবল-চেক করার জন্য))

এটি মূল্যবান কিসের জন্য, আমরা নিম্নলিখিত পদক্ষেপগুলি দ্বারা ডাটাবেসগুলি থেকে ব্লব স্পেস পুনরুদ্ধার করেছি, যদি সেগুলি খুব বড় না হয়। (তবে, যেহেতু আপনি এসকিউএল সার্ভার এক্সপ্রেস ব্যবহার করছেন তাই আপনার এটি চেষ্টা করার মতো জায়গা থাকতে পারে না))

  1. ফাইলগোষ্ঠীতে একটি নতুন ফাইল যুক্ত করুন।
  2. চালান DBCC SHRINKFILE(file, EMPTYFILE)। যেহেতু আপনি এমডিএফ সঙ্কুচিত করছেন এটি শেষ পর্যন্ত ব্যর্থ হবে, যেহেতু সিস্টেম মেটাডেটা সরানো যায় না। তবে খালি ব্লব বরাদ্দ সরানো হয় না।
  3. চালান DBCC SHRINKFILE(newfile,EMPTYFILE)। এটি অতিরিক্ত স্থান বিয়োগ করে ডেটাটি সরিয়ে ফেলবে।
  4. ফাইলগোষ্ঠী থেকে নতুন ফাইল (এখন খালি) ফেলে দিন।

এটি ব্লব ব্লাট দূর করে। আমার উল্লেখ করা উচিত যে আমরা আপগ্রেড স্ক্রিপ্টগুলি পরীক্ষার জন্য বেশিরভাগ খালি ডাটাবেস তৈরি করতে প্রাথমিকভাবে এই কৌশলটি ব্যবহার করেছি।


-1

ক্লাস্টারড ইনডেক্স পুনর্গঠন করুন - যে নোডের মধ্যে একটিতে ডেটা থাকে তাই .... এটি সম্ভবত খণ্ডিত হয়।


আমি দৌড়ানোর চেষ্টা করেছি: ALL INDEX ALL [MyTableName] REORGANIZE;
ডার্মফ্রান্স

3
এটি পুনর্নির্মাণ করুন;) পুনর্গঠন নয়।
টমটম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.