একটি "কখনও কখনও" ধীর কোয়েরি নির্ণয়ের জন্য পরামর্শ


20

আমার কাছে একটি সঞ্চিত প্রক্রিয়া রয়েছে যা একটি ইনডেক্সড ভিউ থেকে কভারিং ইনডেক্সের মাধ্যমে ফলাফলগুলি দেয়। সাধারণত, এটি দ্রুত চালিত হয় (10 ডলার), কখনও কখনও এটি 8 সেকেন্ড পর্যন্ত চলতে পারে।

এখানে এলোমেলোভাবে কার্যকরকরণের একটি উদাহরণ দেওয়া আছে (দ্রষ্টব্য: এটি কোনও ধীর গতি নয়, তবে ক্যোরির পাঠ্যটি উত্তীর্ণ হওয়া মান ব্যতীত একই)):

declare @p2 dbo.IdentityType
insert into @p2 values(5710955)
insert into @p2 values(5710896)
insert into @p2 values(5710678)
insert into @p2 values(5710871)
insert into @p2 values(5711103)
insert into @p2 values(6215197)
insert into @p2 values(5710780)

exec ListingSearch_ByLocationAndStatus @statusType=1,@locationIds=@p2

এখানে স্প্রোক রয়েছে:

ALTER PROCEDURE [dbo].[ListingSearch_ByLocationAndStatus]
    @LocationIds IdentityType READONLY,
    @StatusType TINYINT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT      -- lots of fields
    FROM        [dbo].[ListingSearchView][a] WITH (NOEXPAND)
    INNER JOIN  @LocationIds [b] ON [a].[LocationId] = [b].[Id]
    WHERE       [a].[StatusType] = @statusType
    OPTION (RECOMPILE);

