* নির্বাচন না করার কারণ কী?


136

আমি বেশিরভাগ লোকের দাবী দেখেছি যে আপনার নির্বাচিত ক্যোয়ারিতে আপনার প্রতিটি কলামের বিশেষভাবে নামকরণ করা উচিত।

ধরে নিচ্ছি যে আমি যাই হোক না কেন সমস্ত কলাম ব্যবহার করব, কেন আমি ব্যবহার করব না SELECT *?

এমনকি * এসকিউএল কোয়েরি প্রশ্নটি বিবেচনা করে - ভিউ থেকে * নির্বাচন করুন বা নির্বাচন থেকে কল 1, কল 2,… কোলন * নির্বাচন করুন, আমি মনে করি না যে আমি কিছুটা ভিন্ন দৃষ্টিকোণ থেকে সমস্যাটির কাছে আসছি কারণ এটি হুবহু সদৃশ।

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

বলেছিল, ব্যবহার না করার জন্য SELECT *কি ওভাররাইডিংয়ের সমস্যা আছে ?

উত্তর:


168

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

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


সুতরাং কলাম নির্বাচন করা অকালীন অপ্টিমাইজেশন নয়। আমার মাথার উপরে কিছু জিনিস ...

  1. যদি আপনি কোনও এসকিউএল বিবৃতিতে কলামগুলি নির্দিষ্ট করেন, যদি সেই কলামটি টেবিল থেকে সরানো হয় এবং কোয়েরি কার্যকর করা হয় তবে এসকিউএল এক্সিকিউশন ইঞ্জিন ত্রুটি করবে।
  2. আপনি যে কলামটি ব্যবহৃত হচ্ছে সেখানে আপনি আরও সহজেই স্ক্যান করতে পারেন।
  3. ন্যূনতম পরিমাণ তথ্য ফিরিয়ে আনতে আপনার সর্বদা প্রশ্ন লিখতে হবে।
  4. অন্যরা যেমন উল্লেখ করেছে যে আপনি যদি অরমনাল কলাম অ্যাক্সেস ব্যবহার করেন তবে আপনার কখনও নির্বাচন করা উচিত নয় *
  5. যদি আপনার এসকিউএল বিবৃতি টেবিলগুলিতে যোগদান করে তবে নির্বাচন করুন * আপনাকে যোগদানের সমস্ত টেবিল থেকে সমস্ত কলাম দেয়

বাস্তবটি হ'ল ব্যবহার করা select *...

  1. অ্যাপ্লিকেশন দ্বারা ব্যবহৃত কলামগুলি অস্বচ্ছ
  2. ডিবিএ এবং তাদের ক্যোয়ারী প্রোফাইলাররা আপনার অ্যাপ্লিকেশনটির খারাপ পারফরম্যান্সে সহায়তা করতে অক্ষম
  3. কোডগুলি পরিবর্তনযুক্ত হলে আরও ভঙ্গুর হয়
  4. আপনার ডাটাবেস এবং নেটওয়ার্ক ক্ষতিগ্রস্থ হচ্ছে কারণ তারা অত্যধিক ডেটা (আই / ও) ফিরিয়ে আনছে
  5. আপনি নির্বিশেষে সমস্ত তথ্য (যৌক্তিক) ফিরিয়ে আনার কারণে ডাটাবেস ইঞ্জিন অপ্টিমাইজেশনের পরিমাণ ন্যূনতম।

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


2
আপনার প্রথম বিভাগে, পয়েন্ট # 5 পড়তে হবে "নির্বাচন করুন * আপনাকে যোগদানের সমস্ত টেবিল থেকে সমস্ত কলাম দেয় "। আপনার দ্বিতীয় বিভাগে, পয়েন্ট # 2 এবং # 5 অগত্যা সত্য নয় এবং "নির্বাচন করুন *" ব্যবহার না করার কারণ হিসাবে তালিকাভুক্ত করা উচিত নয়।
জিম্মিওর

1
@uglysmurf - সংশোধন করার জন্য ধন্যবাদ, তবে 2 এবং 5 এর ক্ষেত্রে - যদিও তারা সব ক্ষেত্রে সমস্ত ডাটাবেস / ডিবিএর ক্ষেত্রে অগত্যা সত্য হতে পারে না, তবে আমি মনে করি যে তারা বেশিরভাগ ক্ষেত্রেই গুরুত্বপূর্ণ এবং বৈধ এবং তাদের ছেড়ে চলে যাবে। 'সিলেক্ট *' ব্যবহার করে কোনও ডিবিএর কাজ কখনও সহজ করেনি।
রবার্ট পলসন

