অব্যবহৃত স্থানটি পুনরায় দাবি করার প্রচেষ্টা ব্যবহারকারীর স্থানটি এসকিউএল সার্ভারে উল্লেখযোগ্য পরিমাণে বাড়ায়


15

আমার কাছে একটি প্রোডাকশন ডাটাবেজে একটি টেবিল রয়েছে যার আকার রয়েছে ৫২৫ গিগাবাইট, যার মধ্যে 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')কোনও তফাত হয়নি
  • আমি চিত্র এবং পাঠ্য ডেটাটাইপগুলি বজায় রেখে এবং ডেটাটিপগুলি ভের্বিনারি (সর্বাধিক) এবং ভার্চার (সর্বাধিক) পরিবর্তন করার পরে উপরের উভয়টিই চেষ্টা করেছি।
  • আমি একটি তাজা ডাটাবেসে একটি নতুন টেবিলের মধ্যে ডেটা আমদানি করার চেষ্টা করেছি এবং এটি কেবল অব্যবহৃত স্থানটিকে ব্যবহৃত স্থানে রূপান্তর করেছে। আমি এই প্রচেষ্টার বিবরণ রূপরেখা পোস্টটি

আমি যদি ফলাফল আশা করতে পারি তবে ফলাফল ডিবিতে এই প্রচেষ্টাগুলি করতে চাই না, তাই:

  1. কেন এই অব্যবহৃত স্থানটিকে কিছু চেষ্টা করার পরে কেন ব্যবহৃত স্থানটিতে পরিবর্তিত করা হচ্ছে? আমার মনে হচ্ছে হুডের নীচে কী ঘটছে সে সম্পর্কে আমার ভাল ধারণা নেই।
  2. ব্যবহৃত স্থান না বাড়িয়ে অব্যবহৃত স্থান হ্রাস করার জন্য আমি আরও কিছু করতে পারি?

সম্পাদনা করুন: টেবিলের জন্য এখানে ডিস্ক ব্যবহারের প্রতিবেদন এবং স্ক্রিপ্ট রয়েছে:

ডিস্ক ব্যবহার

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.

এটি টেবিলের জন্য ডিস্কের ব্যবহার আপডেট করেছে:

এখানে চিত্র বর্ণনা লিখুন

এবং সামগ্রিক ডিস্ক ব্যবহার:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং, দেখে মনে হচ্ছে সমস্যাটি হ'ল এসকিউএল সার্ভারের দ্বারা ট্র্যাক করা ডিস্কের ব্যবহার প্রকৃত ডিস্কের ব্যবহারের সাথে খুব সহজেই সিঙ্ক হয়ে যায়। আমি এই সমস্যাটিকে সমাধান করা বিবেচনা করব, তবে কেন এটি প্রথম স্থানে ঘটত তা জানতে আগ্রহী হব!

উত্তর:


10

আমি প্রথম পদক্ষেপ হিসাবে টেবিলের বিপরীতে ডিবিসিসি আপডেট করব , যেহেতু লক্ষণগুলি অসঙ্গতিযুক্ত স্থানের ব্যবহার দেখায়।

ডিবিসিসি আপডেটের সারণি বা সূচীতে প্রতিটি বিভাজনের জন্য সারি, ব্যবহৃত পৃষ্ঠাগুলি, সংরক্ষিত পৃষ্ঠাগুলি, পাতার পৃষ্ঠাগুলি এবং ডেটা পৃষ্ঠার গণনাগুলি সংশোধন করে। যদি সিস্টেম টেবিলগুলিতে কোনও অকার্যকরতা না থাকে তবে ডিবিসিসি আপডেটের কোনও ডেটা ফেরত দেয় না। যদি ভুলত্রুটিগুলি খুঁজে পাওয়া যায় এবং সংশোধন করা হয় এবং NO_INFOMSGS ব্যবহার না করা হয়, তবে ডিবিসিসি আপডেট আপডেট সিস্টেম সারণীতে আপডেট হওয়া সারি এবং কলামগুলি ফিরিয়ে দেয়।

