2,135,044,521 সারি টেবিলের উপর সূচকটি অপ্টিমাইজ করুন


10

বড় টেবিলের সাথে আমার আই / ও সমস্যা আছে।

সাধারণ পরিসংখ্যান

সারণীতে নিম্নলিখিত প্রধান বৈশিষ্ট্য রয়েছে:

  • পরিবেশ: অ্যাজুর এসকিউএল ডাটাবেস (স্তরটি পি 4 প্রিমিয়াম (500 টিটিইউস))
  • সারি: 2,135,044,521
  • 1,275 টি ব্যবহৃত পার্টিশন
  • ক্লাস্টারড এবং পার্টিশনযুক্ত সূচক

মডেল

এটি টেবিল বাস্তবায়ন:

CREATE TABLE [data].[DemoUnitData](
    [UnitID] [bigint] NOT NULL,
    [Timestamp] [datetime] NOT NULL,
    [Value1] [decimal](18, 2) NULL,
    [Value2] [decimal](18, 2) NULL,
    [Value3] [decimal](18, 2) NULL,
    CONSTRAINT [PK_DemoUnitData] PRIMARY KEY CLUSTERED 
    (
        [UnitID] ASC,
        [Timestamp] ASC
    )
)
GO

ALTER TABLE [data].[DemoUnitData] WITH NOCHECK ADD CONSTRAINT [FK_DemoUnitData_Unit] FOREIGN KEY([UnitID])
REFERENCES [model].[Unit] ([ID])
GO

ALTER TABLE [data].[DemoUnitData] CHECK CONSTRAINT [FK_DemoUnitData_Unit]
GO

বিভাজন এর সাথে সম্পর্কিত:

CREATE PARTITION SCHEME [DailyPartitionSchema] AS PARTITION [DailyPartitionFunction] ALL TO ([PRIMARY])

CREATE PARTITION FUNCTION [DailyPartitionFunction] (datetime) AS RANGE RIGHT
FOR VALUES (N'2017-07-25T00:00:00.000', N'2017-07-26T00:00:00.000', N'2017-07-27T00:00:00.000', ... )

সেবার মান

আমি মনে করি ইনডেক্স এবং পরিসংখ্যানগুলি প্রতি রাতে ইনক্রিমেন্টাল পুনর্নির্মাণ / পুনর্গঠন / আপডেট দ্বারা ভালভাবে বজায় রাখা হয়েছে।

এগুলি সর্বাধিক ব্যবহৃত ব্যবহৃত সূচক পার্টিশনের বর্তমান সূচী পরিসংখ্যান:

পার্টিশনের পরিসংখ্যান

এগুলি সর্বাধিক ব্যবহৃত ব্যবহৃত পার্টিশনের বর্তমান পরিসংখ্যান বৈশিষ্ট্য:

পরিসংখ্যান

সমস্যা

আমি টেবিলের বিপরীতে উচ্চ ফ্রিকোয়েন্সিতে একটি সাধারণ ক্যোয়ারী চালাচ্ছি।

SELECT [UnitID]
    ,[Timestamp]
    ,[Value1]
    ,[Value2]
    ,[Value3]
FROM [data].[DemoUnitData]
WHERE [UnitID] = 8877 AND [Timestamp] >= '2018-03-01' AND [Timestamp] < '2018-03-13'
OPTION (MAXDOP 1)

গণনা ছাড়াই

কার্যকর করার পরিকল্পনাটি এর মতো দেখাচ্ছে: https://www.brentozar.com/pastetheplan/?id=rJvI_4TtG

আমার সমস্যা হ'ল এই অনুসন্ধানগুলি আই / ও অপারেশনের একটি অত্যন্ত উচ্চ পরিমাণে উত্পাদন করে যার ফলে PAGEIOLATCH_SHঅপেক্ষা করতে বাধা দেয় ।

শীর্ষ অপেক্ষা

প্রশ্ন

আমি পড়েছি PAGEIOLATCH_SHঅপেক্ষাগুলি প্রায়শই ভাল-অনুকূলিতকরণের সূচকগুলির সাথে সম্পর্কিত। আই / ও ক্রিয়াকলাপ কীভাবে হ্রাস করবেন তা সম্পর্কে আমার কাছে কোনও সুপারিশ রয়েছে? আরও ভাল একটি সূচক যোগ করে?


উত্তর 1 - @ এস 4 ভি 1 এন এর মন্তব্য সম্পর্কিত

পোস্ট করা ক্যোয়ারী পরিকল্পনাটি এসএসএমএসে আমি কার্যকর করা একটি কোয়েরি থেকে হয়েছিল। আপনার মন্তব্যের পরে আমি সার্ভারের ইতিহাস নিয়ে কিছু গবেষণা করি। পরিষেবা থেকে অতিক্রম করা প্রকৃত ক্যোয়ারীটি কিছুটা আলাদা দেখায় (এন্টি ফ্রেমওয়ার্ক সম্পর্কিত)।

(@p__linq__0 bigint,@p__linq__1 datetime2(7),@p__linq__2 datetime2(7)) 

SELECT 1 AS [C1], [Extent1] 
   .[Timestamp] AS [Timestamp], [Extent1] 
   .[Value1] AS [Value1], [Extent1] 
   .[Value2] AS [Value2], [Extent1] 
   .[Value3] AS [Value3]  
FROM [data].[DemoUnitData] AS [Extent1]  
WHERE ([Extent1].[UnitID] = @p__linq__0)  
AND ([Extent1].[Timestamp] >= @p__linq__1)  
AND ([Extent1].[Timestamp] < @p__linq__2) OPTION (MAXDOP 1) 

এছাড়াও, পরিকল্পনাটি অন্যরকম দেখাচ্ছে:

