ট্রিগারগুলি কি প্রতিবার সংকলন করে?


22

আমরা এমন একটি সার্ভারের সমস্যা সমাধান করছি যা উচ্চ সিপিইউ ব্যবহার করে। অনুসন্ধানগুলি সত্যই এটির কারণ হয়ে উঠছে না তা খুঁজে পাওয়ার পরে আমরা সংকলনগুলি সন্ধান করতে শুরু করি।

পারফরম্যান্স মনিটর 50 কম সংকলন / সেকেন্ড এবং 15 কম সংকলন / সেকেন্ডের চেয়ে কম দেখাচ্ছে।

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

এই সিস্টেমটি পরিবর্তনগুলি নিরীক্ষণের জন্য ট্রিগার ব্যবহার করছে। সংকলনগুলির বেশিরভাগই ট্রিগারগুলির কারণে হয়। ট্রিগারগুলি রেফারেন্স sys.dm_tran_active_transferences।

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

  1. সংকলনগুলি ট্র্যাক করতে আমরা একটি এক্সই অধিবেশনে sqlserver.query_pre_execution_showplan ব্যবহার করছি। কেন এবং পারফমন কাউন্টারের মধ্যে বৈষম্য রয়েছে?
  2. ট্রিগার চলার সময় আপনি কি সংকলনের ইভেন্টটি পান তা কি স্বাভাবিক?

প্রতিলিপি স্ক্রিপ্ট:

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;

উত্তর:


20

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

query_pre_execution_showplan

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

query_post_compilation_showplan

এসকিউএল বিবৃতি সংকলিত হওয়ার পরে ঘটে। এই ইভেন্টটি কোয়েরিটি সংকলিত হওয়ার পরে উত্পন্ন উত্কৃত ক্যোয়ারী প্ল্যানের একটি এক্সএমএল প্রতিনিধিত্ব প্রদান করে । এই ইভেন্টটি ব্যবহারে একটি উল্লেখযোগ্য পারফরম্যান্স ওভারহেড থাকতে পারে তাই এটি কেবলমাত্র সংক্ষিপ্ত সময়ের জন্য নির্দিষ্ট সমস্যা সমাধানের সময় বা নিরীক্ষণ করার সময় ব্যবহার করা উচিত।

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

এখানে চিত্র বর্ণনা লিখুন

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

প্রথম কার্যকর করার পরে যদি আমরা দুটি INSERT বিবৃতি স্বতন্ত্রভাবে আবার চালিত করি তবে নীচের ইভেন্টগুলিতে প্রদর্শিত ট্রিগারটি আবার সংকলন করে না:

এখানে চিত্র বর্ণনা লিখুন

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


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

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

13

না। ট্রিগারগুলি সর্বদা পুনরায় সংযুক্ত করা হয় না। সাধারণ ক্যোয়ারী বিবৃতিগুলি তবে তাদের পরিকল্পনাগুলি ক্যাশে করে না এবং তাই সর্বদা পুনরায় সংযুক্ত করা হবে।

ট্রিগাররা ompোকানো বা মুছে ফেলা সারিগুলির সংখ্যা উল্লেখযোগ্যভাবে পুনরায় সংশ্লেষিত হবে। দেখুন: https://technet.microsoft.com/en-us/library/ms181055.aspx

আমি জানি না এক্সএভেন্টসে তাদের একই আছে কিনা, তবে এসকিউএল ট্রেস-এ, একটি পুনর্নির্মাণের একটি ইভেন্ট সাবক্লাস রয়েছে যা আপনাকে জানায় যে এটি পুনরায় সংযুক্ত করা হয়েছিল। উপরের একই লিঙ্কে এটি ব্যাখ্যা করা হয়েছে।


1
আমরা সংশোধনগুলির চেয়ে সংকলনগুলির দিকে তাকিয়ে ছিলাম। আমরা আগামীকাল সার্ভারটি দেখতে যাচ্ছি এবং পরীক্ষা করে দেখি যে এটি কোনও সাধারণ ক্যোয়ারী স্টেটমেন্ট হওয়ার কারণে হয়েছে বা এটি সারি সংখ্যার কারণে হয়েছে। ধন্যবাদ!
তারা কিজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.