ওয়েব থেকে কল করার সময় সঞ্চিত পদ্ধতিটি ম্যানেজমেন্ট স্টুডিওর থেকে দ্রুত fast


97

আমি এমন পদ্ধতি সঞ্চয় করে রেখেছি যা ওয়েব অ্যাপ্লিকেশন থেকে প্রতিবার ডেকে আনে times

আমি এসকিএল প্রোফাইলারকে বরখাস্ত করেছিলাম এবং সেই সময়ের মধ্যে কলগুলি সনাক্ত করে অবশেষে এই জিনিসগুলি সন্ধান করি:

  1. যখন এমএস এসকিউএল ম্যানেজমেন্ট স্টুডিওর মধ্যে থেকে একই যুক্তি সহকারে বিবৃতিগুলি কার্যকর করা হয় (বাস্তবে, আমি এসকিউএল প্রোফাইলের ট্রেস থেকে প্রক্রিয়া কলটি অনুলিপি করে এটি চালিত করি): এটি 5 ~ 6 সেকেন্ড গড়ে শেষ হয়।
  2. তবে যখন ওয়েব অ্যাপ্লিকেশন থেকে ডাকা হয় তখন এটি 30 সেকেন্ডেরও বেশি সময় নেয় (ট্রেস করে) সুতরাং আমার ওয়েবপৃষ্ঠাটি আসলে তখন সময়ের বাইরে চলে যায়।

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

কী হচ্ছে তা আমি কীভাবে আবিষ্কার করব?

আমি ধরে নিচ্ছি যে আমরা বিএলএল> ডাল স্তর বা টেবিল অ্যাডাপ্টার ব্যবহার করি এর সাথে কিছুই করার নেই কারণ ট্রেস স্পষ্টভাবে দেখায় যে বিলম্বটি আসল পদ্ধতিতে রয়েছে। এটাই আমি ভাবতে পারি।

সম্পাদনা করুন এই লিঙ্কটিতে আমি জানতে পেরেছি যে ADO.NET ARITHABORTসত্যে সেট করে - যা বেশিরভাগ সময় ভাল হয় তবে কিছু সময় এটি ঘটে এবং প্রস্তাবিত কাজের আশেপাশে স্টোরড প্রোকে with recompileবিকল্প যোগ করা হয়। আমার ক্ষেত্রে এটি কাজ করছে না তবে আমি সন্দেহ করি এটি এর সাথে খুব মিল আছে। ADO.NET অন্য কেউ কী করে বা আমি যেখানে অনুমানটি পেতে পারি তা যে কেউ জানেন?


4
এটি কতটা তথ্য ফিরিয়ে দেওয়া হচ্ছে তার সাথে সম্পর্কিত হতে পারে?
ব্যারি কায়ে

@ ব্যারি: না, যেমন আমি পরিচালনা স্টুডিওতে একই পদ্ধতিটি (ট্রেস থেকে অনুলিপি করা - একই পরামিতি অর্থ) এটি চালায়, এটি 6 সেকেন্ডের মধ্যে চলে।
ইমেসরিয়াস

@ জয়ন্ত: মুল বক্তব্যটি এসপি ধীরগতির নয়, তবে অ্যাডো নেট.এইচ এবং এসকিএল এর মধ্যে কিছুটা। এসপি কীভাবে কোনও পার্থক্য করবে তা আমি দেখতে পাচ্ছি না।
ইলমাসিয়াস

4
এসপি কি প্রচুর ডেটা ফেরত দেয়, উদাহরণস্বরূপ চিত্র / পাঠ্য / বার্চার (সর্বাধিক) কলামগুলি? ক্লায়েন্টে ব্যবহারের জন্য ডেটা পরিমাণ বিপুল হবে যা অনেক সময় নিতে পারে। এসএসএমএস আরও কার্যকর বিষয়ে এই ফলাফলগুলি কেটে দেয়।
টিম শ্মেলেটার

উত্তর:


79

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

