কেন নির্বাচন * ক্ষতিকারক হিসাবে বিবেচিত?


256

SELECT *খারাপ অভ্যাস কেন ? আপনি চান এমন একটি নতুন কলাম যুক্ত করলে এর পরিবর্তিত কোডটি কম হবে না?

আমি বুঝতে পারি যে SELECT COUNT(*)এটি কিছু ডিবিতে পারফরম্যান্সের সমস্যা, তবে আপনি যদি প্রতিটি কলামটি সত্যিই চান তবে কী হবে?


30
SELECT COUNT(*)খারাপ হওয়া অবিশ্বাস্যভাবে পুরানো এবং পুরানো । উপর তথ্যের জন্য SELECT *- দেখুন: stackoverflow.com/questions/1960036/…
ওএমজি পনিস

8
SELECT COUNT(*)SELECT COUNT(SomeColumn)কলামটি নাল কলাম না হওয়া থেকে আলাদা উত্তর দেয় । এবং অপ্টিমাইজার SELECT COUNT(*)বিশেষ চিকিত্সা দিতে পারে - এবং সাধারণত করে। এছাড়াও খেয়াল করুন যে WHERE EXISTS(SELECT * FROM SomeTable WHERE ...)বিশেষ কেস চিকিত্সা দেওয়া হয়।
জোনাথন লেফলার

3
@ মিশেল মরোজেক, আসলে এটি প্রশ্নের বিপরীত। আমি জিজ্ঞাসা করছি যে এটি কখনও ক্ষতিকারক কিনা, না যদি এটি কখনও ক্ষতিকারক না হয়।
থিওডোর আর স্মিথ

1
@ বাইটকোড নিনজা: বিশেষত, মাইএসএএম ইঞ্জিন সহ মাইএসকিউএল-এর COUNT (*) এর জন্য একটি অপ্টিমাইজেশন রয়েছে: mysqlperformanceblog.com/2007/04/10/count-vs-countcol
পিসকভর

1
এসকিউএল সার্ভারের জন্য দেখুন sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/…
অ্যারন

উত্তর:


312

তিনটি বড় কারণ রয়েছে:

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

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

  • বাঁধাই সমস্যা। আপনি যখন নির্বাচন করুন *, দুটি পৃথক টেবিল থেকে একই নামের দুটি কলাম পুনরুদ্ধার করা সম্ভব। এটি প্রায়শই আপনার ডেটা গ্রাহককে ক্রাশ করতে পারে। এমন একটি ক্যোয়ারী কল্পনা করুন যা দুটি টেবিলের সাথে যোগ দেয়, যার দুটিতেই "আইডি" নামে একটি কলাম রয়েছে। কোন গ্রাহক কীভাবে জানবেন কোনটি? অন্তর্নিহিত সারণী কাঠামোগুলি পরিবর্তিত হলে SELECT * দৃশ্যগুলি (কমপক্ষে কয়েকটি সংস্করণে এসকিউএল সার্ভারেও বিভ্রান্ত করতে পারে) - দৃশ্যটি পুনর্নির্মাণ করা হয় না এবং যে ডেটা ফিরে আসে তা বোকা হতে পারে । এবং এর সবচেয়ে খারাপ দিকটি হ'ল আপনি নিজের কলামগুলি যা খুশি তাই নামকরণের যত্ন নিতে পারেন তবে পাশের লোকটির সাথে এটি জানা কোনও উপায় নেই যে তার একটি কলাম যুক্ত করার বিষয়ে চিন্তা করতে হবে যা আপনার ইতিমধ্যে বিকাশের সাথে সংঘর্ষ করবে will নাম থাকবে না।

