অনেকের সাথে এসকিউএল কোয়েরি বিভক্ত করা আরও ছোটদের সাথে যোগ দেয়?


18

আমাদের এসকিউএল সার্ভার ২০০৮ আর 2 এ প্রতি রাতে আমাদের কিছু প্রতিবেদন করা দরকার। প্রতিবেদন গণনা করতে কয়েক ঘন্টা সময় লাগে। সময়টি সংক্ষিপ্ত করার জন্য আমরা একটি টেবিলকে পূর্বনির্ধারণ করি। এই সারণীটি 12 টি বড় (মিলিয়ন সারি দশক) টেবিলগুলিতে যোগদানের ভিত্তিতে তৈরি হয়েছে।

এই সমষ্টি টেবিলের গণনা কয়েক দিন আগে সিসিএ 4 ঘন্টা অবধি লেগেছিল। আমাদের ডিবিএ বিভাজনের চেয়ে এই বড় জোড়টিকে 3 টি ছোট ছোট জোনে (প্রতিটি অংশ 4 টি টেবিলে) যোগ দেয়। অস্থায়ী ফলাফল প্রতিবার একটি অস্থায়ী টেবিলের মধ্যে সংরক্ষণ করা হয়, যা পরবর্তী যোগদানের জন্য ব্যবহৃত হয়।

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

অন্য যে জিনিসটি তিনি করেছেন তা হ'ল তিনি অস্থায়ী টেবিলগুলির একটিতে একটি সূচক তৈরি করেছিলেন। তবে, আমি আবারও ভাবব যে অপ্টিমাইজারটি প্রয়োজনে উপযুক্ত হ্যাশ টেবিল তৈরি করবে এবং সম্পূর্ণরূপে গণনাটি আরও ভাল করবে।

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

সুতরাং, প্রশ্নগুলি হ'ল:

  1. কোনটি সম্ভবত বড় উন্নতির কারণ হতে পারে?

  2. বড় যোগগুলিকে আরও ছোট করে ভাগ করা কি একটি আদর্শ প্রক্রিয়া?

  3. একাধিক ছোট যোগদানের ক্ষেত্রে কোন সার্ভারের ডেটা প্রক্রিয়া করতে হবে তা কি সত্যিই ছোট?

এখানে মূল জিজ্ঞাসা:

    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;

3
সতর্কতার একটি শব্দ - উইথ (নলক) অশুভ - এর ফলে খারাপ ডেটা ফিরে আসতে পারে। আমি পরামর্শ দিয়ে পরামর্শ দিচ্ছি (রাউকমিটেড)।
টমটম

1
@ টমটম আপনার অর্থ কি READCOMMITTED? আমি এর আগে আর কখনও দেখিনি IT
ypercubeᵀᴹ

4
উইথ (নোলক) মন্দ নয়। এটি কেবল যাদুর বুলেট নয় যা লোকেদের মনে হয় এটি। এসকিউএল সার্ভারের বেশিরভাগ জিনিসের মতো এবং সাধারণভাবে সফ্টওয়্যার বিকাশের এটির স্থান রয়েছে।
জেন

2
হ্যাঁ, তবে এই যে NOLOCK লগ-এ সতর্কতা তৈরি করতে পারে এবং আরও গুরুত্বপূর্ণ - ভুল ডেটা ফিরিয়ে দিতে পারে, আমি এটিকে মন্দ বলে বিবেচনা করি। এটি কেবলমাত্র টেবিলগুলিতে ব্যবহারযোগ্য, ক্যোরিটি চলাকালীন প্রাথমিক কী এবং নির্বাচিত কীগুলিতে পরিবর্তন না করার গ্যারান্টিযুক্ত। এবং হ্যাঁ, আমি পুনঃসংশ্লিষ্ট, দুঃখিত।
টমটম

উত্তর:


11

1 'সার্চ স্পেস', অন্তর্বর্তী জন্য ভালো পরিসংখ্যান সঙ্গে মিলিত হ্রাস / পরে যোগ দিয়েছেন।

