একটি এসকিউএল সার্ভার সারণীতে পরিবর্তনগুলি সনাক্ত করা হচ্ছে


13

আমার অ্যাপ্লিকেশনটিতে, এসকিউএল সার্ভার ২০১২-তে একটি ডিবি নিয়ে চলার সাথে সাথে আমি একটি চাকরি পেয়েছি (নির্ধারিত টাস্ক) যা পর্যায়ক্রমে একটি ব্যয়বহুল ক্যোয়ারি চালায় এবং ফলাফলটি একটি টেবিলে লিখে দেয় যা পরে অ্যাপ্লিকেশনটির দ্বারা অনুসন্ধান করা যেতে পারে।

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

আমি নিম্নলিখিত ধারণা পেয়েছি:

  • স্পষ্টভাবে একটি শেষ পরিবর্তিত টাইমস্ট্যাম্প লিখুন, একটি "অবশ্যই প্রশ্নগুলি" পতাকা, বা যখনই আমি উত্স সারণীতে কিছু পরিবর্তন করি একটি ট্র্যাকিং টেবিলের কাছে এমন কিছু লিখুন।
  • এটি করতে ট্রিগার ব্যবহার করুন।

যাইহোক, আমি স্পষ্টভাবে লেখাগুলি অনুসরণ না করে কোনও টেবিলে পরিবর্তনগুলি সনাক্ত করার কোনও হালকা উপায় আছে কিনা তা আমি সত্যিই জানতে চাই। উদাহরণস্বরূপ, আমি কি ROWVERSIONকোনও টেবিলের "বর্তমান" বা এর মতো কিছু পেতে পারি ?

উত্তর:


14

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

সুতরাং আপনি কাস্টম কোডের মাধ্যমে এটি পরিচালনা করতে আটকা পড়েছেন। এর অর্থ ট্রিগারগুলি যেহেতু বিকল্প (লগ রেকর্ডগুলি সনাক্তকরণ) কেবলমাত্র লেনদেনের অনুলিপি (বা এটির সিডিসির পরিবর্তন-অহংকার) জন্য সংরক্ষিত একটি অগ্রাধিকারযোগ্য । সচেতন হন যে আপনি যদি এটি 'সর্বশেষ আপডেট হওয়া' কলামের মাধ্যমে ট্র্যাক করার চেষ্টা করেন তবে উপরে বর্ণিত ক্রমিক সমস্যাটি আপনার মুখোমুখি হবে। আপডেট সামঞ্জস্য যদি গুরুত্বপূর্ণ হয় তবে আপনাকে একটি সারি প্রক্রিয়াটি ব্যবহার করতে হবে (ট্রিগার একটি INSERT ব্যবহার করে এবং তারপরে একটি প্রক্রিয়া 'সর্বশেষ আপডেট হওয়া' সূচনা করার জন্য সন্নিবেশিত মানগুলিকে একত্রিত করে)। বর্তমান 'পরিচয়' বা ' sys.dm_db_index_usage_stats সন্ধান করার মতো কিছু' চালাক 'সমাধান দিয়ে প্রতারণার চেষ্টা করবেন না । এবং প্রতি 'রেকর্ড কলামেও' আপডেট_এট 'রয়েছে, যেমন রেলের টাইমস্ট্যাম্পগুলিতে রয়েছে,

কোন 'লাইটওয়েট' বিকল্প আছে? আসলে একটি আছে, তবে এটি আপনার পক্ষে কাজ করবে কিনা এবং এটি সঠিকভাবে পাওয়া শক্ত কিনা তা বলা মুশকিল: ক্যোয়ারী নোটিফিকেশন । ক্যোয়ারী বিজ্ঞপ্তি হুবহু এটি করে, কোনও ডেটা পরিবর্তন হলে এবং আপনার ক্যোয়ারী রিফ্রেশ করা দরকার হলে এটি একটি বিজ্ঞপ্তি সেট আপ করবে । যদিও বেশিরভাগ ডেভেলগুলি শুধুমাত্র এটির স্কেলডিপেন্ডেন্স হিসাবে নেট অবতারের সাথে পরিচিত, কোয়েরি বিজ্ঞপ্তিটি ডেটা পরিবর্তন সনাক্ত করতে দীর্ঘস্থায়ী, অবিচলিত প্রক্রিয়া হিসাবে ব্যবহার করা যেতে পারে। সত্যিকারের পরিবর্তনের ট্র্যাকিংয়ের সাথে তুলনা করে এটি সত্যই হালকা ওজনের হতে চলেছে এবং এর শব্দার্থবিজ্ঞানগুলি আপনার প্রয়োজনগুলির নিকটবর্তী (কিছু, কিছু , পরিবর্তিত, সুতরাং আপনাকে আবার অনুসন্ধান করা দরকার)।

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