তবে এটি নির্বাচন করুন * এর পক্ষে সব খারাপ নয়। আমি এই ব্যবহারের ক্ষেত্রে এটি উদারভাবে ব্যবহার করি:

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

  • যখন * এর অর্থ "একটি সারি"। নিম্নলিখিত ব্যবহারের ক্ষেত্রে, নির্বাচন * ঠিক আছে, এবং গুজব যে এটি একটি পারফরম্যান্স হত্যাকারী হলেন কেবল শহুরে কিংবদন্তি, যার অনেক বছর আগে কিছুটা বৈধতা থাকতে পারে, তবে এখনই করবেন না:

    SELECT COUNT(*) FROM table;

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

    একই ধরণের ক্যোয়ারির সাথে যায়:

    SELECT a.ID FROM TableA a
    WHERE EXISTS (
        SELECT *
        FROM TableB b
        WHERE b.ID = a.B_ID);

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


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

1
আমি জানি এটি পুরানো, তবে গুগল করার সময় এটি টানা হয়েছিল তাই আমি জিজ্ঞাসা করছি। "যখন * এর অর্থ" একটি সারি "। নিম্নলিখিত ব্যবহারের ক্ষেত্রে, নির্বাচন করুন ঠিকঠাক, এবং গুজব যে এটি একটি পারফরম্যান্স হত্যাকারী হ'ল নগর কিংবদন্তী ..." এখানে আপনার কোনও উল্লেখ আছে? হার্ডওয়্যারটি আরও শক্তিশালী হওয়ার কারণে এই বিবৃতিটি কি (যদি এমনটি হয় তবে এর অর্থ এটি অকার্যকর নয় যে আপনি এটি লক্ষ্য করার সম্ভাবনা কম) less আমি প্রতি সেপ্টেম্বর অনুমান করার চেষ্টা করছি না আমি ভাবছি এই বিবৃতিটি কোথা থেকে এসেছে।
জেয়ার্ড

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

4
ব্যবহারের আরও একটি সুবিধা *হ'ল কিছু পরিস্থিতিতে এটি মাইএসকিউএল এর ক্যাশে সিস্টেমগুলির আরও ভাল সুবিধা নিতে পারে। যদি আপনি প্রচুর সংখ্যক অনুরূপ selectক্যোয়ারী চালাচ্ছেন যা বিভিন্ন কলামের নামের জন্য অনুরোধ করে ( select A where X,, select B where X...) select * where Xএকটি ক্যাশকে বৃহত্তর সংখ্যক ক্যোয়ারী পরিচালনা করতে দেয় যা ফলস্বরূপ পারফরম্যান্স বৃদ্ধির কারণ হতে পারে। এটি একটি অ্যাপ্লিকেশন-নির্দিষ্ট পরিস্থিতি, তবে এটি মনে রাখা উচিত।
বেন ডি

2
8+ বছর পরে, তবে অস্পষ্টতা সম্পর্কে একটি পয়েন্ট যুক্ত করতে চান যা উল্লেখ করা হয়নি। একটি ডাটাবেসে 200+ টেবিলের সাথে কাজ করা এবং নামকরণের সম্মেলনের মিশ্রণ। কোয়েরির ফলাফলের সাথে ইন্টারেক্ট করে এমন কোড পর্যালোচনা করার সময়, SELECT *বিকাশকারীদের সারণী স্কিমা (গুলি) এর সাথে জড়িত / কলামগুলি প্রভাবিত / উপলভ্য যেমন একটি foreachবা এর মধ্যে নির্ধারণ করতে বাধ্য করে serialize। যা ঘটছে তা ট্র্যাক করার জন্য স্কিমার দিকে বারবার দেখার কাজটি অনিবার্যভাবে ডিবাগিং এবং সম্পর্কিত কোড বিকাশের ক্ষেত্রে জড়িত মোট সময় বাড়িয়ে তুলবে।
fyrye

91

এলেস্টার্ক অক্ষর, "*", নির্বাচনের বিবৃতিতে সারণীতে থাকা সমস্ত কলামের প্রশ্নের সাথে জড়িত শর্টহ্যান্ড is

কর্মক্ষমতা

