আমি বিভিন্ন পরিস্থিতিতে ন্যূনতম লগিং সন্নিবেশ পরীক্ষা করছি এবং আমি যা পড়েছি তা থেকে টব্লক এবং এসকিউএল সার্ভার 2016+ ব্যবহার করে একটি ক্লাস্টারযুক্ত সূচী দিয়ে একটি স্তূপের মধ্যে সন্নিবেশ নির্বাচন করুন যা আমার ক্ষেত্রে এটি করার সময় আমি পেয়ে যাচ্ছি সম্পূর্ণ লগিং। আমার ডাটাবেসটি সহজ পুনরুদ্ধারের মডেলটিতে রয়েছে এবং আমি সফলভাবে কোনও সূচি এবং ট্যাব্লক ছাড়াই একটি গাদাতে ন্যূনতমভাবে লগ ইনসার্টগুলি পাই get
আমি পরীক্ষার জন্য স্ট্যাক ওভারফ্লো ডাটাবেসের একটি পুরানো ব্যাকআপ ব্যবহার করছি এবং নিম্নলিখিত স্কিমা সহ পোস্ট টেবিলের একটি প্রতিলিপি তৈরি করেছি ...
CREATE TABLE [dbo].[PostsDestination](
[Id] [int] NOT NULL,
[AcceptedAnswerId] [int] NULL,
[AnswerCount] [int] NULL,
[Body] [nvarchar](max) NOT NULL,
[ClosedDate] [datetime] NULL,
[CommentCount] [int] NULL,
[CommunityOwnedDate] [datetime] NULL,
[CreationDate] [datetime] NOT NULL,
[FavoriteCount] [int] NULL,
[LastActivityDate] [datetime] NOT NULL,
[LastEditDate] [datetime] NULL,
[LastEditorDisplayName] [nvarchar](40) NULL,
[LastEditorUserId] [int] NULL,
[OwnerUserId] [int] NULL,
[ParentId] [int] NULL,
[PostTypeId] [int] NOT NULL,
[Score] [int] NOT NULL,
[Tags] [nvarchar](150) NULL,
[Title] [nvarchar](250) NULL,
[ViewCount] [int] NOT NULL
)
CREATE NONCLUSTERED INDEX ndx_PostsDestination_Id ON PostsDestination(Id)
আমি তখন এই টেবিলের মধ্যে পোস্ট টেবিলটি অনুলিপি করার চেষ্টা করি ...
INSERT INTO PostsDestination WITH(TABLOCK)
SELECT * FROM Posts ORDER BY Id
Fn_dblog এবং লগ ফাইলের ব্যবহার দেখে আমি দেখতে পাচ্ছি যে আমি এ থেকে ন্যূনতম লগিং পাচ্ছি না। আমি যে সংস্করণগুলি পড়েছি তা ২০১ read এর আগে পড়েছিলাম ট্রেড পতাকা 6১০ এর জন্য ন্যূনতমভাবে সূচিযুক্ত টেবিলগুলিতে লগ করার জন্য, আমি এটিও সেট করার চেষ্টা করেছি তবে এখনও কোনও আনন্দ নেই।
আমি অনুমান করছি আমি এখানে কিছু মিস করছি?
সম্পাদনা - আরও তথ্য
আরও তথ্য যুক্ত করতে আমি নিম্নলিখিত পদ্ধতিটি ব্যবহার করছি যা আমি ন্যূনতম লগিং সনাক্ত করার চেষ্টা করার জন্য লিখেছি, সম্ভবত আমার এখানে কিছু ভুল হয়েছে ...
/*
Example Usage...
EXEC sp_GetLogUseStats
@Sql = '
INSERT INTO PostsDestination
SELECT TOP 500000 * FROM Posts ORDER BY Id ',
@Schema = 'dbo',
@Table = 'PostsDestination',
@ClearData = 1
*/
CREATE PROCEDURE [dbo].[sp_GetLogUseStats]
(
@Sql NVARCHAR(400),
@Schema NVARCHAR(20),
@Table NVARCHAR(200),
@ClearData BIT = 0
)
AS
IF @ClearData = 1
BEGIN
TRUNCATE TABLE PostsDestination
END
/*Checkpoint to clear log (Assuming Simple/Bulk Recovery Model*/
CHECKPOINT
/*Snapshot of logsize before query*/
CREATE TABLE #BeforeLogUsed(
[Db] NVARCHAR(100),
LogSize NVARCHAR(30),
Used NVARCHAR(50),
Status INT
)
INSERT INTO #BeforeLogUsed
EXEC('DBCC SQLPERF(logspace)')
/*Run Query*/
EXECUTE sp_executesql @SQL
/*Snapshot of logsize after query*/
CREATE TABLE #AfterLLogUsed(
[Db] NVARCHAR(100),
LogSize NVARCHAR(30),
Used NVARCHAR(50),
Status INT
)
INSERT INTO #AfterLLogUsed
EXEC('DBCC SQLPERF(logspace)')
/*Return before and after log size*/
SELECT
CAST(#AfterLLogUsed.Used AS DECIMAL(12,4)) - CAST(#BeforeLogUsed.Used AS DECIMAL(12,4)) AS LogSpaceUsersByInsert
FROM
#BeforeLogUsed
LEFT JOIN #AfterLLogUsed ON #AfterLLogUsed.Db = #BeforeLogUsed.Db
WHERE
#BeforeLogUsed.Db = DB_NAME()
/*Get list of affected indexes from insert query*/
SELECT
@Schema + '.' + so.name + '.' + si.name AS IndexName
INTO
#IndexNames
FROM
sys.indexes si
JOIN sys.objects so ON si.[object_id] = so.[object_id]
WHERE
si.name IS NOT NULL
AND so.name = @Table
/*Insert Record For Heap*/
INSERT INTO #IndexNames VALUES(@Schema + '.' + @Table)
/*Get log recrod sizes for heap and/or any indexes*/
SELECT
AllocUnitName,
[operation],
AVG([log record length]) AvgLogLength,
SUM([log record length]) TotalLogLength,
COUNT(*) Count
INTO #LogBreakdown
FROM
fn_dblog(null, null) fn
INNER JOIN #IndexNames ON #IndexNames.IndexName = allocunitname
GROUP BY
[Operation], AllocUnitName
ORDER BY AllocUnitName, operation
SELECT * FROM #LogBreakdown
SELECT AllocUnitName, SUM(TotalLogLength) TotalLogRecordLength
FROM #LogBreakdown
GROUP BY AllocUnitName
নিম্নলিখিত কোড ব্যবহার করে কোনও সূচি এবং ট্যাব্লকবিহীন একটি গাদাতে প্রবেশ করা হচ্ছে ...
EXEC sp_GetLogUseStats
@Sql = '
INSERT INTO PostsDestination
SELECT * FROM Posts ORDER BY Id ',
@Schema = 'dbo',
@Table = 'PostsDestination',
@ClearData = 1
আমি এই ফলাফল পেতে
0.0024mb লগ ফাইলের বৃদ্ধি, খুব ছোট লগ রেকর্ড আকার এবং তাদের মধ্যে খুব কম আমি খুশি যে এটি ন্যূনতম লগিং ব্যবহার করছে।
আমি যদি তখন আইডি তে একটি ক্লাস্টারযুক্ত সূচক তৈরি করি ...
CREATE INDEX ndx_PostsDestination_Id ON PostsDestination(Id)
তারপরে আবার আমার একই সন্নিবেশ চালান ...
আমি নন-ক্লাস্টারড ইনডেক্সে ন্যূনতম লগিং পাচ্ছি না তবে আমি এটি হিটে হারিয়েছি। আরও কিছু পরীক্ষা করার পরে মনে হয় যদি আমি আইডি ক্লাস্টার তৈরি করি তবে এটি ন্যূনতমভাবে লগ করে তবে যা আমি ২০১০+ পড়েছি তা থেকে নকল ক্লাস্টারযুক্ত সূচকের সাথে নূন্যতম লগ করা উচিত যখন ট্যাবলক ব্যবহার করা হয়।
শেষ সম্পাদনা :
আমি এসকিউএল সার্ভার ইউজারওয়য়েসে মাইক্রোসফ্টের কাছে আচরণটির কথা জানিয়েছি এবং আমি কোনও প্রতিক্রিয়া পেলে আপডেট করব। আমি https://gavindraper.com/2018/05/29/SQL-Server- মিনিমাল- লগিং- ইনসার্টস / এ কাজ করতে পারি না এমন ন্যূনতম লগ দৃশ্যের পুরো বিবরণটিও লিখে রেখেছি