11
আমি যুক্তি দিয়েছিলাম যে # 3 (ব্রিট কোড) সত্য নয়। প্রয়োগের উপর নির্ভর করে নির্বাচন করুন * এটি কম ভঙ্গুর হতে পারে, তবে কীভাবে এটি আরও বেশি হতে পারে তা আমি দেখতে পাচ্ছি না।
জনএফএক্স

2
@ জোএনএফএক্স, আমি অনুমান করি আপনি ভঙ্গুরটিকে আলাদাভাবে সংজ্ঞায়িত করেছেন। ভঙ্গুর সাধারণত 'ব্রেক সহজেই' হিসাবে সংজ্ঞায়িত হয়। অজানা বা হার্ড-টু-সন্ধানের নির্ভরতা থাকা কারণ কোডের প্রতিটি টুকরাই বিভিন্ন কলাম ব্যবহার করবে এর অর্থ আমি সম্পূর্ণ পর্যায়ে বাধা ছাড়াই সহজেই ডেটা স্তরে কোনও পরিবর্তন করতে পারি না .. যা ভঙ্গুর বলে মনে হয়।
রবার্ট পলসন

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

42

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

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

এটি পরিকল্পনার প্রয়োগের ক্যাশে ওভারহেড যুক্ত করে যেহেতু * কলামগুলিতে কী রয়েছে তা জানতে টেবিলটি সম্পর্কে মেটা ডেটা আনতে হবে।


4
ভাল উত্তর, তবে আমি "কোডটি ভেঙে" "কোডটি" MAY ব্রেক "এ পরিবর্তন করব। এটাই আসল ঝামেলা, "সিলেক্ট *" ব্যবহারটি সবসময়ই ব্রেকিং পরিবর্তন করে না। এবং যখন বিরতি ঘটে তখন সাধারণত ব্যবহারটি শেষ হয়ে যায় যা ভাঙা শেষ হয় highly
বিকিউ।

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

1
তারপরে প্রোগ্রামার ত্রুটিটি লিখিত কোডের মধ্যে রয়েছে যা কলামগুলির ক্রমের উপর নির্ভর করে। আপনার কখনই এটি করার দরকার নেই।
dkretz

1
@ ডুফলেডরফার - কখনও বলবেন না। অর্ডিনাল কলামগুলি অ্যাক্সেস করা এটি দ্রুততর এবং এটি সময়ে সময়ে ব্যবহারিক হয়। অর্ডিনাল অ্যাক্সেস ব্যবহারের চেয়ে নির্বাচন * নির্বাচন করা বড় ত্রুটি।
রবার্ট পলসন 21

23

একটি বড় কারণ হ'ল আপনি যদি কখনও নিজের টেবিল থেকে কলামগুলি যুক্ত / সরিয়ে থাকেন তবে যে কোনও প্রশ্ন / পদ্ধতি যা একটি নির্বাচন করুন * কল করছে সেগুলি এখন প্রত্যাশার চেয়ে আরও কম বা কম ডেটা কলাম পাবে।


3
আপনার কখনই কোড লিখতে হবে না যা যেভাবেই ফিরে আসা কলামগুলির সংখ্যার উপর নির্ভর করে।
dkretz

4
তবে প্রত্যেকে কোড লিখছে যার প্রয়োজনে প্রোগ্রামাররা জানতে পারে যে কোন ডেটা ফিরে আসছে। আপনার কলামের নামটি একটি নির্বাচন * এ লুকানো থাকলে আপনি Ctrl + F করতে পারবেন না।
লোটাস নোট 21

17
  1. রাউন্ড আউট পদ্ধতিতে আপনি যেখানেই সম্ভব কঠোর টাইপিং ব্যবহারের সম্পর্কে মডুলারিটির নিয়ম ভঙ্গ করছেন। স্পষ্টত প্রায় সার্বজনীন ভাল।

  2. এমনকি যদি আপনার এখন সারণীতে প্রতিটি কলামের প্রয়োজন হয় তবে পরে আরও যুক্ত করা যেতে পারে যা আপনি যখনই ক্যোয়ারি চালাবেন তখন নীচে টানতে হবে এবং কার্য সম্পাদনকে আঘাত করতে পারে। এটি পারফরম্যান্সে ব্যথা দেয় কারণ

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