সিনট্যাক্সটি হ'ল:

DBCC UPDATEUSAGE (N'<database_name>', N'<table_name>');

আপনি এটি চালানোর পরে, আমি EXEC sys.sp_spaceusedটেবিলের বিরুদ্ধে দৌড়াতে চাই :

EXEC sys.sp_spaceused @objname = N'dbo.MyTable'
    , @updateusage = 'false' --true or false
    , @mode = 'ALL' --ALL, LOCAL_ONLY, REMOTE_ONLY
    , @oneresultset = 1;

উপরের কমান্ডটিতে ব্যবহার আপডেট করার বিকল্প রয়েছে, তবে যেহেতু আপনি DBCC UPDATEUSAGEনিজে ম্যানুয়ালি প্রথম দৌড়েছেন তাই সেটটিকে মিথ্যা হিসাবে রেখে দিন। DBCC UPDATEUSAGEম্যানুয়ালি দৌড়ানো আপনাকে কোনও কিছু সংশোধন হয়েছে কিনা তা দেখার অনুমতি দেয়।

নিম্নলিখিত কোয়েরিতে সারণীতে মুক্ত বাইটের শতাংশ এবং সারণীতে বিনামূল্যে পৃষ্ঠাগুলির শতাংশ দেখানো উচিত। যেহেতু ক্যোয়ারী একটি অননুমোদিত বৈশিষ্ট্য ব্যবহার করে, ফলাফলগুলি গণনা করা বুদ্ধিমানের নয়, তবে sys.sp_spaceusedউচ্চ-স্তরের আউটপুটটির সাথে তুলনা করলে এটি সঠিক বলে মনে হয় ।

ফ্রি বাইটের শতাংশ যদি ফ্রি পৃষ্ঠাগুলির শতাংশের তুলনায় উল্লেখযোগ্যভাবে বেশি হয়, তবে আপনার অনেকগুলি আংশিক খালি পৃষ্ঠা আছে।

আংশিকভাবে খালি পৃষ্ঠাগুলি বিভিন্ন কারণ থেকে শুরু করতে পারে, সহ:

  1. পৃষ্ঠা বিভক্ত হয় যেখানে ক্লাস্টারড ইনডেক্সে নতুন সন্নিবেশ যুক্ত করতে পৃষ্ঠা অবশ্যই বিভক্ত হতে হবে

  2. কলামের আকারের কারণে কলামগুলি দিয়ে পৃষ্ঠাটি পূরণ করতে অক্ষম।

ক্যোয়ারিতে অনির্ধারিত sys.dm_db_database_page_allocationsডায়নামিক ম্যানেজমেন্ট ফাংশন ব্যবহার করা হয়েছে:

;WITH dpa AS 
(
    SELECT dpa.*
        , page_free_space_percent_corrected = 
          CASE COALESCE(dpa.page_type_desc, N'')
            WHEN N'TEXT_MIX_PAGE' THEN 100 - COALESCE(dpa.page_free_space_percent, 100)
            WHEN N'TEXT_TREE_PAGE' THEN 100 - COALESCE(dpa.page_free_space_percent, 100)
            ELSE COALESCE(dpa.page_free_space_percent, 100)
          END
    FROM sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('dbo.MyTable'), NULL, NULL, 'DETAILED') dpa
)
, src AS
(
SELECT TotalKB = COUNT_BIG(1) * 8192 / 1024
    , FreeKB = SUM((dpa.page_free_space_percent_corrected / 100) * CONVERT(bigint, 8192)) / 1024
    , TotalPages = COUNT_BIG(1)
    , TotalEmptyPages = SUM(CASE WHEN dpa.page_free_space_percent_corrected = 100 THEN 1 ELSE 0 END) --completely empty pages
FROM dpa
)
SELECT *
    , BytesFreePercent = (CONVERT(decimal(38,2), src.FreeKB) / src.TotalKB) * 100
    , UnusedPagesPercent = (CONVERT(decimal(38,2), src.TotalEmptyPages) / src.TotalPages) * 100