আমাকে ৯০-টেবিলের সাথে যোগ দিতে হবে (মিকি মাউস ডিজাইন) যেখানে ক্যোয়ারী প্রসেসর এমনকি একটি পরিকল্পনা তৈরি করতে অস্বীকার করেছিল। প্রতিটি 9 টি টেবিলের 10 টি সাবজয়িনে এ জাতীয় যোগদানকে ভেঙে নাটকীয়ভাবে প্রতিটি যোগদানের জটিলতা হ্রাস পেয়েছে, যা প্রতিটি অতিরিক্ত টেবিলের সাথে তাত্পর্যপূর্ণভাবে বৃদ্ধি পায়। প্লাস দ্য কুইরি অপটিমাইজার তাদের এখন 10 টি পরিকল্পনা হিসাবে বিবেচনা করে, সামগ্রিকভাবে আরও বেশি সময় ব্যয় করে (সম্ভাব্যভাবে) (পল হোয়াইট এমনকি মেট্রিক থাকতে পারে!)।

মধ্যবর্তী ফলাফলের টেবিলগুলিতে এখন তাদের নিজস্ব নতুন নতুন পরিসংখ্যান থাকবে, এটি গভীর গাছের পরিসংখ্যানের তুলনায় অনেক ভাল যোগদান করবে যা শীঘ্রই স্কিউ হয়ে যায় এবং এর পরে বিজ্ঞান কথাসাহিত্য হিসাবে শেষ হয়।

এছাড়াও আপনি প্রথমে সবচেয়ে বেছে বেছে যোগদান করতে বাধ্য করতে পারেন, গাছের উপরে উঠে যাওয়া ডেটা ভলিউমগুলি কেটে ফেলুন। যদি আপনি আপনার পূর্বাভাসগুলির নির্বাচকতাটি অপটিমাইজারের চেয়ে অনেক বেশি ভালভাবে অনুমান করতে পারেন তবে কেন যোগদানের আদেশকে জোর করবেন না। "বুশি প্ল্যানস" সন্ধানের জন্য উপযুক্ত হতে পারে।

2 এটা করা উচিত , আমার দৃশ্যে বিবেচনা করা যেতে যদি দক্ষতা এবং কর্মক্ষমতা গুরুত্বপূর্ণ

3 অগত্যা নয়, তবে এটি হতে পারে যদি সর্বাধিক নির্বাচিত যোগদানগুলি তাড়াতাড়ি চালানো হয়


3
+1 ধন্যবাদ বিশেষত আপনার অভিজ্ঞতার বর্ণনার জন্য। এই কথাটি বলার ক্ষেত্রে খুব সত্য "আপনি যদি নিজের পূর্বাভাসগুলির নির্বাচনগুলির অনুমান করতে পারেন তবে অপটিমাইজারের তুলনায় আরও ভাল, কেন যোগদানের ক্রমটি বাধ্য করবেন না।"
ওন্দ্রেজ পিটারকা

2
এটি আসলে একটি খুব বৈধ প্রশ্ন। 90-টেবিলের জোড়কে কেবল 'ফোর্স অর্ডার' বিকল্পটি ব্যবহার করে কোনও পরিকল্পনা তৈরি করতে বাধ্য করা যেতে পারে। অর্ডারটি সম্ভবত এলোমেলো এবং সাবমোটিমাল ছিল তাতে কিছু যায় আসে না, কেবলমাত্র অনুসন্ধানের জায়গা হ্রাস করা অপ্টিমাইজারকে কয়েক সেকেন্ডের মধ্যে একটি পরিকল্পনা তৈরি করতে সহায়তা করার জন্য যথেষ্ট ছিল (ইঙ্গিত ছাড়াই এটি 20 সেকেন্ড পরে শেষ হবে)।
জন অ্যালান