কখন ব্যবহার করবেন তা নির্বাচন করুন *

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


1
আর SELECT *আপনি যখন ডিবি ক্লায়েন্ট ব্যবহার করে পরীক্ষা কোয়েরি করছেন তখন ব্যবহারের আর একটি সময় হবে।
সিডিএমকেই

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

এছাড়াও নির্বাচন করুন * FROM (একটি নির্বাচন করুন, খ, সি থেকে ফর্ম) ঠিক আছে।
কি.মি.ক্যাপ্লান

12

এখানে কিছু কারন আছে:

  1. যদি কোনও ডাটাবেসে কলামগুলির সংখ্যা পরিবর্তন হয় এবং আপনার অ্যাপ্লিকেশনটি একটি নির্দিষ্ট সংখ্যা হিসাবে প্রত্যাশা করে ...
  2. যদি কোনও ডাটাবেসে কলামগুলির ক্রম পরিবর্তন হয় এবং আপনার অ্যাপ্লিকেশনটি সেগুলি একটি নির্দিষ্ট ক্রমে প্রত্যাশা করে ...
  3. মেমরি ওভারহেড। 8 অপ্রয়োজনীয় INTEGER কলামগুলি নষ্ট মেমরির 32 বাইট যুক্ত করবে। এটি খুব একটা শোনাচ্ছে না, তবে এটি প্রতিটি ক্যোয়ারীর জন্য এবং INTEGER ছোট কলামের একটি ধরণের ... অতিরিক্ত কলামগুলি ভিচারার বা টেক্সট কলামগুলি হওয়ার সম্ভাবনা বেশি, যা আরও দ্রুত সংযোজন করে।
  4. নেটওয়ার্ক ওভারহেড। মেমরির ওভারহেড সম্পর্কিত ভর্চার এবং পাঠ্য কলামগুলি বেশ বড় হতে পারে।

দ্রষ্টব্য: আমি উপরের উদাহরণগুলিতে INTEGER বেছে নিয়েছি কারণ তাদের একটি নির্দিষ্ট আকার 4 বাইট রয়েছে।


1 এবং 2 কোড গন্ধ এবং অকাল অপটিমাইজেশনের মতো 3 এবং 4 শব্দ হবে
নিককিডি

7

যদি আপনার অ্যাপ্লিকেশনটি SELECT * এর সাথে ডেটা পেয়ে যায় এবং ডাটাবেসে টেবিলের কাঠামো পরিবর্তিত হয় (বলুন একটি কলামটি সরানো হয়েছে), আপনি অনুপস্থিত ক্ষেত্রটি উল্লেখ করেছেন এমন জায়গায় আপনার অ্যাপ্লিকেশনটি ব্যর্থ হবে। পরিবর্তে আপনি যদি আপনার ক্যোয়ারীতে সমস্ত কলামগুলি অন্তর্ভুক্ত করেন তবে আপনি আবেদনটি (আশাকরি) এক জায়গায় ভেঙে যাবেন যেখানে প্রাথমিকভাবে আপনি ডেটা পাবেন, ঠিক করা সহজ করে।

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


প্রশ্নটি 'কখনও পছন্দসই নয়' নির্বাচন করা হয়, সুতরাং আপনার উত্তরের ২ য় অংশ অপ্রাসঙ্গিক। প্রশ্নটিতে বলা হয়েছে যে 'সিলেক্ট *' ব্যবহার করা পছন্দনীয় হওয়া উচিত, অবশ্যই কোনটি সম্পূর্ণ বলকগুলি।
রবার্ট পলসন 21

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

হ্যাঁ হ্যাঁ দুঃখিত - প্রশ্নটি আপনার উত্তরের পরে দিক বদলেছে।
রবার্ট পলসন

ঠিক আছে. এমনকি মোজার্ট একজন সম্পাদক ছিলেন ( স্ট্যাকওভারফ্লো . com / জিজ্ঞাসা / 292682/… )। আমার আসল পোস্টটি পরামর্শ দিয়েছে যে নির্বাচন * ব্যবহারের ফলে নরমাংসবাদের দিকে পরিচালিত হয়। :)
MusiGenesis