FROM src

আউটপুট দেখে মনে হচ্ছে:

╔═════════╦════════╦════════════╦═════════════════ ╦══════════════════╦════════════════════╗
নিবন্ধ
╠═════════╬════════╬════════════╬═════════════════ ╬══════════════════╬════════════════════╣
║ 208 ║ 96 ║ 26 ║ 12 ║ 46.153800 ║ 46.153800 ║
╚═════════╩════════╩════════════╩═════════════════ ╩══════════════════╩════════════════════╝

এখানে ফাংশনটি বর্ণনা করে আমি একটি ব্লগ পোস্ট লিখেছিলাম ।

আপনার দৃশ্যে, যেহেতু আপনি মৃত্যুদন্ড কার্যকর করেছেন ALTER TABLE ... REBUILD, আপনার জন্য খুব কম সংখ্যক দেখা উচিত TotalEmptyPages, তবে আমি অনুমান করছি যে এখনও আপনার মধ্যে প্রায় 72% থাকবে BytesFreePercent

আমি আপনার CREATE TABLEচিত্রটি পুনরায় তৈরি করার চেষ্টা করতে আপনার স্ক্রিপ্টটি ব্যবহার করেছি ।

এটি আমি যে এমসভিই ব্যবহার করছি:

DROP TABLE IF EXISTS dbo.MyTable;

CREATE TABLE [dbo].[MyTable](
    [Column1]  [int]            NOT NULL IDENTITY(1,1),
    [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]

ALTER TABLE [dbo].[MyTable] ADD  CONSTRAINT [DF_Column4]  DEFAULT (0) FOR [Column4]

ALTER TABLE [dbo].[MyTable] ADD  CONSTRAINT [DF_Column5]  DEFAULT (0) FOR [Column5]

ALTER TABLE [dbo].[MyTable] ADD  CONSTRAINT [DF_Column15]  DEFAULT (0) FOR [Column15]

ALTER TABLE [dbo].[MyTable] ADD  CONSTRAINT [DF_Column16]  DEFAULT (0) FOR [Column16]
GO

INSERT INTO dbo.MyTable (
      Column2
    , Column3
    , Column4
    , Column5
    , Column6
    , Column7
    , Column8
    , Column9
    , Column10
    , Column11
    , Column12
    , Column13
    , Column14
    , Column15
    , Column16
    , Column17
    , Column18
    , Column19
    , Column20
    , Column21
    , Column22
    , Column23
    , Column24
    , Column25
    , Column26
    , Column27
    , Column28
    , Column29
    , Column30
)
VALUES (
          0
        , 0
        , 0
        , 0
        , '2019-07-09 00:00:00'
        , 1
        , REPLICATE('A', 50)    
        , REPLICATE('B', 128)   
        , 0
        , REPLICATE(CONVERT(varchar(max), 'a'), 1)
        , REPLICATE(CONVERT(varchar(max), 'b'), 9000)
        , REPLICATE('C', 50)    
        , REPLICATE('D', 3)     
        , 0
        , 0
        , '2019-07-10 00:00:00'
        , REPLICATE('E', 25)    
        , REPLICATE('F', 25)    
        , REPLICATE('G', 30)    
        , REPLICATE('H', 10)    
        , REPLICATE('I', 120)   
        , REPLICATE('J', 4)     
        , REPLICATE('K', 75)    
        , 'L'       
        , REPLICATE('M', 50)    
        , REPLICATE('N', 128)   
        , REPLICATE('O', 50)    
        , 0
        , REPLICATE(CONVERT(varchar(max), 'c'), 90000)
);
--GO 100

;WITH dpa AS 
(
    SELECT dpa.*
        , page_free_space_percent_corrected = 
          CASE COALESCE(dpa.page_type_desc, N'')
            WHEN N'TEXT_MIX_PAGE' THEN 100 - COALESCE(dpa.page_free_space_percent, 100)
            WHEN N'TEXT_TREE_PAGE' THEN 100 - COALESCE(dpa.page_free_space_percent, 100)
            ELSE COALESCE(dpa.page_free_space_percent, 100)
          END
    FROM sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('dbo.MyTable'), NULL, NULL, 'DETAILED') dpa
)
, src AS
(
SELECT TotalKB = COUNT_BIG(1) * 8192 / 1024
    , FreeKB = SUM((dpa.page_free_space_percent_corrected / 100) * CONVERT(bigint, 8192)) / 1024
    , TotalPages = COUNT_BIG(1)
    , TotalEmptyPages = SUM(CASE WHEN dpa.page_free_space_percent_corrected = 100 THEN 1 ELSE 0 END) --completely empty pages
FROM dpa
)
SELECT *
    , BytesFreePercent = (CONVERT(decimal(38,2), src.FreeKB) / src.TotalKB) * 100
    , UnusedPagesPercent = (CONVERT(decimal(38,2), src.TotalEmptyPages) / src.TotalPages) * 100