(দ্রষ্টব্য: আমি OPTION (RECOMPILE)কিছু পরামর্শের পরে ইঙ্গিতটি যুক্ত করেছি , তবে এটি সাহায্য করে নি।

এখানে আচ্ছাদন সূচকটি (নোট: ভিউটিতে একটি ক্লাস্টার ইনডেক্সও রয়েছে ListingIdযা অনন্য)

CREATE NONCLUSTERED INDEX [IX_ListingSearchView_ForAPI] ON [dbo].[ListingSearchView]
(
    [LocationId] ASC,
    [StatusType] ASC
)
INCLUDE ( -- all the fields in the query) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

এক্সপ্লোর এক্সএমএল পরিসংখ্যান সহ আমি একটি প্রোফাইলার ট্রেস লাগিয়ে দিয়েছি।

এখানে একটি ধীর গতি (6 সেকেন্ড) এবং প্রাসঙ্গিক পরিকল্পনা: এখানে চিত্র বর্ণনা লিখুন

আমি যেমনটি প্রত্যাশা করছিলাম ঠিক তেমনটি দেখাবে এবং ক্যোয়ারী যখন দ্রুত হবে তখন একই পরিকল্পনা।

পরিকল্পনার ব্যয়বহুল অংশটি এখানে জুম করুন, যদি এটি সহায়তা করে: এখানে চিত্র বর্ণনা লিখুন

এখানে দেখার / ব্যাকিং টেবিলগুলির সম্পূর্ণ স্কিমা দেওয়া আছে, যদি তা সহায়তা করে: https://pastebin.com/ WH1sRcbQ

মন্তব্য:

  • সূচিগুলি আপত্তিজনক হয়েছে, পরিসংখ্যান টু ডেট।
  • মূলত ক্যোয়ারীটি ভিউয়ের বিপরীতে ছিল তবে আমি স্থিতিশীল হতে চেষ্টা এবং সহায়তা করতে SPROC এ চলে এসেছি। সাহায্য করেনি।
  • যোগ করা হচ্ছে WITH OPTION (RECOMPILE);ইঙ্গিতটি (কাজ করে নি তাই আঘ্রাণ প্যারামিটার হতে পারে না?)
  • সিস্টেমের অন্যান্য প্রশ্নগুলিও মাঝে মাঝে ধীর হয় এবং তাদের পরিকল্পনায় কোনও সুস্পষ্ট সমস্যা নেই।
  • লক করা যাবে? কীভাবে নিশ্চিত করবেন তা নিশ্চিত নন।

আমি পরবর্তী চেষ্টা করতে পারে কি কোন ধারণা?

ধন্যবাদ


1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে । প্রত্যেকে: দয়া করে এই প্রশ্নটির আরও আলোচনার জন্য সেই সুবিধাটি ব্যবহার করুন।
পল হোয়াইট GoFundMonica বলেছেন

প্রদত্ত লিঙ্কটি কাজ করছে না।প্রকৃত ক্যোয়ারীটি সোজা এগিয়ে রয়েছে, প্রকৃত এবং আনুমানিক সংখ্যক সারিগুলির মধ্যে বিস্তর পার্থক্য রয়েছে যা উদ্বেগের ক্ষেত্র I আমি মনে করি সমস্যাটি কোয়েরিতেই রয়েছে I আমি মনে করি অপ্রতুল ডেটা tএটি নিকটবর্তী হওয়া উচিত
কুমার হর্ষ ২

কোয়েরিটি চলাকালীন আপনি কি WHIsActive (অ্যাডাম মাচানিক দ্বারা) চালানোর চেষ্টা করেছেন? whoisactive.com এটিতে অপেক্ষার কার্য সম্পর্কিত তথ্য অন্তর্ভুক্ত রয়েছে, যা আপনাকে সঠিক দিকে নির্দেশ করবে।
এমজেএইচ

আপনি কি ডিবি এর বাহ্যিক কিছুকে এই কারণে সৃষ্টি করেছেন? সম্ভবত ডিবি-র সাথে ভাগ করে নেওয়া আইওওর সাথে সিঙ্ক্রোনাস যুক্ত অন্য কোনও অ্যাপ্লিকেশন?
জোহান

উত্তর:


2

আমি সত্যই মনে করি না যে এটি ব্যবহার করা OPTION (RECOMPILE)প্যারামিটার স্নিফিংয়ের সম্ভাবনা দূর করার কার্যকর উপায়।

এসকিউএল যখন কোনও নির্দিষ্ট ক্যোয়ারী সম্পর্কে বিভ্রান্ত হয় এবং সেটিকে নতুন মনে করে কারণ এটি নতুন পরামিতি দেখায় তখন প্যারামিটার স্নিফিং হয়। এটি ধীর কারণ এটি একটি নতুন এক্সিকিউশন প্ল্যান উত্পন্ন করতে অতিরিক্ত সময় নিচ্ছে।

সমস্ত বিকল্পটি এসকিউএলকে প্রতিবার একটি নতুন পরিকল্পনা তৈরি করতে বাধ্য করে যা বেশ একই জিনিস। পরিবর্তে, আপনি এই ইঙ্গিতটি ব্যবহার করে ডিফল্ট প্যারামিটারগুলি যুক্ত করে বিবেচনা করতে পারেন:

OPTION(OPTIMIZE FOR(@LocationIds='xx',@StatusType='xx'))

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


1

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

    SELECT  -- lots of fields
    FROM    @LocationIds [b] WITH (NOEXPAND)
            INNER JOIN  [dbo].[ListingSearchView][a] WITH (NOEXPAND) 
                ON [a].[LocationId] = [b].[Id]
    WHERE   [a].[StatusType] = @statusType
    OPTION (FORCE ORDER);

অথবা আপনি যদি কোনও লুপ সংযুক্তিকে জোর করতে পারেন তবে যদি আপনি সাধারণত টেবিলের পরিবর্তনশীল দর্শনে যোগ দিতে চান তবে এটি আদেশকেও বাধ্য করবে ...

    SELECT  -- lots of fields
    FROM    @LocationIds [b] WITH (NOEXPAND)
            INNER LOOP JOIN  [dbo].[ListingSearchView][a] WITH (NOEXPAND) 
                ON [a].[LocationId] = [b].[Id]
    WHERE   [a].[StatusType] = @statusType
    --leaving this here so you don't get an annoying warning 
    OPTION (FORCE ORDER);

0

ক্যোয়ারী সম্পাদকটিতে স্টোর পদ্ধতির নাম লিখুন, তারপরে স্টোর প্রোক নির্বাচন করুন। নাম এবং তারপরে প্রদর্শন আনুমানিক নির্বাহ পরিকল্পনা বা ক্লিক করুন (Ctrl + L) নির্বাচন করুন। এই ইমেজ নীচে।

প্রদর্শন আনুমানিক বাস্তবায়ন পরিকল্পনা চিত্র

তারপরে এক্সিকিউশন পরিকল্পনা ক্যোরি এডিটর এর নীচে বার্তাগুলি ট্যাবের ঠিক পাশেই শো করে। তারপরে সবুজ রঙের রেখাগুলিতে নিখোঁজ সূচকের বিবরণ প্রদর্শন করা হবে এবং তার উপর ডান ক্লিক করুন। তারপরে নতুন ক্যোয়ারী নতুন ট্যাবে খুলুন তারপরে INDEX তৈরি করুন। তারপরে আপনার ক্যোয়ারী দ্রুত চালাও।

সুতরাং আমি যে পদ্ধতিটি ধীর কাজ করে তা নির্ণয়ের জন্য এই পদ্ধতিটি ব্যবহার করেছি। এবং এমন অনেকগুলি কোয়েরি বা পদ্ধতি রয়েছে যা আপনি ব্যবহার করতে পারেন।

বিশদ সহ কার্যকর করার পরিকল্পনা


-1

আপনি যদি মনে করেন সমস্যাটি ব্লক করার মধ্যে রয়েছে তবে আমি আপনাকে আশাবাদী লেনদেনের বিচ্ছিন্নতা স্তরটি পড়ার জন্য প্রতিশ্রুতিবদ্ধ স্ন্যাপশট ব্যবহার করার পরামর্শ দেব (মনে রাখবেন এটি আপনার টেম্পডিবিতে ওভারহেড রাখবে)।

রেফারেন্স: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server

সমস্যাটি পড়ার / লেখার ব্লকিংয়ের মধ্যে নয়, আপনি আপনার দৃষ্টিতে সূচিপত্র যুক্ত করার চেষ্টা করতে পারেন (সূচীর সেরা পছন্দটি আপনার ডেটা নির্বাচনের উপর নির্ভর করে)

CREATE NONCLUSTERED INDEX IX_ListingSearchView (LocationID, StatusType) INCLUDE (other columns...)

1
আপনার প্রস্তাবিত সূচকটি ইতিমধ্যে বিদ্যমান IX_ListingSearchView_ForAPI(প্রশ্নের স্ক্রিপ্ট দেখুন)।
পল হোয়াইট GoFundMonica বলেছেন

1
আরে, আপনার উত্তরের জন্য ধন্যবাদ। যদিও আমি আমার প্রশ্নে বলেছি, আমি ঠিক করার আগে সমস্যাটি কী তা জানতে চাই । অন্যথায় আমি কেবল আসল সমস্যাটিকেই উপেক্ষা করতে পারি। আমার প্রশ্নটি প্রথমে সমস্যাটি সন্ধান করা, তারপরে সঠিক সমাধান সম্পর্কে।
RPM1984

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

@ আরতাশেখছাত্রিয়ান হ্যাঁ, এটি কখনও কখনও স্থানীয় ক্ষেত্রেও ধীর হয়। আমি কার্যকর করার পরিকল্পনা দিয়ে প্রশ্নটি আপডেট করেছি। আমি ভাবছি যে এটি যেমন ধীরে ধীরে অনুসন্ধানের চেয়ে দ্রুততর তুলনায় আরও বেশি সারি ফিরিয়েছে তার সাথে সম্পর্কিত কিনা you've
RPM1984
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.