"টেবিল থেকে নির্বাচন করুন" কেন খারাপ অভ্যাস হিসাবে বিবেচিত হয়


96

গতকাল আমি একটি "শখ" প্রোগ্রামার (আমি নিজে একটি পেশাদার প্রোগ্রামার) সাথে আলোচনা করছিলাম। আমরা তার কিছু কাজ জুড়ে এসেছি এবং তিনি বলেছিলেন যে তিনি সর্বদা তার ডাটাবেসে সমস্ত কলাম অনুসন্ধান করে (এমনকি প্রোডাকশন সার্ভার / কোডেও)।

আমি তাকে এটি না করার জন্য বোঝানোর চেষ্টা করেছি, তবে এখনও এতটা সফল হয়নি। আমার মতে একজন প্রোগ্রামারকে কেবল "pretiness", দক্ষতা এবং ট্র্যাফিকের প্রয়োজনে কী প্রয়োজন তা জিজ্ঞাসা করা উচিত। আমি কি আমার দৃষ্টিভঙ্গিতে ভুল করছি?


1
টেবিলের বিষয়বস্তু পরিবর্তন হলে আমি কী করব? কলামগুলি যুক্ত / সরানো হচ্ছে? আপনার এখনও নির্বাচন করছেন * .. সুতরাং আপনি জিনিসগুলি হারিয়ে যাবেন বা আপনার প্রয়োজনের চেয়ে আরও বেশি ডেটা টেনে তুলবেন।
জেএফ এটি

2
@ জেফিট এটি এর অংশ, তবে পুরো গল্প থেকে দূরে।
w

8
- তাই এ গুড কারণে stackoverflow.com/questions/3180375/select-vs-select-column
Bratch