6
  1. এসকিউএল সার্ভার অপ্টিমাইজার সাধারণত একটি ভাল কাজ করে। যাইহোক, এর লক্ষ্যটি সম্ভাব্য সর্বোত্তম পরিকল্পনা উত্পন্ন করা নয়, যা দ্রুত যথেষ্ট ভাল পরিকল্পনাটি সন্ধান করা। অনেকগুলিতে যোগদানের সাথে একটি নির্দিষ্ট প্রশ্নের জন্য এটি খুব খারাপ পারফরম্যান্সের কারণ হতে পারে। প্রকৃত বাস্তবায়ন পরিকল্পনার মধ্যে এ জাতীয় কেসটির অনুমান এবং প্রকৃত সংখ্যাগুলির মধ্যে বড় পার্থক্যের ভাল ইঙ্গিত। এছাড়াও, আমি নিশ্চিত যে প্রাথমিক ক্যোয়ারির জন্য এক্সিকিউশন পরিকল্পনাটি অনেকগুলি 'নেস্টেড লুপগুলিতে যোগদান করবে' দেখায় যা 'মার্জ জয়েন' এর চেয়ে ধীর। দ্বিতীয়টির জন্য উভয় ইনপুট একই কী ব্যবহার করে বাছাই করা প্রয়োজন, যা ব্যয়বহুল এবং সাধারণত অপ্টিমাইজার এ জাতীয় বিকল্পটি বাতিল করে দেয়। অস্থায়ী সারণীতে ফলাফল সংরক্ষণ এবং যথাযথ সূচিপত্র যুক্ত করার সাথে আপনি যেমন ফলাফল করেছেন - আমার অনুমান- আরও যোগ দেওয়ার জন্য আরও ভাল অ্যালগরিদম বেছে নেওয়ার ক্ষেত্রে (পাশের নোট - আপনি প্রথমে টেম্প টেবিলটি বসিয়ে সেরা অনুশীলনগুলি অনুসরণ করেন, এবং এরপরে সূচকগুলি যুক্ত করুন)। এছাড়াও, এসকিউএল সার্ভার অস্থায়ী সারণীর জন্য পরিসংখ্যান তৈরি করে এবং রাখে যা যথাযথ সূচক নির্বাচন করতে সহায়তা করে।
  2. আমি বলতে পারি না যে অস্থায়ী টেবিলগুলি ব্যবহারের বিষয়ে একটি মান আছে যখন কিছু নির্দিষ্ট সংখ্যার সাথে যোগ দেওয়ার সংখ্যা থাকে তবে এটি অবশ্যই একটি বিকল্প যা পারফরম্যান্সকে উন্নত করতে পারে। এটি প্রায়শই ঘটে না, তবে আমার বেশ কয়েকবার একই সমস্যা (এবং একই সমাধান) হয়েছিল। বিকল্পভাবে, আপনি নিজেরাই সেরা নির্বাহী পরিকল্পনাটি নিজে আবিষ্কার করার চেষ্টা করতে পারেন, এটি পুনরায় ব্যবহার করে সঞ্চয় এবং জোর করতে পারেন তবে এতে প্রচুর পরিমাণ সময় লাগবে (আপনি সফল হতে পারবেন না 100% গ্যারান্টিযুক্ত)। অন্য পক্ষের নোট - যদি অস্থায়ী টেবিলটিতে থাকা ফলাফলসত্তা তুলনামূলকভাবে ছোট হয় (10 কে রেকর্ড সম্পর্কে বলুন) সারণী ভেরিয়েবলটি টেম্প টেবিলের চেয়ে ভাল সম্পাদন করে।
  3. আমি 'যে নির্ভর করে' বলাকে ঘৃণা করি, তবে এটি সম্ভবত আপনার তৃতীয় প্রশ্নের আমার উত্তর। অপ্টিমাইজারকে দ্রুত ফলাফল দিতে হবে; আপনি চান না যে এটি সর্বোত্তম পরিকল্পনাটি বের করার চেষ্টা করে ঘন্টা ব্যয় করা উচিত; প্রতিটি যোগদান অতিরিক্ত কাজ যোগ করে, এবং কখনও কখনও অপ্টিমাইজার 'বিভ্রান্ত হয়ে যায়'।

3
নিশ্চিতকরণ এবং ব্যাখ্যার জন্য +1 ধন্যবাদ। আপনি যা লিখেছেন তা বোধগম্য।
ওন্দ্রেজ পিটারকা

4