তাহলে কেন মাইক্রোসফ্ট sys.dm_db_index_usage_stats তৈরি করতে বিরক্ত করবে, যদি তার সরবরাহ করা তথ্যের উপর নির্ভর করা যায় না?
ক্রেগ এফ্রেইন

এটি পরিবর্তন ট্র্যাকিংয়ের জন্য ডিজাইন করা কোনও ডিএমভি নয় । লক্ষ্যযুক্ত উদ্দেশ্যে খুব নির্ভরযোগ্য, যা পারফরম্যান্স টিউনিং।
রেমাস রুসানু

8

দেখে মনে হচ্ছে আমি এখানে গেমটি থেকে দু'বছর দেরিতে এসেছি, তবে আপনি যা চাইছেন তা করার জন্য খুব সুন্দর একটি হালকা উপায় রয়েছে।

দুটি এসকিউএল সার্ভার প্রক্রিয়া রয়েছে যা আপনাকে সহায়তা করতে পারে। আপনার চূড়ান্ত সমাধান হতে পারে উভয়ের সংকর।

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

রোভার্সন / টাইমস্ট্যাম্প । এটি একটি 8-বাইটের ভেরিবিনারি কলামের প্রকার (এক বিগইন্টের কাছে ableালাইযোগ্য) যা বাড়ানো হয়, ডাটাবেস প্রশস্ত, যখনই একটি সারি থাকে যা সন্নিবেশ করা হয় বা আপডেট করা হয় (এটি মুছে ফেলার ক্ষেত্রে সহায়তা করে না)। আপনি যদি এই কলামগুলি সূচিযুক্ত করেন তবে আপনি সহজেই বলতে পারবেন যে শেষ বারের মূল্যায়ন হওয়ার পর থেকে MAX (টাইমস্ট্যাম্প) এর মানের সাথে তুলনা করে সারি ডেটা পরিবর্তিত হয়েছে কিনা। যেহেতু মানটি একঘেয়েভাবে বাড়ছে, এটি আপনাকে একটি নির্ভরযোগ্য ইঙ্গিত দেবে যে আপনি যখন সর্বনিম্ন যাচাই করেছেন তখন এটির চেয়ে নতুন মানটি বড় হয়ে গেছে data


7

যদি উত্সটি সন্নিবেশ করা হয় তবে কেবল একটি IDENTITYকলাম দিন। আপনি যখন আপনার ডেটা ট্রান্সফার করেন তখন আপনি জুড়ে লেখা সর্বাধিক মানটি লগ করেন। পরবর্তী স্থানান্তরকালে আপনার পূর্ববর্তী স্থানান্তরকালে লগ-এর চেয়ে বেশি মানের জন্য কেবল ক্যোয়ারী প্রয়োজন need আমরা ডেটা গুদামে লগ রেকর্ড স্থানান্তর করার জন্য এটি করি।

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

ডেটা ক্যাপচার চেঞ্জ করার একটি হালকা বিকল্প হ'ল চেঞ্জ ট্র্যাকিং । এটি কী মানগুলি পরিবর্তিত হয়েছে তা আপনাকে বলবে না , শেষ সন্ধানের পরে সারিটি পরিবর্তিত হয়েছে। অন্তর্নির্মিত ফাংশনগুলি পরিবর্তিত মান এবং ট্র্যাকিংয়ের পরিচালনা পুনরুদ্ধারের সুবিধার্থে। 100,000,000 সারি সারণীতে প্রতিদিন প্রায় 100,000 পরিবর্তন প্রক্রিয়া করতে আমরা সিটি ব্যবহার করে সাফল্য পেয়েছি।

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

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


3

SqlTableDependency