*সাধারণভাবে সংক্ষেপে হতে পারে ধীর কারণ:

  • সমস্ত ক্ষেত্র সূচিযুক্ত নয়, একটি পূর্ণ টেবিল স্ক্যান জোর করে - কম দক্ষ
  • আপনি SELECT *তারের মাধ্যমে পাঠাতে যা সঞ্চয় করেন তা পূর্ণ টেবিল স্ক্যানের ঝুঁকিপূর্ণ
  • প্রয়োজনের চেয়ে বেশি ডেটা ফিরিয়ে দেওয়া
  • চলক দৈর্ঘ্যের ডেটা টাইপ ব্যবহার করে ট্রেলিং কলামগুলি ফেরত দেওয়ার ফলে অনুসন্ধানের ওভারহেডের ফলাফল হতে পারে

রক্ষণাবেক্ষণ

ব্যবহার করার সময় SELECT *:

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

নকশা

SELECT *একটি বিরোধী নিদর্শন :

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

কখন "নির্বাচন করুন" ব্যবহার করা উচিত?

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

অন্যথায়, ক্যোয়ারিতে যে কলামটি ব্যবহার করা উচিত তা স্পষ্ট করে তালিকাভুক্ত করুন - সারণীর উলাম ব্যবহার করার সময়।


20

আপনি এখনই প্রতিটি কলাম নির্বাচন করতে চাইলেও, কেউ এক বা একাধিক নতুন কলাম যুক্ত করার পরে আপনি প্রতিটি কলাম নির্বাচন করতে নাও চাইবেন। আপনি যদি ক্যোয়ারীটি লেখেন তবে SELECT *আপনি ঝুঁকি নিচ্ছেন যে কোনও সময় কেউ পাঠ্যের একটি কলাম যুক্ত করতে পারে যা আপনার ক্যোয়ারীটিকে আরও ধীরে ধীরে চালিত করে তুলবে যদিও আপনার আসলে সেই কলামটির প্রয়োজন নেই।

আপনি চান এমন একটি নতুন কলাম যুক্ত করলে এর পরিবর্তিত কোডটি কম হবে না?

সম্ভাবনা হ'ল আপনি যদি নতুন কলামটি বাস্তবে ব্যবহার করতে চান তবে আপনাকে যাইহোক আপনার কোডে আরও অনেক পরিবর্তন করতে হবে। আপনি কেবল সংরক্ষণ করছেন , new_column- টাইপিংয়ের কয়েকটি অক্ষর।


21
বিশেষত যদি সেই নতুন কলামটি একটি তিন-মেগাবাইট বিএলওবি হয়
মট্টি ভির্ককুনেন

2
@ মট্টি - তবে আশাকরি তারা "আরে এই টেবিলের উপরে একটি বিশাল বিএলওবি কলাম প্লপ করতে দেয়!" এর চেয়ে আরও বেশি চিন্তাভাবনা করবে ! (হ্যাঁ বোকা আশা করি আমি জানি তবে কোনও ছেলে স্বপ্ন দেখতে পারে না?)
কেওসপ্যান্ডিয়ন

5
পারফরম্যান্স একটি দিক, তবে প্রায়শই একটি সঠিকতার দিকও থাকে: ফলস্বরূপ *প্রত্যাশিত ফলাফলের আকারটি অপ্রত্যাশিতভাবে পরিবর্তিত হতে পারে এবং এটি নিজেই অ্যাপ্লিকেশনটিতে বিপর্যয় ডেকে আনতে পারে: অর্ডিনাল দ্বারা উল্লিখিত কলামগুলি (যেমন: sqldatareader.getstring (2)) হঠাৎ পুনরুদ্ধার করে একটি পৃথক কলাম, যে কোনও INSERT ... SELECT *ভেঙে যাবে এবং আরও অনেক কিছু।
রিমাস রুসানু

2
@ চাওস: টেবিলগুলিতে ব্লব লাগানো আপনার পারফরম্যান্সকে খুব বেশি ক্ষতি করতে পারে না ... আপনি যদি নির্বাচন না করেন ... * ;-)
ডেভ মার্কেল

