এসকিউএল কোয়েরিগুলি পরীক্ষা করার সর্বোত্তম উপায় [বন্ধ]


109

আমি একটি সমস্যার মধ্যে চলে এসেছি যার মধ্যে আমরা জটিল এসকিউএল কোয়েরিগুলি ত্রুটিগুলি সহ করে চলেছি। মূলত এই ভুল গ্রাহকদের মেল প্রেরণ এবং অন্যান্য 'সমস্যা' যেমন ফলাফল।

এসকিউএল কোয়েরি তৈরির সাথে সবার অভিজ্ঞতা কী? আমরা প্রতি অন্য সপ্তাহে নতুন কোহোর্টস ডেটা তৈরি করছি।

সুতরাং এখানে আমার কিছু চিন্তা এবং তাদের সীমাবদ্ধতা রয়েছে:

  • পরীক্ষার ডেটা তৈরি করা যদিও এগুলি প্রমাণ করে যে আমাদের কাছে সমস্ত সঠিক তথ্য রয়েছে যা এটি উত্পাদনের ক্ষেত্রে ব্যতিক্রমগুলি বাদ দেয় না। এটি এমন ডেটা যা আজকে ভুল হিসাবে বিবেচিত হবে তবে 10 বছর আগে এটি সঠিক হতে পারে; এটি নথিভুক্ত করা হয়নি এবং অতএব আমরা কেবল তথ্য উত্তোলনের পরে এটি সম্পর্কে জানি।

  • ভেন ডায়াগ্রাম এবং ডেটা মানচিত্র তৈরি করুন এটি একটি কোয়েরির নকশা পরীক্ষা করার একটি শক্ত উপায় বলে মনে হচ্ছে, তবে এটি বাস্তবায়ন সঠিক কিনা এর গ্যারান্টি দেয় না। এটি বিকাশকারীদের সামনে পরিকল্পনা করে এবং কী লিখছে তা কী লিখছে তা ভেবে পায়।

আমার সমস্যাটি আপনি যে কোনও ইনপুট দিতে পারেন তার জন্য ধন্যবাদ।

উত্তর:


164

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

আপনার এসকিউএল এর মতো লিখবেন কেন?

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

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

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

জটিল কোয়েরিটি পচন করতে বেশ কয়েকটি ভিউ ব্যবহারের উদাহরণ এখানে।

উদাহরণস্বরূপ, যেহেতু প্রতিটি দর্শন কেবল একটি রূপান্তর যুক্ত করে, ততগুলি ত্রুটিগুলি অনুসন্ধান করার জন্য প্রতিটিকে স্বাধীনভাবে পরীক্ষা করা যেতে পারে এবং পরীক্ষাগুলি সহজ।

উদাহরণের বেস টেবিলটি এখানে:

create table month_value( 
    eid int not null, month int, year int,  value int );

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

আমরা লিনিয়ার ট্রান্সফর্ম হিসাবে এটি করব, যেমন এটি (বছর, মাস) হিসাবে একইভাবে সাজায় এবং যে কোনও (বছর, মাস) টুপলের জন্য একটি এবং একমাত্র মান থাকে এবং সমস্ত মান ক্রমাগত হয়:

create view cm_absolute_month as 
select *, year * 12 + month as absolute_month from month_value;

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

আমাদের পরীক্ষাটি selectনীচের কাঠামোর সাথে একটি এসকিউএল ক্যোয়ারী হবে : একটি পরীক্ষার নাম এবং কেস স্টেটমেন্ট একসাথে কাটানো। পরীক্ষার নামটি কেবল একটি নির্বিচারে স্ট্রিং। কেস স্টেটমেন্ট হ'ল case whenটেস্ট স্টেটমেন্ট then 'passed' else 'failed' end

পরীক্ষার বিবৃতিগুলি কেবল এসকিউএল নির্বাচন (সাবকিউরিজ) হবে যা পরীক্ষায় উত্তীর্ণ হওয়ার জন্য অবশ্যই সত্য হতে হবে be