@ প্রশ্ন একটি প্রশ্ন কি সত্যিই একটি বদ্ধ প্রশ্নের নকল হিসাবে বিবেচনা করা যেতে পারে? (অর্থাত বন্ধ
হওয়াটি

উত্তর:


67

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

এখন ভাবুন যে কেউ যখন সরাসরি ব্যবহার করছেন না এমন একটি কলাম যুক্ত করতে (বা অপসারণ) করতে টেবিল স্কিমা আপডেট করে তখন কী ঘটে।

আপনি যখন হাত দ্বারা প্রশ্নগুলি টাইপ করছেন তখন নির্বাচন করুন * ব্যবহার করা ভাল, আপনি যখন কোডের জন্য কোয়েরি লিখছেন তখন নয়।


8
ক্রম এবং আপনার নামটি দিয়ে কলামগুলি ফিরে পাওয়ার সুবিধার চেয়ে পারফরম্যান্স, নেটওয়ার্ক লোড ইত্যাদি far
14:38

21
সত্যিই কি জওয়ান্টিং? পারফরম্যান্সের চেয়েও সঠিকতা বেশি? যাইহোক, আমি দেখতে পাচ্ছি না যে "নির্বাচিত *" আপনার পছন্দমতো কলামগুলি নির্বাচন করার চেয়ে ভাল সম্পাদন করে।
gbjbaanb

9
@ ব্র্যাচ, বাস্তব জীবনের উত্পাদন পরিবেশে, আপনার একই টেবিলে ব্যবহার করে শত শত অ্যাপ্লিকেশন থাকতে পারে এবং এই অ্যাপ্লিকেশনগুলি সঠিকভাবে বজায় রাখা সম্ভব হয় না। আপনি অনুভূতিতে সঠিক, কিন্তু কার্যত, কপিরাইটগুলিতে কাজ করার বাস্তবতার কারণে যুক্তিটি ব্যর্থ হয়। সক্রিয় টেবিলগুলিতে স্কিমা পরিবর্তনগুলি সর্বদা ঘটে।
ব্যবহারকারী 1068

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

11
@gbjbaanb তারপরে নাম দিয়ে কলামগুলি অ্যাক্সেস করুন। আপনি কোয়েরিতে কলামের ক্রমটি নির্দিষ্ট না করে অন্য যে কোনও কিছু স্পষ্টতই বোকা হয়ে উঠবে।
ইমিগ্রিস

179

স্কিমা পরিবর্তন

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

যে কোনও উপায়ে, একটি স্কিমা পরিবর্তন ডেটা উত্তোলনে সমস্যা সৃষ্টি করতে পারে।

আরও বিবেচনা করুন যে কলামটি ব্যবহৃত হচ্ছিল তা যদি টেবিল থেকে সরিয়ে ফেলা হয়। select * from ...ফলাফল সেট থেকে ডেটা টেনে আনার চেষ্টা করার পরে এখনও ত্রুটিগুলি কাজ করে। যদি কলামটিতে কলামটি সুনির্দিষ্ট করা হয়েছে, সমস্যাটি কী এবং কোথায় তা নিয়ে পরিষ্কার ইঙ্গিত দেওয়ার পরিবর্তে ক্যোয়ারী ত্রুটিযুক্ত হবে।

উপরি উপাত্ত

কিছু কলামের সাথে তাদের সাথে যুক্ত পরিমাণের পরিমাণের পরিমাণ থাকতে পারে। ফিরে নির্বাচন *টান হবে সব তথ্য। হ্যাঁ, varchar(4096)এটি এমন 1000 সারি যা আপনার পছন্দ করে না এমন অতিরিক্ত 4 মেগাবাইট ডেটা দেওয়ার দরকার যা আপনি বেছে নিলেন তা কেবল তারের জুড়েই পাঠানো হয়েছে।

স্কিমা পরিবর্তনের সাথে সম্পর্কিত, আপনি প্রথমে টেবিলটি তৈরি করার সময় সেই বার্চারের অস্তিত্ব থাকতে পারে now

অভিপ্রায় জানাতে ব্যর্থ

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


আসুন এমন কিছু এসকিউএল ফিডলগুলি দেখুন যা এই স্কিমাটি আরও কিছুটা পরিবর্তিত করে explore

প্রথমত, প্রাথমিক ডাটাবেস: http://sqlfiddle.com/#!2/a67dd/1

DDL:

create table one (oneid int, data int, twoid int);
create table two (twoid int, other int);

insert into one values (1, 42, 2);
insert into two values (2, 43);

এসকিউএল:

select * from one join two on (one.twoid = two.twoid);

এবং কলাম আপনাকে ফেরত পেতে হয় oneid=1, data=42, twoid=2, এবং other=43

এখন, আমি যদি কোনও টেবিলের সাথে একটি কলাম যুক্ত করি তবে কী হবে? http://sqlfiddle.com/#!2/cd0b0/1

alter table one add column other text;

update one set other = 'foo';

একই ক্যোয়ারী থেকে আমার ফলাফল হিসাবে সামনে দাঁড়িয়ে আছে oneid=1, data=42, twoid=2, এবং other=foo

সারণীর একটির পরিবর্তনের ফলে একটি এর মান ব্যাহত হয় select *এবং হঠাৎ আপনার 'অন্য' এর কোনও সংখ্যার সাথে আবদ্ধকরণ একটি ত্রুটি ফেলতে চলেছে এবং কেন আপনি তা জানেন না।

পরিবর্তে যদি আপনার এসকিউএল বিবৃতি ছিল

select 
    one.oneid, one.data, two.twoid, two.other
from one join two on (one.twoid = two.twoid);

এক টেবিলের পরিবর্তনে আপনার ডেটা ব্যাহত হবে না। পরিবর্তনের আগে এবং পরিবর্তনের পরে সেই ক্যোয়ারি একই রকম চলে।


ইন্ডেক্সিং

যখন আপনি একটি করেন select * fromআপনি সমস্ত সারি টানছেন শর্তগুলির সাথে মেলে এমন সমস্ত সারণী তৈরি করে। এমনকি আপনি যে টেবিলগুলি সত্যই যত্নবান হন না। যদিও এর অর্থ আরও ডেটা স্থানান্তরিত হয়েছে সেখানে স্ট্যাকটি আরও লুকিয়ে আছে আরও একটি কার্য সম্পাদনের সমস্যা।

ইনডেক্সে। (এসও সম্পর্কিত: নির্বাচিত বিবৃতিতে সূচক কীভাবে ব্যবহার করবেন? )

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

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

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

এটি বলছে না যে একটি পূর্ণ সূচক স্ক্যান দুর্দান্ত, এটি এখনও একটি সম্পূর্ণ স্ক্যান - তবে এটি একটি পূর্ণ টেবিল স্ক্যানের চেয়ে ভাল। একবার আপনি এমন সমস্ত উপায়ে তাড়া শুরু করে যা select *কার্যক্ষমতাতে আঘাত দেয় যা আপনি নতুন সন্ধান করে চলেছেন।

সম্পর্কিত পড়া


2
@ টনি আমি সম্মত হয়েছি - তবে আমি যখন উত্তর দিয়েছি (প্রথম) তখন আমি কখনই ভাবিনি যে এই প্রশ্নটি এত বেশি আলোচনা এবং ভাষ্য তৈরি করবে! এটি কেবল নামযুক্ত কলামগুলির জন্য ক্যোয়ারী করা সুস্পষ্ট, তাই না ?!
gbjbaanb

3
কলাম যুক্ত করে সমস্ত কিছু ভাঙারও একটি সঠিক কারণ হ'ল কোডটি সর্বদা হার্ড-কোডেড অর্ডিনাল দ্বারা নয় নামে কোনও ড্যাটারিডারে কলামগুলি অ্যাক্সেস করা উচিত ...
জুলিয়া হ্যাওয়ার্ড

1
@gbjbaanb এটি আমার কাছে। তবে প্রচুর লোকেরা আনুষ্ঠানিক পটভূমি / প্রশিক্ষণ ছাড়াই এসকিউএল কোয়েরি লিখতে আসে। তাদের কাছে এটি সুস্পষ্ট নাও হতে পারে।
টনি

1
@ অ্যারোনট আমি ইন্ডেক্সিং সম্পর্কিত অতিরিক্ত বিট দিয়ে আপডেট করেছি। অন্য কোন বিষয় আছে যা আমার অন্যায় করার জন্য তুলে ধরা উচিত select *?

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

38

আরেকটি উদ্বেগ: যদি এটি একটি JOINক্যোয়ারী হয় এবং আপনি কোয়েরি ফলাফলগুলি একটি এসোসিয়েটিভ অ্যারে (পিএইচপি-র ক্ষেত্রে যেমন হতে পারে) তে পুনরুদ্ধার করেন তবে এটি বাগ-প্রবণ।

জিনিসটি হ'ল

  1. যদি টেবিলের fooকলাম থাকে idএবংname
  2. যদি টেবিল barকলাম হয়েছে idএবং address,
  3. এবং আপনার কোড আপনি ব্যবহার করছেন SELECT * FROM foo JOIN bar ON foo.id = bar.id

অনুমান সেখানে কি ঘটছে যখন কেউ একটি কলাম যোগ nameকরতে barটেবিল।

কোডটি হঠাৎ করে সঠিকভাবে কাজ করা বন্ধ করবে, কারণ এখন nameকলামটি ফলাফলগুলিতে দু'বার প্রদর্শিত হবে এবং আপনি যদি ফলাফলগুলিকে একটি অ্যারেতে সংরক্ষণ করছেন, তবে দ্বিতীয় name( bar.name) থেকে প্রাপ্ত ডেটা প্রথমটিকে name( foo.name) ওভাররাইট করে দেবে !

এটি বেশ বাজে বাগ কারণ এটি খুব অ-স্পষ্ট। এটি নির্ধারণ করতে কিছুটা সময় নিতে পারে এবং টেবিলে অন্য কলাম যুক্ত ব্যক্তি এরকম অনাকাঙ্ক্ষিত পার্শ্ব প্রতিক্রিয়াটি অনুমান করতে পারে এমন কোনও উপায় নেই।

(সত্য গল্প).

সুতরাং, ব্যবহার করবেন না *, আপনি কোন কলামগুলি পুনরুদ্ধার করছেন তা নিয়ন্ত্রণে রাখুন এবং যেখানে উপযুক্ত হবে সেখানকার এলিয়াসগুলি ব্যবহার করুন।


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

4
তাত্ত্বিকভাবে, তবে আপনি যদি সুবিধার জন্য কোনও ওয়াইল্ডকার্ড ব্যবহার করেন তবে স্বয়ংক্রিয়ভাবে আপনাকে সমস্ত কলামগুলি অস্তিত্ব দেওয়ার জন্য আপনি তার উপর নির্ভর করেন এবং টেবিলগুলি বাড়ার সাথে সাথে কোয়েরিটি আপডেট করার জন্য কখনও বিরক্ত করবেন না। আপনি যদি প্রতিটি কলামটি নির্দিষ্ট করে থাকেন তবে আপনার SELECTক্লজটিতে আরও একটি যুক্ত করার জন্য আপনি ক্যোয়ারিতে যেতে বাধ্য হন এবং আপনি যখন আশা করেন যে নামটি অনন্য নয়। বিটিডাব্লু আমি মনে করি না যে এটি বড় ডেটাবেসযুক্ত সিস্টেমে এত বিরল। যেমনটি আমি বলেছিলাম, আমি একবার পিএইচপি কোডের একটি বড় মাডবলে এই বাগটি শিকারে কয়েক ঘন্টা ব্যয় করেছি। এবং আমি এখনই অন্য একটি মামলা পেয়েছি: stackoverflow.com/q/17715049/168719
কনরাড মোরাওস্কি

3
আমি এএ পরামর্শদাতদের হেডের মাধ্যমে এটি পাওয়ার চেষ্টা করে গত সপ্তাহে এক ঘন্টা ব্যয় করেছি। তাঁর এসকিউএল গুরু হওয়ার কথা ... দীর্ঘশ্বাস ...
টনি

22

প্রতিটি কলামে জিজ্ঞাসা করা অনেক ক্ষেত্রে পুরোপুরি বৈধ হতে পারে।

সর্বদা প্রতিটি কলাম অনুসন্ধান করা হয় না।

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

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

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

কলামগুলি তাদের ক্রম পরিবর্তন করার ঝুঁকিটি চালান। ঠিক আছে, আপনাকে এই নিয়ে মাথা ঘামানোর দরকার নেই (এবং আপনি কেবলমাত্র প্রয়োজনীয় কলামগুলি নির্বাচন করলে তা পাবেন না ) তবে, যদি আপনি সেগুলি একবারে পেয়ে যান এবং অন্য কেউ [অন্য] টেবিলের মধ্যে কলামের ক্রমটি পুনরায় সাজানোর সিদ্ধান্ত নেন , যা সাবধানে তৈরি করা হয়েছে, সিএসভি রফতানি করে আপনি হলের অ্যাকাউন্টগুলিতে হঠাৎ করে পটতে চলে যান - আবার কোনও তাত্পর্যপূর্ণ কারণ হিসাবে।

বিটিডাব্লু, আমি উপরে কয়েকবার "অন্য কাউকে [অন্য]" বলেছি। মনে রাখবেন যে ডাটাবেসগুলি সহজাতভাবে বহু ব্যবহারকারীর হয়; আপনি মনে করেন যে আপনি করেন তা আপনার উপর নিয়ন্ত্রণ নাও থাকতে পারে।


3
আমি মনে করি যে সবসময় প্রতিটি কলাম জিজ্ঞাসা করা স্কিমা-অজনোস্টিক টেবিল দেখার সুবিধার মতো জিনিসের জন্য বৈধ হতে পারে। একটি ভয়াবহ সাধারণ পরিস্থিতি নয়, তবে কেবলমাত্র অভ্যন্তরীণ-ব্যবহারের সরঞ্জামগুলির প্রসঙ্গে এই জাতীয় জিনিসগুলি সহজেই কার্যকর হতে পারে।
সুপারক্যাট

1
@ সুপের্যাট এটি কেবলমাত্র "নির্বাচন করুন" "এর জন্য কেবলমাত্র বৈধ ব্যবহারের ক্ষেত্রে যা আমি ভাবতে পারি। এবং তারপরেও আমি ক্যোরিটিকে "নির্বাচন করুন শীর্ষ 10 *" (এমএস এসকিউএল তে) বা "লিমিটেড 10" (মাইএসকিউএল) যুক্ত করতে বা "যেখানে সজ্জিত </ 10" (ওরাকল) যুক্ত করতে পছন্দ করব। সাধারণত সেক্ষেত্রে এটি সম্পূর্ণ সামগ্রীর চেয়ে "কী কী কলাম রয়েছে এবং কিছু নমুনা ডেটা" সম্পর্কে আরও বেশি।
টনি

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

@ সুপের্যাট আমি তাতে একমত হতে পারি এবং আপনি এটি আপনার শেষ বাক্যে যেভাবে রেখেছেন তা আমি সত্যিই পছন্দ করি। আমাকে সেটাই মনে রাখতে হবে।
টনি

11

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

এটি বলেছিল যে, আপনি এখনও নির্বাচন করুন * এর সাথে যে কোনও ডেটা স্ট্রাকচার ব্যবহার করছেন এবং বাকী কোডটিতে কাজ করতে পারেন তবে আপনি যদি স্কেল করতে চান তবে পারফরম্যান্সের বাধা খুঁজে পেতে পারেন।

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

অবশ্যই, এসকিউএল কোয়েরি করতে পারে এমন একটি প্রোগ্রামার বিনিয়োগের চেয়ে র‌্যাম এবং সিপিইউ যুক্ত করা সস্তা এবং জওআইএন কী কী তা সম্পর্কে একটি অস্পষ্ট বোধও রয়েছে।


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

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

@ সিএইচওও আমি কয়েক দশক ধরে বিভিন্ন ধরণের ডাটাবেস সম্পর্কে খুব সচেতন ছিলাম । পিক "নসকিউএল" ডাটাবেস চিরকালই ছিল। "নোএসকিউএল" এমনকি দূরবর্তীভাবে একটি নতুন ধারণা নয়। ওআরএম এর চিরকালের জন্যও ছিল, এবং সেগুলি সর্বদা ধীর ছিল। ধীর! = ভাল কমনীয়তার (লিনকিউ?) হিসাবে, আপনি আমাকে বোঝাতে পারবেন না যে এটি একটি যুক্তির জন্য যুক্তিসঙ্গত বা মার্জিত: পাতায় আপত্তি করার সময়Customer customer = this._db.Customers.Where( “it.ID = @ID”, new ObjectParameter( “ID”, id ) ).First(); দেখুন 2
ক্রেগ

@ ক্রেইগ: আমাকে ওআরএম থেকে শুরুও করবেন না। প্রায় প্রতিটি সিস্টেমে এটি মারাত্মকভাবে করে এবং বিমূর্ততা সমস্ত জায়গায় ছড়িয়ে পড়ে। কারণ রিলেশনাল ডিবি রেকর্ডগুলি বস্তু নয় - সর্বোপরি, তারা কোনও বস্তুর অংশের ক্রমবর্ধমান সাহস। তবে লিনকু হিসাবে, আপনি কি সত্যিই সেখানে যেতে চান? এসকিউএলিশ সমতুল্য হ'ল var cmd = db.CreateCommand(); cmd.CommandText = "SELECT TOP 1 * FROM Customers WHERE ID = @ID"; cmd.Parameters.AddWithValue("@ID", id); var result = cmd.ExecuteReader();.... এবং তারপরে প্রতিটি সারি থেকে একটি গ্রাহক তৈরি করতে এগিয়ে যান। লিনকিউ প্যান্টকে মারধর করে।
সিএওও

@ ক্রেইগ: ঠিক আছে, এটি যতটা মার্জিত তা হতে পারে না। তবে এটি কখনই আমি মার্জিত হতে চাই না যতক্ষণ না এটি। নেট কোডকে এসকিউএলে রূপান্তর করতে পারে। :) কোন মুহুর্তে আপনি বলতে পারেন var customer = _db.Customers.Where(it => it.id == id).First();
সিএইচও