2
যতক্ষণ না এটি বাস্তব সমস্যা সৃষ্টি করে ততক্ষণ আপনার পারফরম্যান্স সম্পর্কে চিন্তা করা উচিত নয়। এবং এছাড়াও, SELECT *কয়েকটি চরিত্র সংরক্ষণের বিষয় নয়। এটি ডিবাগিংয়ের কয়েক ঘন্টা সময় সাশ্রয়ের বিষয় কারণ নতুন যুক্ত হওয়া কলামগুলি উল্লেখ করা ভুলে যাওয়া সহজ।
লুইস

4

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


"এইভাবে নিরাপদে সংখ্যাসূচক সূচক দ্বারা সমর্থিত হতে পারে" কিন্তু যারা মূঢ় যথেষ্ট হবে কি কখনো চেষ্টা করুন এবং সংখ্যাসূচক সূচক দ্বারা একটি কলাম রেফারেন্স এটা নামের পরিবর্তে !? ভিউতে সিলেক্ট * ব্যবহার করার চেয়ে এন্টি-প্যাটার্নটি আরও খারাপ।
এমজিউইউইন

@ এমজিওউয়েন: select *সূচী দ্বারা কলামগুলি ব্যবহার করা এবং তারপরে ব্যবহার করা ভয়াবহ হতে পারে তবে ফলাফল select X, Y, Zবা select A,B,Cতথ্য পাঠককে কোডে ব্যবহার করা বা তারপরে পাস করা যা 0, 1 এবং 2 কলামের ডেটা দিয়ে কিছু করার প্রত্যাশা করে এক্স, ওয়াই, জেড বা এ, বি, সি উভয় ক্ষেত্রে একই কোডকে কাজ করার অনুমতি দিন। নোট করুন যে কলামগুলির সূচকগুলি ডাটাবেসের ক্ষেত্রে তাদের আদেশের পরিবর্তে SELECT স্টেটমেন্টের মধ্যে তাদের অবস্থানের উপর নির্ভর করবে।
সুপারক্যাট

3

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


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

3

আপনি যদি সত্যই প্রতিটি কলাম চান, আমি নির্বাচন (*) এবং কলামগুলির নামকরণের মধ্যে পারফরম্যান্সের পার্থক্য দেখিনি। কলামগুলির নাম রাখার জন্য ড্রাইভারটি আপনার কোডটিতে কোন কলামগুলি দেখতে প্রত্যাশা করবে সে সম্পর্কে স্পষ্টভাবে বোঝানো যেতে পারে।

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


3

এটি অ্যাপ্লিকেশন এবং ডাটাবেসের মধ্যে সংযোগ হ্রাস হিসাবে ভাবেন।

'কোড গন্ধ' দিকটি সংক্ষিপ্ত করতে:
SELECT *অ্যাপ্লিকেশন এবং স্কিমার মধ্যে একটি গতিশীল নির্ভরতা তৈরি করে। এর ব্যবহারকে সীমাবদ্ধ করা নির্ভরশীলতাটিকে আরও সংজ্ঞায়িত করার একটি উপায়, অন্যথায় ডাটাবেসে পরিবর্তিত হওয়ার ফলে আপনার অ্যাপ্লিকেশন ক্রাশ হওয়ার সম্ভাবনা বেশি।


3

আপনি যদি টেবিলটিতে ক্ষেত্রগুলি যুক্ত করেন তবে সেগুলি স্বয়ংক্রিয়ভাবে আপনার ব্যবহৃত সমস্ত প্রশ্নের মধ্যে অন্তর্ভুক্ত হবে select * । এটি সুবিধাজনক বলে মনে হতে পারে তবে আপনার প্রয়োজনের তুলনায় আপনি আরও বেশি ডেটা আনার কারণে এটি আপনার অ্যাপ্লিকেশনটিকে ধীর করে দেবে এবং এটি আসলে আপনার অ্যাপ্লিকেশনটিকে কোনও সময়ে ক্রাশ করবে।

