আমাদের এসকিউএল সার্ভার ২০০৮ আর 2 এ প্রতি রাতে আমাদের কিছু প্রতিবেদন করা দরকার। প্রতিবেদন গণনা করতে কয়েক ঘন্টা সময় লাগে। সময়টি সংক্ষিপ্ত করার জন্য আমরা একটি টেবিলকে পূর্বনির্ধারণ করি। এই সারণীটি 12 টি বড় (মিলিয়ন সারি দশক) টেবিলগুলিতে যোগদানের ভিত্তিতে তৈরি হয়েছে।
এই সমষ্টি টেবিলের গণনা কয়েক দিন আগে সিসিএ 4 ঘন্টা অবধি লেগেছিল। আমাদের ডিবিএ বিভাজনের চেয়ে এই বড় জোড়টিকে 3 টি ছোট ছোট জোনে (প্রতিটি অংশ 4 টি টেবিলে) যোগ দেয়। অস্থায়ী ফলাফল প্রতিবার একটি অস্থায়ী টেবিলের মধ্যে সংরক্ষণ করা হয়, যা পরবর্তী যোগদানের জন্য ব্যবহৃত হয়।
ডিবিএ বর্ধনের ফলস্বরূপ, সমষ্টি টেবিলটি 15 মিনিটের মধ্যে গণনা করা হয়। আমি ভাবলাম কীভাবে এটা সম্ভব? ডিবিএ আমাকে বলেছিল যে এটি কারণ সার্ভারের যে ডেটা প্রক্রিয়াকরণ করতে হবে তার সংখ্যা কম। অন্য কথায়, যে বড় আসলটিতে সার্ভারকে সংক্ষিপ্ত ছোট সংযুক্তির চেয়ে আরও বেশি ডেটা নিয়ে কাজ করতে হয়। তবে, আমি অনুমান করব যে অপ্টিমাইজারটি মূল বিড জোনের সাথে দক্ষতার সাথে এটি করার যত্ন নেবে, নিজেই যোগ দেয় এবং সামনের সংখ্যায় কেবলমাত্র কলামগুলি প্রেরণ করে।
অন্য যে জিনিসটি তিনি করেছেন তা হ'ল তিনি অস্থায়ী টেবিলগুলির একটিতে একটি সূচক তৈরি করেছিলেন। তবে, আমি আবারও ভাবব যে অপ্টিমাইজারটি প্রয়োজনে উপযুক্ত হ্যাশ টেবিল তৈরি করবে এবং সম্পূর্ণরূপে গণনাটি আরও ভাল করবে।
আমি আমাদের ডিবিএর সাথে এ বিষয়ে কথা বললাম, তবে প্রক্রিয়াজাতকরণের সময়কার উন্নতি কী ঘটবে সে সম্পর্কে তিনি নিজেই অনিশ্চিত ছিলেন। তিনি কেবল উল্লেখ করেছিলেন, তিনি সার্ভারকে দোষ দেবেন না কারণ এটি এত বড় ডেটা গণনা করা অপ্রতিরোধ্য হতে পারে এবং এটি সম্ভব যে সর্বোত্তম প্রয়োগের পরিকল্পনার পূর্বাভাস দিতে অপ্টিমাইজারের পক্ষে কঠিন সময় আছে ...। এটি আমি বুঝতে পারি, তবে ঠিক কী কারণে আমি তার আরও সংজ্ঞায়িত উত্তর পেতে চাই।
সুতরাং, প্রশ্নগুলি হ'ল:
কোনটি সম্ভবত বড় উন্নতির কারণ হতে পারে?
বড় যোগগুলিকে আরও ছোট করে ভাগ করা কি একটি আদর্শ প্রক্রিয়া?
একাধিক ছোট যোগদানের ক্ষেত্রে কোন সার্ভারের ডেটা প্রক্রিয়া করতে হবে তা কি সত্যিই ছোট?
এখানে মূল জিজ্ঞাসা:
Insert Into FinalResult_Base
SELECT
TC.TestCampaignContainerId,
TC.CategoryId As TestCampaignCategoryId,
TC.Grade,
TC.TestCampaignId,
T.TestSetId
,TL.TestId
,TSK.CategoryId
,TT.[TestletId]
,TL.SectionNo
,TL.Difficulty
,TestletName = Char(65+TL.SectionNo) + CONVERT(varchar(4),6 - TL.Difficulty)
,TQ.[QuestionId]
,TS.StudentId
,TS.ClassId
,RA.SubjectId
,TQ.[QuestionPoints]
,GoodAnswer = Case When TQ.[QuestionPoints] Is null Then 0
When TQ.[QuestionPoints] > 0 Then 1
Else 0 End
,WrongAnswer = Case When TQ.[QuestionPoints] = 0 Then 1
When TQ.[QuestionPoints] Is null Then 1
Else 0 End
,NoAnswer = Case When TQ.[QuestionPoints] Is null Then 1 Else 0 End
,TS.Redizo
,TT.ViewCount
,TT.SpentTime
,TQ.[Position]
,RA.SpecialNeeds
,[Version] = 1
,TestAdaptationId = TA.Id
,TaskId = TSK.TaskId
,TaskPosition = TT.Position
,QuestionRate = Q.Rate
,TestQuestionId = TQ.Guid
,AnswerType = TT.TestletAnswerTypeId
FROM
[TestQuestion] TQ WITH (NOLOCK)
Join [TestTask] TT WITH (NOLOCK) On TT.Guid = TQ.TestTaskId
Join [Question] Q WITH (NOLOCK) On TQ.QuestionId = Q.QuestionId
Join [Testlet] TL WITH (NOLOCK) On TT.TestletId = TL.Guid
Join [Test] T WITH (NOLOCK) On TL.TestId = T.Guid
Join [TestSet] TS WITH (NOLOCK) On T.TestSetId = TS.Guid
Join [RoleAssignment] RA WITH (NOLOCK) On TS.StudentId = RA.PersonId And RA.RoleId = 1
Join [Task] TSK WITH (NOLOCK) On TSK.TaskId = TT.TaskId
Join [Category] C WITH (NOLOCK) On C.CategoryId = TSK.CategoryId
Join [TimeWindow] TW WITH (NOLOCK) On TW.Id = TS.TimeWindowId
Join [TestAdaptation] TA WITH (NOLOCK) On TA.Id = TW.TestAdaptationId
Join [TestCampaign] TC WITH (NOLOCK) On TC.TestCampaignId = TA.TestCampaignId
WHERE
T.TestTypeId = 1 -- eliminuji ankety
And t.ProcessedOn is not null -- ne vsechny, jen dokoncene
And TL.ShownOn is not null
And TS.Redizo not in (999999999, 111111119)
END;
নতুন বিভক্ত ডিবিএ দুর্দান্ত কাজের পরে যোগ দেয়:
SELECT
TC.TestCampaignContainerId,
TC.CategoryId As TestCampaignCategoryId,
TC.Grade,
TC.TestCampaignId,
T.TestSetId
,TL.TestId
,TL.SectionNo
,TL.Difficulty
,TestletName = Char(65+TL.SectionNo) + CONVERT(varchar(4),6 - TL.Difficulty) -- prevod na A5, B4, B5 ...
,TS.StudentId
,TS.ClassId
,TS.Redizo
,[Version] = 1 -- ?
,TestAdaptationId = TA.Id
,TL.Guid AS TLGuid
,TS.TimeWindowId
INTO
[#FinalResult_Base_1]
FROM
[TestSet] [TS] WITH (NOLOCK)
JOIN [Test] [T] WITH (NOLOCK)
ON [T].[TestSetId] = [TS].[Guid] AND [TS].[Redizo] NOT IN (999999999, 111111119) AND [T].[TestTypeId] = 1 AND [T].[ProcessedOn] IS NOT NULL
JOIN [Testlet] [TL] WITH (NOLOCK)
ON [TL].[TestId] = [T].[Guid] AND [TL].[ShownOn] IS NOT NULL
JOIN [TimeWindow] [TW] WITH (NOLOCK)
ON [TW].[Id] = [TS].[TimeWindowId] AND [TW].[IsActive] = 1
JOIN [TestAdaptation] [TA] WITH (NOLOCK)
ON [TA].[Id] = [TW].[TestAdaptationId] AND [TA].[IsActive] = 1
JOIN [TestCampaign] [TC] WITH (NOLOCK)
ON [TC].[TestCampaignId] = [TA].[TestCampaignId] AND [TC].[IsActive] = 1
JOIN [TestCampaignContainer] [TCC] WITH (NOLOCK)
ON [TCC].[TestCampaignContainerId] = [TC].[TestCampaignContainerId] AND [TCC].[IsActive] = 1
;
SELECT
FR1.TestCampaignContainerId,
FR1.TestCampaignCategoryId,
FR1.Grade,
FR1.TestCampaignId,
FR1.TestSetId
,FR1.TestId
,TSK.CategoryId AS [TaskCategoryId]
,TT.[TestletId]
,FR1.SectionNo
,FR1.Difficulty
,TestletName = Char(65+FR1.SectionNo) + CONVERT(varchar(4),6 - FR1.Difficulty) -- prevod na A5, B4, B5 ...
,FR1.StudentId
,FR1.ClassId
,FR1.Redizo
,TT.ViewCount
,TT.SpentTime
,[Version] = 1 -- ?
,FR1.TestAdaptationId
,TaskId = TSK.TaskId
,TaskPosition = TT.Position
,AnswerType = TT.TestletAnswerTypeId
,TT.Guid AS TTGuid
INTO
[#FinalResult_Base_2]
FROM
#FinalResult_Base_1 FR1
JOIN [TestTask] [TT] WITH (NOLOCK)
ON [TT].[TestletId] = [FR1].[TLGuid]
JOIN [Task] [TSK] WITH (NOLOCK)
ON [TSK].[TaskId] = [TT].[TaskId] AND [TSK].[IsActive] = 1
JOIN [Category] [C] WITH (NOLOCK)
ON [C].[CategoryId] = [TSK].[CategoryId]AND [C].[IsActive] = 1
;
DROP TABLE [#FinalResult_Base_1]
CREATE NONCLUSTERED INDEX [#IX_FR_Student_Class]
ON [dbo].[#FinalResult_Base_2] ([StudentId],[ClassId])
INCLUDE ([TTGuid])
SELECT
FR2.TestCampaignContainerId,
FR2.TestCampaignCategoryId,
FR2.Grade,
FR2.TestCampaignId,
FR2.TestSetId
,FR2.TestId
,FR2.[TaskCategoryId]
,FR2.[TestletId]
,FR2.SectionNo
,FR2.Difficulty
,FR2.TestletName
,TQ.[QuestionId]
,FR2.StudentId
,FR2.ClassId
,RA.SubjectId
,TQ.[QuestionPoints] -- 1+ good, 0 wrong, null no answer
,GoodAnswer = Case When TQ.[QuestionPoints] Is null Then 0
When TQ.[QuestionPoints] > 0 Then 1 -- cookie
Else 0 End
,WrongAnswer = Case When TQ.[QuestionPoints] = 0 Then 1
When TQ.[QuestionPoints] Is null Then 1
Else 0 End
,NoAnswer = Case When TQ.[QuestionPoints] Is null Then 1 Else 0 End
,FR2.Redizo
,FR2.ViewCount
,FR2.SpentTime
,TQ.[Position] AS [QuestionPosition]
,RA.SpecialNeeds -- identifikace SVP
,[Version] = 1 -- ?
,FR2.TestAdaptationId
,FR2.TaskId
,FR2.TaskPosition
,QuestionRate = Q.Rate
,TestQuestionId = TQ.Guid
,FR2.AnswerType
INTO
[#FinalResult_Base]
FROM
[#FinalResult_Base_2] FR2
JOIN [TestQuestion] [TQ] WITH (NOLOCK)
ON [TQ].[TestTaskId] = [FR2].[TTGuid]
JOIN [Question] [Q] WITH (NOLOCK)
ON [Q].[QuestionId] = [TQ].[QuestionId] AND [Q].[IsActive] = 1
JOIN [RoleAssignment] [RA] WITH (NOLOCK)
ON [RA].[PersonId] = [FR2].[StudentId]
AND [RA].[ClassId] = [FR2].[ClassId] AND [RA].[IsActive] = 1 AND [RA].[RoleId] = 1
drop table #FinalResult_Base_2;
truncate table [dbo].[FinalResult_Base];
insert into [dbo].[FinalResult_Base] select * from #FinalResult_Base;
drop table #FinalResult_Base;
READCOMMITTED
? আমি এর আগে আর কখনও দেখিনি IT