8

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

একটি এন-টায়ার্ড পদ্ধতির মধ্যেও এটি ডাটাবেস স্কিমার বাধাগুলি ডেটা স্তরগুলিতে আলাদা করা এখনও সেরা। যদি আপনার ডেটা স্তরটি ব্যবসায়ের যৌক্তিকতায় * প্রেরণ করে এবং সম্ভবত উপস্থাপনা স্তরতে চলে যায়, আপনি আপনার ডিবাগিং স্কোপটি তাত্পর্যপূর্ণভাবে প্রসারিত করছেন।


3
এটি সম্ভবত এখানে সবচেয়ে গুরুত্বপূর্ণ কারণগুলির মধ্যে একটি এবং এটি কেবলমাত্র ভোটের একটি ক্ষুদ্র ভগ্নাংশ পেয়েছে। কোনও কোডবেসের জঞ্জাল রক্ষণাবেক্ষণের select *বিষয়টি আরও খারাপ!
ইমন নারবোন

6

কারণ যদি টেবিলটি নতুন কলামগুলি পেয়ে থাকে তবে আপনি যখন সেগুলির দরকার নেই তখনও আপনি সেগুলি পেয়ে যান। সঙ্গে varcharsএই ডিবি থেকে ভ্রমণ করতে প্রয়োজন অতিরিক্ত তথ্য অনেকটা হতে পারে

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


