এসিঙ্ক কলগুলি ব্যবহার করার সময় আমার বড় এসকিউএল পারফরম্যান্স সমস্যা হয়। সমস্যাটি দেখানোর জন্য আমি একটি ছোট মামলা তৈরি করেছি।
আমি একটি এসকিউএল সার্ভার ২০১ a-তে একটি ডাটাবেস তৈরি করেছি যা আমাদের ল্যানে থাকে (তাই কোনও লোকালডিবি নয়)।
সেই ডাটাবেসে আমার কাছে WorkingCopy
দুটি কলাম সহ একটি টেবিল রয়েছে:
Id (nvarchar(255, PK))
Value (nvarchar(max))
ডিডিএল
CREATE TABLE [dbo].[Workingcopy]
(
[Id] [nvarchar](255) NOT NULL,
[Value] [nvarchar](max) NULL,
CONSTRAINT [PK_Workingcopy]
PRIMARY KEY CLUSTERED ([Id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
সেই টেবিলটিতে আমি একটি একক রেকর্ড id
=োকিয়েছি ( = 'পারফিউনিটটেষ্ট', Value
এটি একটি 1.5 মিমি স্ট্রিং (বৃহত্তর জেএসএন ডেটাসেটের একটি জিপ))।
এখন, যদি আমি এসএসএমএসে কোয়েরিটি সম্পাদন করি:
SELECT [Value]
FROM [Workingcopy]
WHERE id = 'perfunittest'
আমি তাত্ক্ষণিকভাবে ফলাফলটি পেয়েছি এবং আমি এসকিউএল সার্ভার প্রোফাইলারে দেখতে পাচ্ছি যে মৃত্যুদন্ড কার্যকর করার সময়টি প্রায় 20 মিলিসেকেন্ডের মতো। সব স্বাভাবিক।
একটি সমতল ব্যবহার করে .NET (4.6) কোড থেকে কোয়েরিটি সম্পাদন করার সময় SqlConnection
:
// at this point, the connection is already open
var command = new SqlCommand($"SELECT Value FROM WorkingCopy WHERE Id = @Id", _connection);
command.Parameters.Add("@Id", SqlDbType.NVarChar, 255).Value = key;
string value = command.ExecuteScalar() as string;
এর কার্যকর করার সময়টিও প্রায় 20-30 মিলিসেকেন্ড।
তবে এ্যাসিঙ্ক কোডে পরিবর্তন করার সময়:
string value = await command.ExecuteScalarAsync() as string;
মৃত্যুদন্ড কার্যকর করার সময় হঠাৎ 1800 এমএস ! এসকিউএল সার্ভার প্রোফাইলার-এ, আমি দেখতে পাচ্ছি যে ক্যোয়ারি এক্সিকিউশন সময়কাল এক সেকেন্ডের চেয়ে বেশি। যদিও প্রোফাইলার দ্বারা রিপোর্ট করা মৃত্যুদণ্ডপ্রাপ্ত ক্যোয়ারী হ'ল অ্যাসিঙ্ক সংস্করণটির মতো।
তবে এটি আরও খারাপ হয়। আমি যদি সংযোগের স্ট্রিংয়ে প্যাকেট আকারের সাথে ঘুরে দেখি তবে আমি নিম্নলিখিত ফলাফলগুলি পাই:
প্যাকেটের আকার 32768: [টাইমিং]: এসকিউএলএল স্টোরে এক্সিকিউটস্ল্যাকারসাইক -> অতিবাহিত সময়: 450 এমএস
প্যাকেটের আকার 4096: [সময়সীমা]: এসকিউএলএলিউস্টোরে এক্সিকিউটস্ল্যাকারসাইক -> অতিবাহিত সময়: 3667 এমএস
প্যাকেটের আকার 512: [টাইমিং]: এসকিউএলএলিউস্টোরে এক্সিকিউটস্ল্যাকারসাইক -> অতিবাহিত সময়: 30776 এমএস
30,000 এমএস !! এটি অ-অ্যাসিঙ্ক সংস্করণের চেয়ে 1000x এরও বেশি ধীর। এবং এসকিউএল সার্ভার প্রোফাইলার রিপোর্ট করেছেন যে ক্যোয়ারি এক্সিকিউশনটি 10 সেকেন্ডেরও বেশি সময় নিয়েছে। এটি অন্য 20 সেকেন্ড কোথায় গেছে তাও ব্যাখ্যা করে না!
তারপরে আমি সিঙ্ক সংস্করণে ফিরে এসেছি এবং প্যাকেট আকারের সাথেও খেললাম, যদিও এটি কার্যকর করার সময় সামান্য প্রভাব ফেলেছিল, এটি অ্যাসিঙ্ক সংস্করণের মতো নাটকীয় ছিল না।
সাইডেনোট হিসাবে, যদি এটি মানটির মধ্যে কেবল একটি ছোট স্ট্রিং (<100 বাইটস) রাখে, অ্যাসিঙ্ক ক্যোয়ারী এক্সিকিউশন সিঙ্ক সংস্করণের মতোই দ্রুত (ফলাফল 1 বা 2 এমএস) ms
আমি এটি দেখে সত্যিই হতবাক, বিশেষত যেহেতু আমি অন্তর্নির্মিত ব্যবহার করছি SqlConnection
, এমনকি কোনও ওআরএমও না। এছাড়াও আশেপাশে অনুসন্ধান করার সময়, আমি এমন কোনও কিছুই পাইনি যা এই আচরণটি ব্যাখ্যা করতে পারে। কোন ধারনা?