আমরা এমন একটি সার্ভারের সমস্যা সমাধান করছি যা উচ্চ সিপিইউ ব্যবহার করে। অনুসন্ধানগুলি সত্যই এটির কারণ হয়ে উঠছে না তা খুঁজে পাওয়ার পরে আমরা সংকলনগুলি সন্ধান করতে শুরু করি।
পারফরম্যান্স মনিটর 50 কম সংকলন / সেকেন্ড এবং 15 কম সংকলন / সেকেন্ডের চেয়ে কম দেখাচ্ছে।
সংকলনগুলির সন্ধানে একটি এক্সই অধিবেশন চালানোর পরে, আমরা প্রতি সেকেন্ডে কয়েক হাজার সংকলন দেখছি।
এই সিস্টেমটি পরিবর্তনগুলি নিরীক্ষণের জন্য ট্রিগার ব্যবহার করছে। সংকলনগুলির বেশিরভাগই ট্রিগারগুলির কারণে হয়। ট্রিগারগুলি রেফারেন্স sys.dm_tran_active_transferences।
আমাদের প্রথম চিন্তা ছিল যে কোনও ট্রিগারে কোনও ডিএমভি রেফারেন্সের কারণে এটি প্রতিটি সময় সংকলন করতে পারে বা সম্ভবত এই নির্দিষ্ট ডিএমভি এর কারণ হতে পারে। তাই আমি সেই তত্ত্বটি পরীক্ষা করতে শুরু করেছি। এটি প্রতিবার সংকলন করে, তবে আমি যখন ডিএমভিকে রেফারেন্স করি না এবং পরিবর্তে একটি মানকে হার্ডকোড দেয় তখন ট্রিগারটি যখন ট্রিগার করা হয় ততবার ট্রিগার কম্পাইল করে কিনা তা আমি পরীক্ষা করে দেখিনি। এটি ট্রিগার হওয়ার সাথে সাথে এটি প্রতিটি সময়ই সংকলন করছিল। ট্রিগার বাদ দেওয়া সংকলনগুলি থামিয়ে দেয়।
- সংকলনগুলি ট্র্যাক করতে আমরা একটি এক্সই অধিবেশনে sqlserver.query_pre_execution_showplan ব্যবহার করছি। কেন এবং পারফমন কাউন্টারের মধ্যে বৈষম্য রয়েছে?
- ট্রিগার চলার সময় আপনি কি সংকলনের ইভেন্টটি পান তা কি স্বাভাবিক?
প্রতিলিপি স্ক্রিপ্ট:
CREATE TABLE t1 (transaction_id int, Column2 varchar(100));
CREATE TABLE t2 (Column1 varchar(max), Column2 varchar(100));
GO
CREATE TRIGGER t2_ins
ON t2
AFTER INSERT
AS
INSERT INTO t1
SELECT (SELECT TOP 1 transaction_id FROM sys.dm_tran_active_transactions), Column2
FROM inserted;
GO
--Both of these show compilation events
INSERT INTO t2 VALUES ('row1', 'value1');
INSERT INTO t2 VALUES ('row2', 'value2');
GO
ALTER TRIGGER t2_ins
ON t2
AFTER INSERT
AS
INSERT INTO t1
SELECT 1000, Column2
FROM inserted;
GO
--Both of these show compilation events
INSERT INTO t2 VALUES ('row3', 'value3');
INSERT INTO t2 VALUES ('row4', 'value4');
DROP TRIGGER t2_ins;
--These do not show compilation events
INSERT INTO t2 VALUES ('row5', 'value5');
INSERT INTO t2 VALUES ('row6', 'value6');
DROP TABLE t1, t2;