1

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


3
সম্মত হন, যদিও আমি যে কোনও ক্ষেত্রে কলামের নাম দ্বারা নির্ধারিত ফলাফল থেকে মানগুলি বের করার প্রস্তাব দিই।
ররি হান্টার

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

1

এটি যে উদ্দেশ্যে তৈরি করা হচ্ছে তার জন্য আপনি কেন ব্যবহার করবেন না - এমন কোনও কারণ আমি দেখতে পাচ্ছি না - একটি ডাটাবেস থেকে সমস্ত কলাম পুনরুদ্ধার করুন। আমি তিনটি কেস দেখতে পাচ্ছি:

  1. ডাটাবেসে একটি কলাম যুক্ত করা হয় এবং আপনি এটি কোডেও চান। ক) সাথে * একটি সঠিক বার্তা দিয়ে ব্যর্থ হবে। খ) * ব্যতীত কাজ করবে, তবে আপনি যা প্রত্যাশা করছেন তা খারাপ করবে না won't

  2. ডাটাবেসে একটি কলাম যুক্ত করা হয় এবং আপনি কোডে এটি চান না। ক) সাথে * ব্যর্থ হবে; এর অর্থ হল যে * এর ফলে আর প্রয়োগ হয় না কারণ এর শব্দার্থক অর্থ "সমস্ত পুনরুদ্ধার করুন"। খ) * ছাড়া কাজ করবে।

  3. একটি কলাম সরানো হয়েছে কোড কোনওভাবেই ব্যর্থ হবে।