সংক্ষেপে, এটি মনে হয় যে এসকিউএল সার্ভারের একটি দূষিত ক্যাশেড এক্সিকিউশন প্ল্যান থাকতে পারে। আপনি আপনার ওয়েব সার্ভারের সাথে খারাপ পরিকল্পনাটি মারছেন তবে এসিএসএমএস পৃথক পরিকল্পনায় অবতরণ করছে যেহেতু এরিচাবার্ট পতাকাটিতে একটি আলাদা সেটিংস রয়েছে (যা অন্যথায় আপনার নির্দিষ্ট প্রশ্নের / সঞ্চিত প্রোকটিতে কোনও প্রভাব ফেলবে না)।

দেখুন ADO.NET টি-এসকিউএল স্টোরেড প্রক্রিয়া কল করার জন্য আরও সম্পূর্ণ ব্যাখ্যা এবং রেজোলিউশনের সাথে অন্য উদাহরণের জন্য স্কেলটাইমআউট এক্সেকশন হয়


এগুলি কিছু আকর্ষণীয় শীর্ষস্থানীয়, সেগুলি সম্পর্কে আরও পড়বে এবং কয়েকটিটিতে ফিরে যাবে .. ধন্যবাদ।
স্বতন্ত্র

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

4
@ আইমাসেরিয়াস - আপনি এটি ধন্যবাদ পেরেক! আমার সঞ্চিত পদ্ধতি পরিবর্তন করার পরে, আমার সময়সীমা সমস্যা ছিল। তারপরে আমি উপরে বর্ণিত দুটি ডিবিসিসি কমান্ড চালিয়েছি এবং এটি সমস্যার সমাধান করেছে।
ইন্দসুটার

4
@ মঙ্গজিস্ট: কারণ এটি একটি জটিল সমস্যা, কোনও রূপালী বুলেট নেই, তবে আপনি যে সমস্যাগুলি দেখা দিচ্ছেন তার উপর ইঙ্গিতগুলি ব্যবহার OPTIMIZE FORবা OPTION(Recompile)জিজ্ঞাসা করতে চেষ্টা করতে পারেন । এই নিবন্ধটি গভীরতার সাথে সমস্যাটি আলোচনা করেছে। সত্তা ফ্রেমওয়ার্ক যদি আপনার অনুসন্ধানগুলি উত্পন্ন করে তবে এই পোস্টটি আপনার প্রশ্নের সাথে কোয়েরি ইঙ্গিত যুক্ত করার একটি উপায় প্রদান করে to
স্ট্রিপলিং ওয়ারিয়র

8
DBCC DROPCLEANBUFFERS এবং DBCC FREEPROCCachE চালনার পরিবর্তে যা কার্যকর করা সমস্ত পরিকল্পনাগুলি সাফ করবে আপনি সমস্যার সঞ্চিত প্রক্রিয়াটি ড্রপ এবং পুনরায় তৈরি করতে পারবেন।
jnoreiga

52

আমি আরও অভিজ্ঞতা পেয়েছি যে অনুসন্ধানগুলি ওয়েব থেকে ধীরে ধীরে চলছিল এবং এসএসএমএসে দ্রুত এবং আমি শেষ পর্যন্ত আবিষ্কার করেছি যে সমস্যাটি প্যারামিটার স্নিফিং বলে called

আমার জন্য সমাধানটি হ'ল স্প্রোকে ব্যবহৃত সমস্ত প্যারামিটারগুলি স্থানীয় ভেরিয়েবলগুলিতে পরিবর্তন করা।

যেমন পরিবর্তন:

ALTER PROCEDURE [dbo].[sproc] 
    @param1 int,
AS
SELECT * FROM Table WHERE ID = @param1 

প্রতি:

ALTER PROCEDURE [dbo].[sproc] 
    @param1 int,
AS
DECLARE @param1a int
SET @param1a = @param1
SELECT * FROM Table WHERE ID = @param1a

অদ্ভুত লাগছে, তবে এটি আমার সমস্যাটিকে স্থির করেছে।


4
বাহ, আমারও একই সমস্যা ছিল এবং বিশ্বাস করি না যে এটি কাজ করবে তবে তা হয়ে গেল।
Lac Ho