ঠিক আছে, আমাকে এই বলে শুরু করতে দাও যে আপনি ছোট ডেটাতে কাজ করেন - 10 মিলিয়ন মিলিয়ন বড় নয়। আমার সর্বশেষ ডিডাব্লুএইচ প্রজেক্টটি ফ্যাক্ট টেবিলটিতে 400 মিলিয়ন সারি যুক্ত হয়েছিল। প্রতিদিন. 5 বছরের জন্য স্টোরেজ।

সমস্যাটি আংশিকভাবে হার্ডওয়্যার। যেহেতু বড় সংখ্যক লোকেরা প্রচুর অস্থায়ী স্থান ব্যবহার করতে পারে এবং কেবলমাত্র প্রচুর র‍্যাম থাকে, আপনি যখন ডিস্কের জিনিসগুলিতে উপচে পড়েন সেই মুহুর্তটি অনেক ধীর হয়ে যায়। যেমনটি, এসকিউএল সেটগুলির বিশ্বে বাস করে এবং আকারের যত্ন করে না, কারণ আপনি যে সার্ভারটি চালাচ্ছেন তা অসীম নয় কারণ এই কাজটি ছোট ছোট ভাগে ভাগ করে নেওয়া বোধগম্য হতে পারে। কিছু অপারেশন চলাকালীন আমি 64gb টেম্পডিবির স্থান ত্রুটিগুলি থেকে বেরিয়ে আসার জন্য বেশ ব্যবহৃত।

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

লক করার বিষয়টিও রয়েছে - আপনি যদি প্রোগ্রাম না করেন যে বড় আকারের যোগটি কয়েক ঘন্টা টেবিলটি লক করতে পারে। আমি এই মুহুর্তে 200 জিবি অনুলিপি অপারেশন করছি, এবং আমি তাদের ব্যবসায়ের কী (কার্যকরভাবে লুপিং) দ্বারা স্মাইলার পার্টিতে বিভক্ত করছি যা লকগুলি আরও কম রাখে।

শেষে, আমরা সীমিত হার্ডওয়্যার দিয়ে কাজ করি।


1
আপনার উত্তরের জন্য +1 ধন্যবাদ। এটি এইচডব্লিউর উপর নির্ভর করে বলার ভাল পয়েন্ট রয়েছে। আমাদের কাছে মাত্র 32 গিগাবাইট র‌্যাম রয়েছে যা সম্ভবত পর্যাপ্ত নয়।
ওন্দ্রেজ পিটারকা

2
প্রতিবার আমি এর মতো উত্তরগুলি পড়তে গিয়ে আমি কিছুটা হতাশ হয়ে পড়েছি - কয়েক মিলিয়ন সারিও কয়েক ঘন্টা ধরে আমাদের ডাটাবেস সার্ভারে সিপিইউ লোড তৈরি করে। হতে পারে মাত্রার সংখ্যা বেশি তবে 30 টি মাত্রা খুব বড় সংখ্যা বলে মনে হচ্ছে না। আমি মনে করি আপনি যে সারিগুলি প্রক্রিয়া করতে পারেন তার খুব বেশি সংখ্যক সরল মডেল। আরও খারাপ: পুরো ডেটা র‍্যামের সাথে ফিট করে। এবং এখনও ঘন্টা লাগে।
flaschenpost

1
30 টি মাত্রা একটি লট - আপনি কি মডেলটি যথাযথভাবে একটি তারাতে অনুকূলিত হয়েছেন? উদাহরণস্বরূপ কিছু ভুল যে সিপিইউয়ের জন্য ব্যয় করেছে - ওপি ক্যোয়ারিতে জিইউইডিটিকে প্রাথমিক কী হিসাবে ব্যবহার করা হচ্ছে (অনন্য পরিচয়কারী)। আমি তাদেরও ভালবাসি - অনন্য সূচক হিসাবে, প্রাথমিক কীটি একটি আইডি ক্ষেত্র, পুরো তুলনাটি দ্রুত করে তোলে এবং সূচি আরও নওবক্স (4 বা 8 বাইট, 18 নয়)। এর মতো কৌশলগুলি একটি টন সিপিইউ সংরক্ষণ করে।
টমটম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.