3

select *এসকিউএল সার্ভার 2005-এ দেখাতে ব্যবহার করার সময় আমি একটি অদ্ভুত আচরণ লক্ষ্য করেছি ।

নীচের ক্যোয়ারীটি চালান এবং আপনি কী বলতে চাইছেন তা আপনি দেখতে পাবেন।

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[starTest]') AND type in (N'U'))
DROP TABLE [dbo].[starTest]
CREATE TABLE [dbo].[starTest](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [A] [varchar](50) NULL,
    [B] [varchar](50) NULL,
    [C] [varchar](50) NULL
) ON [PRIMARY]

GO

insert into dbo.starTest
select 'a1','b1','c1'
union all select 'a2','b2','c2'
union all select 'a3','b3','c3'

go
IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vStartest]'))
DROP VIEW [dbo].[vStartest]
go
create view dbo.vStartest as
select * from dbo.starTest
go

go
IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vExplicittest]'))
DROP VIEW [dbo].[vExplicittest]
go
create view dbo.[vExplicittest] as
select a,b,c from dbo.starTest
go


select a,b,c from dbo.vStartest
select a,b,c from dbo.vExplicitTest

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[starTest]') AND type in (N'U'))
DROP TABLE [dbo].[starTest]
CREATE TABLE [dbo].[starTest](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [A] [varchar](50) NULL,
    [B] [varchar](50) NULL,
    [D] [varchar](50) NULL,
    [C] [varchar](50) NULL
) ON [PRIMARY]

GO

insert into dbo.starTest
select 'a1','b1','d1','c1'
union all select 'a2','b2','d2','c2'
union all select 'a3','b3','d3','c3'

select a,b,c from dbo.vStartest
select a,b,c from dbo.vExplicittest

শেষ 2 নির্বাচন বিবৃতি ফলাফল তুলনা করুন। আমি বিশ্বাস করি আপনি যা দেখতে পাবেন সেটি নামের পরিবর্তে সূচী দ্বারা রেফারেন্সিং কলামগুলি সিলেক্ট করার ফলাফল ।

আপনি যদি ভিউটি পুনর্নির্মাণ করেন তবে এটি আবার ঠিকঠাক হবে।

সম্পাদনা

এসকিউএল সার্ভার 2005-এর আকর্ষণীয় আচরণের আরও বিবরণে দেখার জন্য, আমি একটি পৃথক প্রশ্ন যুক্ত করেছি, * টেবিল থেকে * নির্বাচন করুন * টেবিল থেকে কোল্যা, কোলবি ইত্যাদি নির্বাচন করুন *


2

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

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


2

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

অন্যরা যেমন উল্লেখ করেছে, আপনার ক্যোয়ারিতে (যেমন রক্ষণাবেক্ষণের মতো) ব্যবহার করার ইচ্ছা রয়েছে এমন প্রতিটি কলাম উল্লেখ করার ক্ষেত্রে অন্যান্য ইতিবাচকতা রয়েছে।


2

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


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

পিএল / এসকিউএল-তে ও'রিলি বইয়ের লেখক। গুগলিং "ফেয়ারস্টেইন এসকিএল" চেষ্টা করুন কেবল "ফিউয়ারস্টাইন" এর পরিবর্তে।
অরবফিশ

2

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

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

একটি উদাহরণ:

  • এক্স, ওয়াই, জেড লেবেলযুক্ত ক্ষেত্রগুলিতে স্থানাঙ্ক সহ স্থানে একটি সারণী:

    সারণী স্থানগুলি তৈরি করুন (স্থান_id পূর্ণসংখ্যা, x সংখ্যা (10, 3), y সংখ্যাসূচক (10, 3), z সংখ্যা (10, 3), বর্ণনামূলক বর্ণন);

  • আসুন এটির কয়েকটি উদাহরণের মান সহ খাওয়া দাও:

    INTERTO INTO INTO INTOTOES (place_id, x, y, z, বিবরণ)
    ভ্যালু (1, 2.295, 48.863, 64, 'প্যারিস, প্লেস ডি এল \' টয়লেট '),
    (2, 2,945, 48,858, 40,' প্যারিস, ট্যুর আইফেল '),
    (3, 0.373, 43.958, 90,' কনডম, ক্যাথড্রেল সেন্ট-পিয়ের ');

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

    স্থান বা পয়েন্টগুলি দেখুন বা প্রতিস্থাপন দেখুন
    SELECT *,
    GeomFromewkt ('SRID = 4326; পয়েন্ট (' || x || '' || y || '' || z || ')')
    জায়গা থেকে;

    জিমফ্রোমওয়াক্ট () ফাংশন ব্যবহারের জন্য পোস্টগিস পড়ুন।

  • ফলাফল এখানে:

    নির্বাচন করুন * FROM স্থানের_পয়েন্টগুলি;