4
জেন, আপনি কি জানেন যে এটি স্থায়ীভাবে সমস্যার সমাধান করবে বা এটি ফিরে আসতে পারে? ধন্যবাদ!
Lac Ho

4
এই পরিবর্তনটি করার পরে থেকে আমার সঞ্চিত পদ্ধতির গতি নিয়ে কোনও সমস্যা হয়নি।
জেন

4
বাহ, এটা আমার সমস্যা স্থির! এটি স্কেল সার্ভারে একটি বাগ হতে পারে। যখন এমএসএসকিউএল অভ্যন্তরীণভাবে হুডের অধীনে স্থানীয় রূপান্তর করতে পারে, বিশাল কর্মক্ষমতা অর্জনের জন্য কেন এসকিএল লেখকদের এই নিরীহ কুঁচক দিয়ে উঠতে বাধ্য করা হয়?
HerrimanCoder

4
এটি কি এমন হতে পারে যে প্রোকের পরিবর্তনের ফলে একটি নতুন এক্সিকিউশন প্ল্যান তৈরি হতে পারে, সুতরাং সমাধানটি আসলে ইনপুট ভেরিয়েবলটিকে স্থানীয় ভেরিয়েবলের অনুলিপি করে না বরং কেবল একটি নতুন এক্সিকিউশন প্ল্যান তৈরির জন্য জোর করে (গ্রহণযোগ্য সমাধানে ব্যাখ্যা করা হয়েছে)?
গারল্যান্ড পোপ

10

স্প্যামের জন্য নয়, তবে অন্যদের জন্য আশাকরি সহায়ক সমাধান হিসাবে, আমাদের সিস্টেমটি উচ্চ মাত্রার সময়সীমা দেখেছিল।

আমি সঞ্চিত পদ্ধতিটি ব্যবহার করে পুনরায় সংযুক্ত করার জন্য সেট করার চেষ্টা করেছি sp_recompileএবং এটি এক এসপির পক্ষে সমস্যাটি সমাধান করেছে।

অবশেষে এসপি'র একটি বৃহত সংখ্যক ছিল যে সময়সাপেক্ষ ছিল, যার মধ্যে অনেকেই এর আগে কখনও এমনটি করে নি, ব্যবহার করে DBCC DROPCLEANBUFFERSএবং DBBC FREEPROCCACHEসময়সীমার ঘটনার হার উল্লেখযোগ্যভাবে হ্রাস পেয়েছে - এখনও বিচ্ছিন্ন ঘটনা রয়েছে, এমন কিছু যেখানে আমি সন্দেহ করি যে পরিকল্পনাটি পুনর্জন্ম গ্রহণ করছে কিছুক্ষণ, এবং কিছু যেখানে এসপিরা প্রকৃত অর্থে নিখরচায় রয়েছে এবং পুনরায় মূল্যায়ন প্রয়োজন।


4
এর জন্য ধন্যবাদ. Sp_recompile কমান্ডটি ব্যবহার করে পুনরায় সংশ্লেষের পদ্ধতিটি চিহ্নিত করা যখন আমার জন্য কার্যকর হয়েছিল DBCC DROPCLEANBUFFERSএবং DBCC FREEPROCCACHEকোনও পার্থক্য না করে।
স্টিভ 13

4

ওয়েব অ্যাপ্লিকেশন এসপি কল করার আগে আরও কিছু ডিবি কল করা যে কোনও লেনদেন উন্মুক্ত রাখছে? ওয়েব অ্যাপ্লিকেশন দ্বারা কল করার সময় এই এসপিটির জন্য অপেক্ষা করার কারণ হতে পারে। আমি বলছি ওয়েব অ্যাপ্লিকেশনটিতে পূর্বের কোনও পদক্ষেপ এই সমস্যার কারণ হয়ে উঠছে তা নিশ্চিত করার জন্য ওয়েব অ্যাপ্লিকেশনে কলটি আলাদা করে দিন (এটি একটি নতুন পৃষ্ঠায় রেখে দিন)।