SQL সার্ভিস ডাটাবেসে সারণী রেকর্ড মান সম্বলিত বিজ্ঞপ্তিগুলি অ্যাক্সেস করার জন্য স্কেলএটেবলডিপেন্ডেন্সি একটি উচ্চ-স্তরের বাস্তবায়ন উপাদান।

SqlTableD dependency একটি জেনেরিক সি # উপাদান যখন নির্দিষ্ট ডাটাবেস টেবিলের সামগ্রীর পরিবর্তন হয় বিজ্ঞপ্তিগুলি প্রাপ্ত করতে ব্যবহৃত হয়।

। নেট স্কেলডেপেন্সি নিয়ে পার্থক্য কী?

মূলত, মূল পার্থক্য হ'ল স্ক্যালটিবলডেপেন্ডেন্সি টেবিলে এক্সক্লুটেড ডিএমএল অপারেশন (সন্নিবেশ / মুছুন / আপডেট) রেকর্ড সন্নিবেশিত, পরিবর্তন বা মুছে ফেলার জন্য মানগুলি অন্তর্ভুক্ত ইভেন্টগুলি প্রেরণ করে: স্কেলডেপেন্সিটি ডেটাতে কী ডেটা পরিবর্তন করা হয়েছিল তা জানায় না ডাটাবেস টেবিল, তারা কেবল বলে যে কিছু পরিবর্তন হয়েছে।

কটাক্ষপাত আছে GitHub প্রকল্পের


1

আপনি যে আপডেটগুলি প্রত্যাশা করছেন তা যদি কোনও সূচককে প্রভাবিত করে (এবং শুধুমাত্র যদি), আপনি সারণীতে sys.dm_db_index_usage_statsকোনও সূচকের শেষ আপডেটটি সনাক্ত করতে সিস্টেম টেবিলটি ব্যবহার করতে পারেন । আপনি last_user_updateক্ষেত্রটি ব্যবহার করবেন ।

উদাহরণস্বরূপ, সর্বাধিক আপডেট হওয়া সারণীগুলি পেতে:

select
    object_name(object_id) as OBJ_NAME, *
from
    sys.dm_db_index_usage_stats
where
    database_id = db_id(db_name())
order by
    dm_db_index_usage_stats.last_user_update desc

অথবা, নির্দিষ্ট তারিখের পরে কোনও নির্দিষ্ট টেবিলটি পরিবর্তন করা হয়েছে কিনা তা পরীক্ষা করতে:

select
    case when count(distinct object_id) > 0 then 1 else 0 end as IS_CHANGED
from
    sys.dm_db_index_usage_stats
where
    database_id = db_id(db_name())
    and object_id = object_id('MY_TABLE_NAME')
    and last_user_update > '2016-02-18'

উপরে রেমাসের মন্তব্যটি আপনার কী? "বর্তমানের পরিচয় ছিনিয়ে নেওয়া বা sys.dm_db_index_usage_stats সন্ধান করার মতো কিছু 'চালাক' সমাধান দিয়ে প্রতারণার চেষ্টা করবেন না।" (তার উত্তরের নীচে তার মন্তব্যও দেখুন))
ফ্যাবিয়ান শমিয়েড

1
@ ফ্যাবিয়ানসচমিড ইন্টারেস্টিং - আমি দেখিনি যে আমি যখন আমার উত্তর যুক্ত করলাম তখন আমি রেমাসের অন্য একটি উত্তর ছাড়াও লেখক কিছু খুঁজে পাচ্ছিলাম না যে এটি ব্যবহারের ক্ষেত্রে এটি নির্ভরযোগ্য নয়; dm_db_index_operational_statsশো সম্পর্কিত ইস্যুগুলির জন্য এমএস পৃষ্ঠা (মেটাডেটা ক্যাশে ক্লিয়ার হিসাবে সাফ করা হয়েছে) তবে এর জন্য নয় dm_db_index_usage_stats। আমি খুঁজে পেলাম কেবলমাত্র ইস্যুটি সূচি পুনর্গঠন, সার্ভার পুনরায় আরম্ভ এবং ডাটাবেস বিচ্ছিন্নতার সাথে ব্যবহারের পরিসংখ্যান সাফ করেছে, এবং এটি এখানে প্রয়োগ হয়েছে বলে মনে হয় না। এই বিষয়ে দৃ info় তথ্য দেখতে আগ্রহী হবে।
জিওফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.