questions - sql server



নির্বাচন*ব্যবহার না করার কারণ কি? (14)

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

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

এমনকি প্রশ্নটি বিবেচনা করুন * এসকিউএল ক্যোয়ারী - দেখুন * থেকে দেখুন বা col1, col2, ... colon দেখুন *, আমি মনে করি না এটি একটি সঠিক সদৃশ কারণ আমি সামান্য ভিন্ন দৃষ্টিকোণ থেকে এই সমস্যাটি আসছি।

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

যে বলেন ,, SELECT * ব্যবহার করতে একটি overriding সমস্যা আছে?

https://src-bin.com


Answer #1
  1. একটি বৃত্তাকার পথে আপনি কঠোর টাইপিং ব্যবহার করে যেখানেই সম্ভব ব্যবহার করার জন্য মডুলারটি নিয়ম ভাঙ্গছেন। স্পষ্ট প্রায় সর্বজনীনভাবে ভাল।

  2. টেবিলের প্রতিটি কলামের প্রয়োজন হলে এমনকি আরও যোগ করা যেতে পারে যা আপনি কোয়েরি চালানোর সময় প্রতিবার টেনে আনবেন এবং কর্মক্ষমতা ক্ষতি করতে পারে। এটা কর্মক্ষমতা ব্যাথা কারণ

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

নির্বাচন করার সময় *

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


Answer #2

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

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

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

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

Corollary যে select * ব্যবহার select * ...

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

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


Answer #3

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

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


Answer #4

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

আপনার অ্যাপ্লিকেশন রিলেশনাল অ্যাক্সেস প্রদান করে যে বিমূর্ত স্তর স্তর গ্রহণ করা উচিত।


Answer #5

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


Answer #6

আমি SQL সার্ভার ২005 এর মতামতগুলিতে select * ব্যবহার করলে আমি একটি অদ্ভুত আচরণ লক্ষ্য করেছি।

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

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 নির্বাচন বিবৃতি ফলাফল তুলনা করুন। আমি বিশ্বাস করি যে আপনি যা দেখতে পাবেন তা হল নামের পরিবর্তে ইন্ডেক্স দ্বারা নির্বাচন * রেফারেন্সিং কলামের একটি ফলাফল।

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

সম্পাদনা

আরো বিস্তারিত জানার জন্য আমি একটি পৃথক প্রশ্ন যুক্ত করেছি, * বিন্যাস থেকে "সিলেক্ট করুন * নির্বাচন করুন" বনাম "কোলাএ, কোলব্যাব, ইত্যাদি টেবিল থেকে" SQL সার্ভার ২005 এর আকর্ষণীয় আচরণ * নির্বাচন করুন।


Answer #7

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


Answer #8

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

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

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


Answer #9

এমনকি যদি আপনি প্রতিটি কলাম ব্যবহার করেন তবে সংখ্যাসূচক সূচী দ্বারা সারি অ্যারের ঠিকানা দিন, তবে আপনি পরবর্তীতে অন্য সারি যুক্ত করলে সমস্যাগুলি থাকবে।

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


Answer #10

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


Answer #11

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


Answer #12

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


Answer #13

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

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


Answer #14

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

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

একটি উদাহরণ:

  • স্থানগুলির একটি টেবিল, x, y, z লেবেলযুক্ত ক্ষেত্রগুলিতে সংরক্ষিত সমন্বয় সহ:

    টেবিল স্থান তৈরি করুন (place_id পূর্ণসংখ্যা, x সংখ্যাসূচক (10, 3), y সংখ্যাসূচক (10, 3), z সংখ্যাসূচক (10, 3), বিবরণ varchar);

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

    স্থানগুলিতে প্রবেশ করান (place_id, x, y, z, বর্ণনা) মূল্য
    (1, ২২, 95, 48.863, 64, 'প্যারিস, প্লেস ডি এল' ইটাইল '),
    (২, ২945, 48.858, 40, 'প্যারিস, ট্যুর আইফেল'),
    (3, 0.373, 43.958, 90, 'কনডম, ক্যাথিড্রালে সেন্ট পিয়ের');

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

    তৈরি করুন অথবা প্রতিস্থাপন করুন place_points হিসাবে দেখুন
    * নির্বাচন করুন,
    জিওমফ্রোম্যাক্ট ('এসআরআইডি = 4326; POINT (' || x || '' || y || '' || z || ')')
    জায়গা থেকে;

    GeomFromewkt () ফাংশন ব্যবহারের জন্য, postgis পড়ুন।

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

    নির্বাচন করুন * places_points থেকে;

 place_id |   x   |   y    |   z    |         description          |                            geomfromewkt                            
----------+-------+--------+--------+------------------------------+--------------------------------------------------------------------  
        1 | 2.295 | 48.863 | 64.000 | Paris, Place de l'Étoile     | 01010000A0E61000005C8FC2F5285C02405839B4C8766E48400000000000005040  
        2 | 2.945 | 48.858 | 40.000 | Paris, Tour Eiffel           | 01010000A0E61000008FC2F5285C8F0740E7FBA9F1D26D48400000000000004440
        3 | 0.373 | 43.958 | 90.000 | Condom, Cathédrale St-Pierre | 01010000A0E6100000AC1C5A643BDFD73FB4C876BE9FFA45400000000000805640
(3 lignes)

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

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

আমি চাই যে সংজ্ঞাটির সংজ্ঞা "যেমন আছে" রাখা যেতে পারে, তবে * এটি হ'ল না: এটি অভ্যন্তরীণভাবে postgresql দ্বারা সংরক্ষণ করা হয়:

Place.place_id, places.x, places.y, places.z, places.description, geomfromewkt নির্বাচন করুন ((('((' SRID = 4326; POINT (':: text || place.x) ||' ': : টেক্সট) || places.y) || '' :: পাঠ্য) || place.z) || ')' :: পাঠ্য) স্থান থেকে geomfromewkt হিসাবে;





sql