4
হাই @ টুন্ডে, আমি কলটি বিচ্ছিন্ন করেছি এবং এটি এখনও প্রায় 30 সেকেন্ড এবং সময় নিচ্ছে। সুতরাং এটি যোগাযোগের মধ্যে কিছু হতে হবে, আমার ধারণা?
ইলমাসিয়াস

1

কেবলমাত্র সঞ্চিত পদ্ধতিটি (আমার ক্ষেত্রে সারণী ফাংশন) পুনরায় সংশোধন করা আমার জন্য কাজ করেছিল


1

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

হত্যা পরিকল্পনা

কিছু গুগল করার পরে আমি সেই আচরণ সম্পর্কে একটি আকর্ষণীয় পঠন পেয়েছিলাম: অ্যাপ্লিকেশনটিতে ধীর, এসএসএমএসে দ্রুত?

প্রক্রিয়াটি সংকলন করার সময়, এসকিউএল সার্ভার জানে না যে @ ফ্রেমডেটের মান পরিবর্তিত হয়, তবে @fromdate এর মান NULL রয়েছে এমন অনুমানের অধীনে প্রক্রিয়াটি সংকলন করে। যেহেতু নুলের সাথে সমস্ত তুলনা অজানা ফলস্বরূপ, ক্যোয়ারীটি কোনও সারি মোটেও ফিরিয়ে দিতে পারে না, যদি @ ফর্মডেটে রান-টাইমে এখনও এই মান থাকে। যদি এসকিউএল সার্ভার ইনপুট মানটিকে চূড়ান্ত সত্য হিসাবে গ্রহণ করে, তবে এটি কেবলমাত্র একটি কনস্ট্যান্ট স্ক্যান দিয়ে এমন একটি পরিকল্পনা তৈরি করতে পারে যা টেবিলটি একেবারেই অ্যাক্সেস করে না (অর্ডারডেট থেকে কোয়েড নির্বাচন করুন> অর্ডারডেট থেকে> এখানের উদাহরণ দেখতে NULL) । তবে এসকিউএল সার্ভারকে অবশ্যই এমন একটি পরিকল্পনা উত্পন্ন করতে হবে যা @ ফ্রমডেটের রান-টাইমে যা মান রয়েছে তা বিবেচনা না করে সঠিক ফলাফল প্রদান করবে। অন্যদিকে, এমন কোনও পরিকল্পনা তৈরির কোনও বাধ্যবাধকতা নেই যা সমস্ত মানের জন্য সর্বোত্তম। সুতরাং, যেহেতু ধারণাটি হ'ল কোনও সারি ফিরে আসবে না, তাই এসকিউএল সার্ভার সূচী অনুসন্ধানের জন্য স্থির হয়।

সমস্যাটি হ'ল আমার কাছে এমন পরামিতি রয়েছে যা নালাগুলি ছেড়ে যেতে পারে এবং সেগুলি নাল হিসাবে পাস করা হলে ডিফল্ট মান দিয়ে আরম্ভ করা হবে।

create procedure dbo.procedure
    @dateTo datetime = null
begin
    if (@dateTo is null)
    begin
        select @dateTo  = GETUTCDATE()
    end

    select foo
    from dbo.table
    where createdDate < @dateTo
end

আমি এটি পরিবর্তন করার পরে

create procedure dbo.procedure
    @dateTo datetime = null
begin
    declare @to datetime = coalesce(@dateTo, getutcdate())

    select foo
    from dbo.table
    where createdDate < @to
end 

এটি আবার কবজির মতো কাজ করেছিল।


0
--BEFORE
CREATE PROCEDURE [dbo].[SP_DEMO]
( 
    @ToUserId bigint=null
 )
AS
BEGIN
SELECT * FROM tbl_Logins WHERE LoginId = @ToUserId 
END
--AFTER CHANGING TO IT WORKING FINE
CREATE PROCEDURE [dbo].[SP_DEMO]
( 
    @ToUserId bigint=null
 )
AS
BEGIN
DECLARE @Toid bigint=null
SET @Toid=@ToUserId
SELECT * FROM tbl_Logins WHERE LoginId = @Toid 
END
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.