ফলাফলের প্রতিটি সারিতে আপনি কতটা ডেটা আনতে পারবেন তার সীমা রয়েছে। যদি আপনি আপনার টেবিলগুলিতে ক্ষেত্রগুলি যুক্ত করেন যাতে ফলাফলটি সেই সীমা ছাড়িয়ে যায়, আপনি কোয়েরি চালানোর চেষ্টা করার সময় একটি ত্রুটি বার্তা পাবেন।

এটি এমন ধরণের ত্রুটি যা খুঁজে পাওয়া শক্ত। আপনি এক জায়গায় পরিবর্তন করেছেন এবং এটি অন্য কোনও জায়গায় ফুটে উঠেছে যা আসলে নতুন ডেটা ব্যবহার করে না। এটি এমনকি কম ঘন ঘন ব্যবহৃত হওয়া ক্যোয়ারীও হতে পারে যাতে কেউ এটি ব্যবহার করার আগে কিছুটা সময় নেয়, যা ত্রুটিটিকে পরিবর্তনের সাথে সংযুক্ত করা আরও শক্ত করে তোলে।

ফলাফলের ক্ষেত্রে আপনি কোন ক্ষেত্রটি উল্লেখ করতে চান তা আপনি এই জাতীয় ওভারহেড ওভারফ্লো থেকে নিরাপদ।



2

এই নিবন্ধ থেকে রেফারেন্স নেওয়া।

"নির্বাচন *" এর সাথে কখনই যাবেন না,

আমি "নির্বাচন *" ব্যবহারের একমাত্র কারণ খুঁজে পেয়েছি

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


1

সাধারণত আপনাকে SELECT * ...বিভিন্ন ফলাফলের ডেটা স্ট্রাকচারের ফলাফলগুলি ফিট করতে হয়। ফলাফলটি কোন আদেশে পৌঁছেছে তা নির্দিষ্ট করে না জানিয়ে, সবকিছু ঠিকঠাকভাবে সাজানো কৌশলী হতে পারে (এবং আরও অস্পষ্ট ক্ষেত্রগুলি মিস করা আরও সহজ)।

এইভাবে আপনি সমস্ত অ্যাপ্লিকেশনটিতে এসকিএল অ্যাক্সেস কোডটি না ভেঙে বিভিন্ন কারণে আপনার টেবিলগুলিতে (এমনকি তাদের মাঝখানেও) ক্ষেত্রগুলি যুক্ত করতে পারেন।


1

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

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

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

এটি একই ধরণের যুক্তিযুক্ত কারণ আপনি যদি একটি করছেন তবে আপনার INSERTসর্বদা কলামগুলি নির্দিষ্ট করা উচিত।


1

আমি মনে করি না যে এটির জন্য সত্যিকার অর্থে কম্বল বিধি থাকতে পারে। অনেক ক্ষেত্রে, আমি নির্বাচন * এড়িয়ে চলেছি, তবে আমি ডেটা ফ্রেমওয়ার্কের সাথেও কাজ করেছি যেখানে নির্বাচন * খুব উপকারী ছিল।

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


1

কলামের নাম নির্বাচন করা সম্ভাব্যতাটি উত্থাপন করে যে ডাটাবেস ইঞ্জিন সারণির ডেটা অনুসন্ধান করার চেয়ে সূচীগুলি থেকে ডেটা অ্যাক্সেস করতে পারে।

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


1

আরও বাস্তব কারণ আছে: অর্থ। আপনি যখন ক্লাউড ডাটাবেস ব্যবহার করেন এবং আপনাকে প্রক্রিয়াজাত ডেটার জন্য অর্থ প্রদান করতে হয় তখন ডেটা পড়ার কোনও ব্যাখ্যা নেই যা আপনি অবিলম্বে বাতিল করবেন।