FROM src

নিম্নলিখিত কোয়েরিতে সারণীতে বরাদ্দকৃত প্রতিটি পৃষ্ঠার জন্য একটি একক লাইন দেখায় এবং সেই একই অননুমোদিত DMV ব্যবহার করে:

SELECT DatabaseName = d.name
    , ObjectName = o.name
    , IndexName = i.name
    , PartitionID = dpa.partition_id
    , dpa.allocation_unit_type_desc
    , dpa.allocated_page_file_id
    , dpa.allocated_page_page_id
    , dpa.is_allocated
    , dpa.page_free_space_percent --this seems unreliable
    , page_free_space_percent_corrected = 
        CASE COALESCE(dpa.page_type_desc, N'')
        WHEN N'TEXT_MIX_PAGE' THEN 100 - COALESCE(dpa.page_free_space_percent, 100)
        WHEN N'TEXT_TREE_PAGE' THEN 100 - COALESCE(dpa.page_free_space_percent, 100)
        ELSE COALESCE(dpa.page_free_space_percent, 100)
        END
    , dpa.page_type_desc
    , dpa.is_page_compressed
    , dpa.has_ghost_records
FROM sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('dbo.MyTable'), NULL, NULL, 'DETAILED') dpa
    LEFT JOIN sys.databases d ON dpa.database_id = d.database_id
    LEFT JOIN sys.objects o ON dpa.object_id = o.object_id
    LEFT JOIN sys.indexes i ON dpa.object_id = i.object_id AND dpa.index_id = i.index_id
WHERE dpa.database_id = DB_ID() --sanity check for sys.objects and sys.indexes

আপনি যদি পরীক্ষার পরিবেশে এটি আপনার আসল টেবিলের বিপরীতে চালান তবে আউটপুটটি অনেকগুলি সারি দেখায় , তবে এটি আপনাকে সমস্যাটি দেখতে দেয়।

আপনি কি নীচের স্ক্রিপ্টটি চালাতে এবং আপনার প্রশ্নে ফলাফল পোস্ট করতে পারেন? আমি কেবল আমরা একই পৃষ্ঠায় রয়েছি তা নিশ্চিত করার চেষ্টা করছি।

SELECT ObjectName = s.name + N'.' + o.name
    , ReservedPageCount = SUM(dps.reserved_page_count)
    , UsePageCount = SUM(dps.used_page_count)
FROM sys.schemas s
    INNER JOIN sys.objects o ON s.schema_id = o.schema_id
    INNER JOIN sys.partitions p ON o.object_id = p.object_id
    INNER JOIN sys.dm_db_partition_stats dps ON p.object_id = dps.object_id
