বিপুল পরিমাণ INSERTs নিয়ে আমার একটি সমস্যা রয়েছে যা আমার নির্বাচন নির্বাচন পরিচালনা করে।
স্কিমা
আমার এই মত একটি টেবিল আছে:
CREATE TABLE [InverterData](
[InverterID] [bigint] NOT NULL,
[TimeStamp] [datetime] NOT NULL,
[ValueA] [decimal](18, 2) NULL,
[ValueB] [decimal](18, 2) NULL
CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED
(
[TimeStamp] DESC,
[InverterID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF
, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON)
)
আমার কাছে এই সামান্য সহায়ক পদ্ধতিও রয়েছে, যা আমাকে MERGE কমান্ডের সাথে সন্নিবেশ বা আপডেট (সংঘাতের বিষয়ে আপডেট) করতে দেয়:
CREATE PROCEDURE [InsertOrUpdateInverterData]
@InverterID bigint, @TimeStamp datetime
, @ValueA decimal(18,2), @ValueB decimal(18,2)
AS
BEGIN
MERGE [InverterData] AS TARGET
USING (VALUES (@InverterID, @TimeStamp, @ValueA, @ValueB))
AS SOURCE ([InverterID], [TimeStamp], [ValueA], [ValueB])
ON TARGET.[InverterID] = @InverterID AND TARGET.[TimeStamp] = @TimeStamp
WHEN MATCHED THEN
UPDATE
SET [ValueA] = SOURCE.[ValueA], [ValueB] = SOURCE.[ValueB]
WHEN NOT MATCHED THEN
INSERT ([InverterID], [TimeStamp], [ValueA], [ValueB])
VALUES (SOURCE.[InverterID], SOURCE.[TimeStamp], SOURCE.[ValueA], SOURCE.[ValueB]);
END
ব্যবহার
আমার কাছে এখন একাধিক সার্ভারে পরিষেবা দৃষ্টান্ত রয়েছে যা [InsertOrUpdateInverterData]
পদ্ধতিটি দ্রুত কল করে ব্যাপক আপডেটগুলি করে ।
এছাড়াও একটি ওয়েবসাইট রয়েছে যা [InverterData]
টেবিলে সलेक्ट নির্বাচন করে ।
সমস্যা
আমি যদি [InverterData]
টেবিলের উপরে নির্বাচনগুলি অনুসন্ধান করি তবে সেগুলি বিভিন্ন টাইমস্প্যানগুলিতে অগ্রসর হয়, আমার পরিষেবা দৃষ্টান্তের INSERT ব্যবহারের উপর নির্ভর করে। আমি যদি সমস্ত পরিষেবাদির উদাহরণগুলিতে বিরতি দিই তবে নির্বাচনটি বিদ্যুত দ্রুত হয়, উদাহরণটি যদি দ্রুত সন্নিবেশ করায় সেলেপগুলি সত্যই ধীর বা এমনকি একটি সময়সীমা বাতিল হয়ে যায়।
প্রচেষ্টা
আমি [sys.dm_tran_locks]
লকিংয়ের প্রক্রিয়াগুলি অনুসন্ধানের জন্য টেবিলে কয়েকটি নির্বাচন করেছি
SELECT
tl.request_session_id,
wt.blocking_session_id,
OBJECT_NAME(p.OBJECT_ID) BlockedObjectName,
h1.TEXT AS RequestingText,
h2.TEXT AS BlockingText,
tl.request_mode
FROM sys.dm_tran_locks AS tl
INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address
INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id
INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id
INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id
CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1
CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2
এটি ফলাফল:
এস = ভাগ করা হয়েছে। অধিবেশন অধিবেশনটি রিসোর্সে অংশীদারি অ্যাক্সেস মঞ্জুর করা হয়।
প্রশ্ন
[InsertOrUpdateInverterData]
যে নির্বাচনগুলি কেবল MERGE কমান্ড ব্যবহার করছে সেগুলি দ্বারা কেন বাছাইকৃতগুলি অবরুদ্ধ করা হচ্ছে?
এর ভিতরে সংজ্ঞায়িত বিচ্ছিন্নতা মোডের সাথে আমাকে কি কোনও ধরণের লেনদেন ব্যবহার করতে হবে [InsertOrUpdateInverterData]
?
আপডেট 1 (@ পল এর প্রশ্নের সাথে সম্পর্কিত)
[InsertOrUpdateInverterData]
নিম্নলিখিত পরিসংখ্যান সম্পর্কে এমএস-এসকিউএল সার্ভারের অভ্যন্তরীণ প্রতিবেদনের ভিত্তিতে :
- গড় সিপিইউ-সময়: 0.12 মিমি
- গড় পঠন প্রক্রিয়া: 5. / প্রতি প্রতি
- গড় লেখার প্রক্রিয়া: 0 / প্রতি প্রতি
এটির ভিত্তিতে দেখে মনে হচ্ছে মার্জ কমান্ডটি বেশিরভাগই পঠন ক্রিয়ায় ব্যস্ত যা টেবিলটি লক করে দেবে! (?)
আপডেট 2 (@ পল এর প্রশ্নের সাথে সম্পর্কিত)
[InverterData]
টেবিল হিসাবে স্টোরেজ পরিসংখ্যান অনুসরণ করেনি:
- ডেটা স্পেস: 26,901.86 এমবি
- সারি গণনা: 131,827,749
- বিভাজন: সত্য
- পার্টিশন গণনা: 62
এখানে (সর্বমোট) সম্পূর্ণ এসপি_হোআইএসএটিভ রেজাল্ট সেট:
SELECT
হুকুম
- ডিডি এইচ: মিমি: এসএস.এমএস: 00 00: 01: 01.930
- সেশন_আইডি: 73
- ওয়েট_ইনফো: (12629 মিমি) এলসিকে_এমএস
- সিপিইউ: 198
- ব্লকিং_অ্যাসিওন_আইডি: 146
- পঠিত: 99,368
- লিখেছেন: 0
- স্থিতি: স্থগিত
- ওপেন_ট্রান_কাউন্ট: 0
[InsertOrUpdateInverterData]
কমান্ড অবরুদ্ধ
- ডিডি এইচ: মিমি: এসএস.এমএস: 00 00: 00: 00.330
- সেশন_আইডি: 146
- ওয়েট_ইনফো: নুল
- সিপিইউ: 3,972
- ব্লকিং_অ্যাসিওন_আইডি: নুল
- পঠন: 376,95
- লিখেছেন: 126
- স্থিতি: ঘুমানো
- ওপেন_ট্রাণ_কাউন্ট: ১
([TimeStamp] DESC, [InverterID] ASC)
সৌন্দর্য ক্লাস্টার সূচির জন্য একটি অদ্ভুত পছন্দ পছন্দ করি। আমিDESC
অংশ বলতে চাই ।