উদাহরণস্বরূপ: বিগকুয়েরি :

অনুসন্ধান মূল্য

অনুসন্ধান মূল্য আপনার এসকিউএল কমান্ড এবং ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি চালনার ব্যয়কে বোঝায়। বিগকোয়ারি এক মেট্রিক ব্যবহার করে প্রশ্নের জন্য চার্জ করে: প্রক্রিয়াজাত বাইটের সংখ্যা।

এবং নিয়ন্ত্রণ প্রক্ষেপণ - নির্বাচন এড়ান * :

সেরা অনুশীলন: নিয়ন্ত্রণ অভিক্ষেপ - আপনার প্রয়োজনীয় কলামগুলি কেবল জিজ্ঞাসা করুন।

অভিক্ষেপ আপনার কোয়েরি দ্বারা পড়া কলামগুলির সংখ্যা বোঝায় to অতিরিক্ত কলাম প্রজেক্ট করা অতিরিক্ত (নষ্ট) I / O এবং বস্তুতীকরণ (লেখার ফলাফল) অন্তর্ভুক্ত করে।

ডেটা ক্যোয়ার করার জন্য SELECT * ব্যবহার করা সবচেয়ে ব্যয়বহুল উপায়। আপনি যখন নির্বাচন নির্বাচন করুন *, বিগকোওয়ারি টেবিলের প্রতিটি কলামের পুরো স্ক্যান করে।


0

স্কিমা ডিজাইনের পূর্বে আপনার প্রয়োজনীয়তাগুলি বুঝতে (যদি সম্ভব হয়)।

ডেটা সম্পর্কে জানুন, 1) সূচি 2) ব্যবহৃত ধরণের স্টোরেজ, 3) বিক্রেতা ইঞ্জিন বা বৈশিষ্ট্যগুলি; অর্থাত্ ... ক্যাশিং, মেমরির ক্ষমতা 4) ডেটাটাইপস 5) টেবিলের আকার 6) ক্যোয়ারির ফ্রিকোয়েন্সি 7) উত্সটি ভাগ করা থাকলে সম্পর্কিত কাজের চাপগুলি 8) পরীক্ষা

ক) প্রয়োজনীয়তা পৃথক হবে। যদি হার্ডওয়্যার প্রত্যাশিত কাজের চাপকে সমর্থন না করতে পারে তবে কীভাবে কাজের চাপে প্রয়োজনীয়তা সরবরাহ করতে হয় তা আপনার পুনরায় মূল্যায়ন করা উচিত। সারণিতে সংযোজন কলাম সম্পর্কিত। যদি ডাটাবেস ভিউ সমর্থন করে, আপনি নির্দিষ্ট নামযুক্ত কলামগুলি (বনাম। নির্বাচন করুন '*') দিয়ে নির্দিষ্ট ডেটাটির একটি সূচক (?) দর্শন তৈরি করতে পারেন। "আবর্জনা-ইন" -> "আবর্জনা-আউট" সিন্ড্রোমে কখনই চালিত হন না তা পর্যায়ক্রমে আপনার ডেটা এবং স্কিমা পর্যালোচনা করুন।

ধরে নিচ্ছি এর আর কোনও সমাধান নেই; আপনি নিম্নলিখিত অ্যাকাউন্টগুলিতে নিতে পারেন। সবসময় একটি সমস্যার একাধিক সমাধান থাকে।

1) সূচীকরণ: নির্বাচন করুন * একটি টেবিলস্ক্যান সম্পাদন করবে। বিভিন্ন কারণের উপর নির্ভর করে এটিতে একটি ডিস্ক সন্ধান এবং / অথবা অন্যান্য প্রশ্নের সাথে যুক্ত থাকতে পারে। যদি টেবিলটি বহুমুখী হয় তবে নিশ্চিত হয়ে নিন যে সমস্ত প্রশ্নগুলি পারফরম্যান্ট এবং নীচে আপনি টার্গেটের সময় সম্পাদন করেছেন। যদি প্রচুর পরিমাণে ডেটা থাকে এবং আপনার নেটওয়ার্ক বা অন্যান্য সংস্থান টিউন করা হয় না; আপনার এটি বিবেচনায় নেওয়া দরকার। ডাটাবেস একটি ভাগ পরিবেশ।