WHERE s.name = N'dbo'
    AND o.name = N'MyTable'
GROUP BY s.name + N'.' + o.name;

2
চলমান DBCC UPDATEUSAGEঅব্যবহৃত স্থান এবং অব্যবহৃত পৃষ্ঠা গণনা আপডেট করেছে। দেখে মনে হচ্ছে যে এসকিউএল সার্ভারের দ্বারা প্রতিবেদন করা ডিস্কের ব্যবহার এবং পৃষ্ঠার তথ্যটি অত্যন্ত সিঙ্কের বাইরে ছিল - আমি আমার পোস্টটি বিশদ সহ আপডেট করেছি। আমি প্রথমে এটি কীভাবে হত তা সম্পর্কে আগ্রহী, তবে কমপক্ষে সমস্যাটি পাওয়া গেল। আপনার সমস্ত সহায়তার জন্য আপনাকে ধন্যবাদ, আমি সত্যিই এটির প্রশংসা করি!
কেন

0

কলামগুলির মধ্যে একটি হ'ল এলওবি টাইপ ইমেজ, এবং এটি ফাইলগুলি স্টোর করে যা কিছু কেবি থেকে কয়েকশ এমবি আকারের আকারের হয়

আপনি অভ্যন্তরীণ খণ্ডিত হতে পারে। এই টেবিলের জন্য পৃষ্ঠা বিভাজন
কি ? এবং কি ইন-সারিটির জন্য খণ্ডগুলি অফ-সারি পৃষ্ঠাগুলির চেয়ে আলাদা?

আপনি বলছেন আপনার কাছে কয়েকটি কেবি ফাইল রয়েছে।
এসকিউএল সার্ভার 8060 বাইট পৃষ্ঠাগুলিতে সমস্ত কিছু সঞ্চয় করে। অর্থ, আপনার যদি একটি সারি (বা অফ-সারি ডেটা) থাকে যা 4040 বাইট এবং পরেরটি একই রকম হয় তবে এটি একই পৃষ্ঠায় উভয়ই ফিট করতে পারে না এবং আপনি আপনার অর্ধেক স্থান নষ্ট করবেন। ভিন্ন সারণীতে ভেরিয়েবল দৈর্ঘ্যের কলামগুলি (উদাহরণ হিসাবে চিত্রের সাথে শুরু করুন) সংরক্ষণ করে আপনার সারির আকার পরিবর্তন করার চেষ্টা করুন।


আমি মনে করি না খণ্ডন এটিই সমস্যা the সূচকগুলি পুনর্নির্মাণের পরে, ক্লাস্টারড ইনডেক্সের বিভাজন 0.45% এবং পৃষ্ঠার পূর্ণতা 98.93%।
কেন

আপনি যদি খুব বড় সারি বা LOB ডেটা ভুগেন যা 8KB পৃষ্ঠাগুলিতে ভালভাবে ফিট না করে তবে একটি সারণী বা সূচী পুনর্নির্মাণ সাহায্য করবে না। এটি ম্যাক্স ভার্নন আরও বিশদে ব্যাখ্যা করেছেন: "আপনার অনেকগুলি খালি পৃষ্ঠা রয়েছে" " এটিকে অভ্যন্তরীণ
খণ্ডনও

-3

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


4
পুনরুদ্ধারের মডেলটি আকর্ষণীয় Bring আমি মনে করি ওপিতে যদি তাদের লগ ফাইলের আকার নিয়ে সমস্যা হয় তবে এটি আরও প্রযোজ্য হবে। যেমনটি দাঁড়িয়েছে, তাদের ডেটা ফাইলের আকার নিয়ে সমস্যা হচ্ছে , তাই পুনরুদ্ধার মডেলটি যদি বর্ণনা করা সমস্যাটি সৃষ্টি করে তবে আমি অবাক হব।
জোশ ডার্নেল