এখন সর্বাধিক সাধারণ কেসটি হল কেস 1 (যেহেতু আপনি ব্যবহার করেছেন * যার অর্থ আপনি সম্ভবত সমস্ত চান); * ছাড়াই আপনার কোড থাকতে পারে যা সূক্ষ্মভাবে কাজ করে তবে যা প্রত্যাশিত তা করেন না যা সঠিক ত্রুটি বার্তায় ব্যর্থ হয় এমন কোডটি সবচেয়ে খারাপ

আমি সেই কোডটি বিবেচনা করছি না যা কলাম সূচকের ভিত্তিতে কলামের তথ্য পুনরুদ্ধার করে যা আমার মতে ত্রুটি-প্রবণ। কলাম নামের উপর ভিত্তি করে এটি পুনরুদ্ধার করা আরও অনেক যুক্তিযুক্ত।


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

@ ক্রেইগ আমি বিশ্বাস করি এসকিউএল-এর প্রতিটি বই / টিউটোরিয়াল বলছে এতে select *সমস্ত কলাম পুনরুদ্ধার করার শব্দার্থ রয়েছে; আপনার অ্যাপ্লিকেশনটির যদি সত্যিই এটির প্রয়োজন হয় তবে এটি ব্যবহার না করার কোনও কারণ আমি দেখতে পাচ্ছি না। আপনি কি কিছু রেফারেন্স (ওরাকল, আইবিএম, মাইক্রোসফ্ট ইত্যাদি) নির্দেশ করতে পারেন যা যে উদ্দেশ্যে select *তৈরি হয়েছিল তা উল্লেখ করে সমস্ত কলাম পুনরুদ্ধার করা নয়?
m3th0dman

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