https://www.brentozar.com/pastetheplan/?id=H1fhALpKG

অথবা

https://www.brentozar.com/pastetheplan/?id=S1DFQvpKz

এবং আপনি এখানে দেখতে পাচ্ছেন, আমাদের ডিবি পারফরম্যান্স এই কোয়েরি দ্বারা খুব সম্ভবত প্রভাবিত।

শীর্ষ এসকিউএল

উত্তর 2 - @ জো ওবিশের উত্তর সম্পর্কিত

সমাধানটি পরীক্ষার জন্য আমি এন্টি ফ্রেমওয়ার্ককে একটি সাধারণ স্কেলকম্যান্ডের সাথে প্রতিস্থাপন করেছি। ফলাফল ছিল একটি আশ্চর্যজনক পারফরম্যান্স উত্সাহ!

ক্যোয়ারী প্ল্যান এখন এসএসএমএসের মতো এবং লজিক্যাল পড়া এবং লেখার জন্য নির্ধারণের জন্য ~ 8 এ নেমে আসে।

সামগ্রিক আই / ও লোড প্রায় 0 এ নেমে গেছে! আই / ও ড্রপ

এটিও ব্যাখ্যা করে যে আমি পার্টিশনের পরিসীমা মাসিক থেকে প্রতিদিন পরিবর্তনের পরে কেন আমি বড় পারফরম্যান্স ড্রপ পাই। পার্টিশন নির্মূলের অনুপস্থিতির ফলে আরও বেশি পার্টিশন স্ক্যান হতে পারে।


2
এক্সিকিউশন প্ল্যানটি দেখে, সেই ক্যোয়ারীটি মোটেও সমস্যাযুক্ত বলে মনে হচ্ছে না t এটি কেবলমাত্র কম পার্টির সাথে প্রয়োজনীয় পার্টিশনগুলি স্ক্যান করেছে এবং এটির পরিবর্তে পেইজিওলেট_শ অপেক্ষা (সোস_স্কেড ..) রিপোর্ট করে নি। যা বোধগম্য কারণ আপনার কোনও শারীরিক পড়া নেই had এই সংশ্লেষকরা কি অপেক্ষা করছে, বা নির্দিষ্ট সময় ব্যয় করেছে? সর্বোপরি সমস্যাটি কিছু অন্য কোয়েরি।
এস

আমি উপরে আপনার কাছে @ এস 4 ভি 1 এন এর বিস্তারিত উত্তর পোস্ট করেছি
স্টিফেন ম্যানগোল্ড

উত্তর:


7

আপনি PAGEIOLATCH_SHযদি ওআরএম দ্বারা উত্পন্ন ডেটা ধরণের পরিবর্তন করতে সক্ষম হন তবে আপনি এই ক্যোয়ারির জন্য অপেক্ষাগুলি হ্রাস করতে সক্ষম হতে পারেন। Timestampআপনার টেবিল কলাম একটি ডাটা টাইপ আছে DATETIMEকিন্তু পরামিতি @p__linq__1এবং @p__linq__2ডাটা ধরনের DATETIME2(7)। এই পার্থক্যটি হ'ল ওআরএম ক্যোয়ারীগুলির জন্য ক্যোয়ারী প্ল্যানটি আপনার প্রথম পোস্ট করা ক্যোয়ারী পরিকল্পনার চেয়ে জটিল যে আপনি হার্ডকডযুক্ত অনুসন্ধানের ফিল্টারগুলি রেখেছিলেন than এক্সএমএলে আপনি এটির একটি ইঙ্গিত পেতে পারেন:

<ScalarOperator ScalarString="GetRangeWithMismatchedTypes([@p__linq__1],NULL,(22))">

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

আমি নিশ্চিত হতে একটি সহজ প্রজনন করেছি। পার্টিশন ফাংশনের মধ্যে 11 টি পার্টিশন নির্ধারণ করা হয়েছে। এই প্রশ্নের জন্য:

DECLARE @p__linq__0 bigint = 2000;
DECLARE @p__linq__1 datetime2(7) = '20180103';
DECLARE @p__linq__2 datetime2(7) = '20180104';

SELECT 1 AS [C1]
, [Extent1].[Timestamp] AS [Timestamp]
, [Extent1].[Value1] AS [Value1]
FROM [DemoUnitData] AS [Extent1]  
WHERE ([Extent1].[UnitID] = @p__linq__0)  
AND ([Extent1].[Timestamp] >= @p__linq__1)  
AND ([Extent1].[Timestamp] < @p__linq__2)
OPTION (MAXDOP 1) ;

আইও দেখতে দেখতে এখানে কী:

সারণী 'ডেমোউনিটডাটা'। স্ক্যানের গণনা 11, যৌক্তিক 40 টি পড়ে

আমি যখন ডেটা প্রকারগুলি ঠিক করি:

DECLARE @p__linq__0 bigint = 2000;
DECLARE @p__linq__1 datetime = '20180103';
DECLARE @p__linq__2 datetime = '20180104';

SELECT 1 AS [C1]
, [Extent1].[Timestamp] AS [Timestamp]
, [Extent1].[Value1] AS [Value1]
FROM [DemoUnitData] AS [Extent1]  
WHERE ([Extent1].[UnitID] = @p__linq__0)  
AND ([Extent1].[Timestamp] >= @p__linq__1)  
AND ([Extent1].[Timestamp] < @p__linq__2)
OPTION (MAXDOP 1) ;

পার্টিশন নির্মূলের ফলে আইও হ্রাস করা হয়েছে:

সারণী 'ডেমোউনিটডাটা'। স্ক্যান কাউন্ট 2, যৌক্তিক পাঠ 8

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