সত্য তবে একমাত্র বার আমি সঙ্কুচিত হয়েছি এবং এটি স্থানটিতে সত্যিকার অর্থে প্রভাব ফেলেনি কারণ এটি পুনরুদ্ধারের মডেলটির কারণেই আমি ভেবেছিলাম যে এটি ভুল রোগ নির্ধারণের ক্ষেত্রে এটি সামনে আনার পক্ষে উপযুক্ত।
জন-হেনরি লচবাম

-3

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

ডাটাবেস তৈরির পরে সেট করা থাকে যা কেবলমাত্র তার প্রাথমিক আকার পর্যন্ত ডাটাবেস সঙ্কুচিত করুন


প্রশ্ন একটি ডাটাবেস মাপে (এবং যদি এটা ছিল, সঙ্কুচিত এটা প্রাথমিক আকার অঞ্চল পরে ব্যবহার স্থান উপর নির্ভর করে ক্ষমতা) সম্পর্কে না
eckes

যতক্ষণ অব্যবহৃত স্থান রয়েছে, মূল আকার নির্বিশেষে বেশ কয়েকটি এমবিতে ডাটাবেস সঙ্কুচিত করা সম্ভব। এটি অগত্যা একটি ভাল ধারণা নয় তবে ডেটাবেসগুলি সঙ্কুচিত করার জন্য আমার অনেকগুলি অনুষ্ঠান হয়েছিল এবং কখনও এর মতো সীমাতে চলে না।
রায়

-3

প্রোডাকশন বাক্সগুলিতে আমি আগে এই সমস্যার মুখোমুখি হয়েছি, আপনাকে যা করতে হবে তা প্রতিটি টেবিলের জন্য সারণী এবং সূচী পুনর্নির্মাণ করা (সেই ক্রমে)।

সারণীগুলিকে রাখার জন্য আমি যে প্রশ্নের ব্যবহার করি তা এখানে। এটি আপনাকে কোন টেবিলগুলি পুনরায় তৈরি করতে হবে তা নির্ধারণ করতে এবং আপনার চালিত হওয়া এসকিউএল কোয়েরি তৈরি করতে সহায়তা করবে। এই কোয়েরিটি 1MB এর চেয়ে বেশি অব্যবহৃত স্থান এবং 5% অব্যবহৃত অনুপাতের মধ্যে সীমাবদ্ধ, যাতে আপনার কেবলমাত্র সেই বিষয়টিকে পুনর্নির্মাণ করতে হবে যা আপনাকে সত্যই ফোকাস করতে হবে:

SELECT  'alter table [' + t.NAME + '] rebuild;' AS SQL1, 'alter index all on [' + t.NAME + '] rebuild;' as SQL2, t.NAME AS TableName, p.rows AS RowCounts, SUM(a.total_pages) * 8/1024 AS TotalSpaceMB,  SUM(a.used_pages) * 8/1024 AS UsedSpaceMB,  (SUM(a.total_pages) - SUM(a.used_pages)) * 8/1024 AS UnusedSpaceMB, case when SUM(a.total_pages)=0 then 0 else (SUM(a.total_pages) - SUM(a.used_pages))*100/SUM(a.total_pages) end as Ratio  FROM     sys.tables t (nolock) INNER JOIN       sys.indexes i (nolock)  ON t.OBJECT_ID = i.object_id INNER JOIN  sys.partitions p (nolock) ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN  sys.allocation_units a (nolock) ON p.partition_id = a.container_id LEFT OUTER JOIN  sys.schemas s (nolock) ON t.schema_id = s.schema_id WHERE  t.is_ms_shipped = 0 AND i.OBJECT_ID > 255  GROUP BY  t.Name, s.Name, p.Rows  
having  (SUM(a.total_pages) - SUM(a.used_pages)) * 8/1024>1
and (SUM(a.total_pages) - SUM(a.used_pages))*100/SUM(a.total_pages)>5
ORDER BY    5 desc

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