সম্ভবত এখানে বা সেখানে একটি প্রান্তের কেস রয়েছে যা select *একটি আসল উত্পাদন অ্যাপ্লিকেশনটিতে ব্যবহারকে ন্যায়সঙ্গত করে তোলে, তবে প্রান্তের কেসটির প্রকৃতি হ'ল এটি সাধারণ ঘটনা নয়। :-)
ক্রেগ

@ ক্রেইগ কারণগুলি ব্যবহারের বিরুদ্ধে নয় একটি ডাটাবেস থেকে সমস্ত কলাম পুনরুদ্ধারের বিরুদ্ধে select *; আপনার যদি সত্যিই সমস্ত কলামের প্রয়োজন হয় আমি কী বলছিলাম, আপনার ব্যবহার না করার কোনও কারণ আমি দেখতে পাচ্ছি না select *; যদিও কয়েকটি পরিস্থিতিতে অবশ্যই সমস্ত কলামের প্রয়োজন রয়েছে।
m3th0dman

1

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


6
এটি কেবল প্রথম উত্তরে কয়েক ঘন্টা আগে ইতিমধ্যে তৈরি পয়েন্টটির পুনরাবৃত্তি বলে মনে হচ্ছে এবং অন্যান্য উত্তরগুলির মধ্যে কয়েক
জিনাত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.