আমাদের প্রথম পরীক্ষাটি এখানে:

--a select statement that catenates the test name and the case statement
select concat( 
-- the test name
'For every (year, month) there is one and only one (absolute_month): ', 
-- the case statement
   case when 
-- one or more subqueries
-- in this case, an expected value and an actual value 
-- that must be equal for the test to pass
  ( select count(distinct year, month) from month_value) 
  --expected value,
  = ( select count(distinct absolute_month) from cm_absolute_month)  
  -- actual value
  -- the then and else branches of the case statement
  then 'passed' else 'failed' end
  -- close the concat function and terminate the query 
  ); 
  -- test result.

এই ক্যোয়ারী চালানো এই ফলাফলটি প্রকাশ করে: For every (year, month) there is one and only one (absolute_month): passed

যতক্ষণ মাস_মূল্যতে পর্যাপ্ত পরীক্ষার ডেটা থাকে, এই পরীক্ষাটি কার্যকর হয়।

আমরা পর্যাপ্ত পরীক্ষার ডেটার জন্য একটি পরীক্ষাও যুক্ত করতে পারি:

select concat( 'Sufficient and sufficiently varied month_value test data: ',
   case when 
      ( select count(distinct year, month) from month_value) > 10
  and ( select count(distinct year) from month_value) > 3
  and ... more tests 
  then 'passed' else 'failed' end );

এখন এটি পরপর পরীক্ষা করা যাক:

select concat( '(absolute_month)s are consecutive: ',
case when ( select count(*) from cm_absolute_month a join cm_absolute_month b 
on (     (a.month + 1 = b.month and a.year = b.year) 
      or (a.month = 12 and b.month = 1 and a.year + 1 = b.year) )  
where a.absolute_month + 1 <> b.absolute_month ) = 0 
then 'passed' else 'failed' end );

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


27
এই প্রথমবারের মতো আমি
স্কিল-এ

1
দুর্দান্ত
স্কয়ার

13
এটি দুর্দান্ত, তবে কেন কলামগুলির জন্য একটি বর্ণের নাম এবং সবেমাত্র সুস্পষ্ট দৃশ্যগুলির নাম ব্যবহার করবেন? এসকিউএল পাইথনের চেয়ে স্ব-ডকুমেন্টিং বা পঠনযোগ্য কেন হবে?
স্নেল করুন

1
এসকিউএল / ডিবি বিশ্বে আমি কখনই তাকাতে পারি নি এমন দরকারী কিছুর জন্য দুর্দান্ত ব্যাখ্যা। আপনি যেভাবে এখানে ডাটাবেস পরীক্ষা করেছেন তাও আমি পছন্দ করি।
জ্যাকস্টাইন

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

6

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


4

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

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

তারপরে আপনার কোয়েরিটি ঠিক করার কোনও প্রচেষ্টা নিরর্থক হবে ... দুর্বৃত্ত অনুসন্ধানগুলি এখনও যে কোনওভাবেই ভুল ফলাফল ছড়িয়ে দিতে পারে।


2

পুনঃ টিপিডি

case when ( select count(*) from cm_abs_month a join cm_abs_month b  
on (( a.m + 1 = b.m and a.y = b.y) or (a.m = 12 and b.m = 1 and a.y + 1 = b.y) )   
where a.am + 1 <> b.am ) = 0  

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

এছাড়াও আমি কি কিছু মিস করছি, বা এই অন-ক্লজের দ্বিতীয়ার্ধটি কি ভুল মাসের মানটিকে ঘায়েল করে? (উদাহরণস্বরূপ যে 12/2011 1/2010 পরে আসে তা পরীক্ষা করে দেখুন)

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

আপনার পরীক্ষার কেসগুলির বাইরে হেক পরীক্ষা করতে ভুলবেন না!

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.