স্থান_আইডি | এক্স | y | z | বিবরণ | geomfromewkt                            
---------- + + ------- + + -------- + + -------- + + ------------- ----------------- + + -------------------------------- ------------------------------------  
        1 | 2.295 | 48.863 | 64.000 | প্যারিস, প্লেস ডি ল'টাইল | 01010000A0E61000005C8FC2F5285C02405839B4C8766E48400000000000005040  
        2 | 2.945 | 48.858 | 40.000 | প্যারিস, ট্যুর আইফেল | 01010000A0E61000008FC2F5285C8F0740E7FBA9F1D26D48400000000000004440
        3 | 0.373 | 43.958 | 90.000 | কনডম, ক্যাথড্রেল সেন্ট-পিয়ের | 01010000A0E6100000AC1C5A643BDFD73FB4C876BE9FFA45400000000000805640
(3 টি লাইন)

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

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

আমি আশা করি ভিউ-এর সংজ্ঞাটি * এর সাথে "যেমন আছে" রাখা যেতে পারে, তবে হেলাস এটির মতো নয়: পোস্টগ্রেসকিএল দ্বারা এটি অভ্যন্তরীণভাবে সংরক্ষণ করা হয়:

প্লেস.প্লেস.প্লেস.আইডি, প্লেস.এক্স, প্লেস.ই, প্লেস.জেড, প্লেস.ডেসক্রিপশন, জিওমফ্রোমওয়াকটি (((('এসআরআইডি = 4326; পয়েন্ট (' :: পাঠ্য || স্থানগুলি। এক্স)) || '': : পাঠ্য) || যায়গা.ই) || '' :: :: পাঠ্য) || ਸਥਾਨ.z) || ')' :: পাঠ্য) AS geomfromewkt FROM জায়গাগুলি;


1

এমনকি আপনি যদি প্রতিটি কলাম ব্যবহার করেন তবে সংখ্যা সূচক দ্বারা সারি অ্যারে সম্বোধন করে আপনি পরে অন্য সারি যুক্ত করলে আপনার সমস্যা হবে।

সুতরাং মূলত এটি রক্ষণাবেক্ষণের প্রশ্ন! আপনি যদি * নির্বাচক ব্যবহার না করেন তবে আপনাকে আপনার প্রশ্নগুলির বিষয়ে চিন্তা করতে হবে না।


1

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

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


1

এটি আপনার কোডটিকে আরও অস্পষ্ট এবং বজায় রাখা আরও কঠিন করে তোলে; কারণ আপনি ডোমেনে অতিরিক্ত অব্যবহৃত ডেটা যুক্ত করছেন এবং আপনি কোনটি উদ্দেশ্য এবং কোনটি নয় তা পরিষ্কার নয়। (এটি আপনাকে পরামর্শও দেয় না, বা যত্ন নিতে পারে না এমনও পরামর্শ দেয়))


1

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

আপনার অ্যাপ্লিকেশনটির যে সম্পর্কিত বিমূর্ত স্তরটি রিলেশনাল অ্যাক্সেস সরবরাহ করে তার সুবিধা নেওয়া উচিত।


1

আমি কেবল নির্বাচন * ব্যবহার করি না কারণ আমি কোন ক্ষেত্রগুলি পুনরুদ্ধার করছি তা দেখতে এবং জেনে ভাল লাগছে।


1

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


1

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


1

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

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


0

কারণ যখন আপনার সমস্ত ক্ষেত্রের প্রয়োজন হবে না তখন "নির্বাচন করুন *" মেমোরি নষ্ট করবে। তবে এসকিএল সার্ভারের জন্য, তাদের পারফর্মেন্স একই the

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