2) স্টোরেজ ধরণ। উদাহরণস্বরূপ: আপনি যদি এসএসডি, ডিস্ক বা মেমরি ব্যবহার করেন। I / O বার এবং সিস্টেমে / সিপিইউতে বোঝা আলাদা হবে।

3) ডিবিএ উচ্চতর পারফরম্যান্সের জন্য ডাটাবেস / টেবিলগুলি টিউন করতে পারে? যে কোনও কারণেই ধরে নিয়ে, দলগুলি সিদ্ধান্ত নিয়েছে যে '*' সমস্যাটির সেরা সমাধান; ডিবি বা টেবিলটি মেমরিতে লোড করা যায়? (বা অন্য পদ্ধতি ... সম্ভবত প্রতিক্রিয়াটি 2-3 সেকেন্ড বিলম্বের সাথে সাড়া দেওয়ার জন্য ডিজাইন করা হয়েছিল? --- যখন কোনও বিজ্ঞাপন সংস্থার আয় উপার্জনের জন্য খেলে ...)

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

5) সারণী / তথ্য আকার। ছোট টেবিলের সাথে '*' নির্বাচন করা সাধারণ। এগুলি সাধারণত স্মৃতিতে ফিট করে এবং প্রতিক্রিয়ার সময়গুলি দ্রুত। আবার .... আপনার প্রয়োজনীয়তা পর্যালোচনা। বৈশিষ্ট্য বিন্দু জন্য পরিকল্পনা; সর্বদা বর্তমান এবং সম্ভাব্য ভবিষ্যতের প্রয়োজনগুলির জন্য পরিকল্পনা করুন।

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

7) সম্পর্কিত কাজের চাপ। কীভাবে সংস্থানগুলি ব্যবহৃত হয় তা বুঝুন। নেটওয়ার্ক / সিস্টেম / ডাটাবেস / টেবিল / অ্যাপ্লিকেশন নিবেদিত, বা ভাগ করা হয়? কারা স্টেকহোল্ডার? এটি কি উত্পাদন, বিকাশ, বা কিউএর জন্য? এটি কি একটি অস্থায়ী "দ্রুত সমাধান"। আপনি পরিস্থিতি পরীক্ষা করেছেন? আপনি আজ অবাক হবেন যে আজকের হার্ডওয়্যারটিতে কতগুলি সমস্যা থাকতে পারে। (হ্যাঁ, পারফরম্যান্স দ্রুত ... তবে নকশা / পারফরম্যান্সটি এখনও অবনমিত হয়েছে)) সিস্টেমটি কি প্রতি সেকেন্ডে 5 কে-এর তুলনায় 10-10 ক্যোয়ারী বনাম 5-10 কোয়েরি করা দরকার? ডেটাবেস সার্ভার উত্সর্গীকৃত, বা অন্যান্য অ্যাপ্লিকেশনগুলি করে, মনিটরিং ভাগ করা সংস্থার উপর চালিত হয়। কিছু অ্যাপ্লিকেশন / ভাষা; ও / এস এর 100% মেমরি গ্রাস করবে বিভিন্ন লক্ষণ / সমস্যা সৃষ্টি করে।

8) পরীক্ষা: আপনার তত্ত্বগুলি পরীক্ষা করে দেখুন এবং আপনি যতটা পারেন তা বুঝতে পারেন। আপনার নির্বাচিত '*' ইস্যুটি একটি বড় ব্যাপার হতে পারে, বা এটি এমন কিছু হতে পারে যা আপনার এমনকি চিন্তারও দরকার নেই।

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