CHAR বনাম VARCHAR এর জন্য সূচক কর্মক্ষমতা (পোস্টগ্রিস)


16

এই উত্তরে ( /programming/517579/strings-as-primary-keys-in-sql-database ) একটি মন্তব্য আমার দৃষ্টি আকর্ষণ করেছে:

এছাড়াও মনে রাখবেন যে সূচীকরণের তুলনা করার সময় প্রায়ই একটি CHAR এবং VARCHAR এর মধ্যে খুব বড় পার্থক্য থাকে

এটি পোস্টগ্রিসের জন্য এখনও প্রয়োগ / প্রয়োগ করে?

আমি ওরাকল-এ পৃষ্ঠাগুলি খুঁজে পেয়েছি যে দাবি করেছে যে CHARকমবেশি একটি উপনাম VARCHARএবং তাই সূচীর কর্মক্ষমতা একই, তবে আমি পোস্টগ্রিসে নির্দিষ্ট কিছু খুঁজে পাইনি।

উত্তর:


24

CHARএবং VARCHARপোস্টগ্রিসে (এবং ওরাকল) ঠিক একইভাবে প্রয়োগ করা হয়। এই ডেটা ধরণের ব্যবহার করার সময় গতির কোনও পার্থক্য নেই।

যাইহোক, একটি পার্থক্য যা পারফরম্যান্সে একটি পার্থক্য তৈরি করতে পারে: একটি charকলাম সর্বদা সংজ্ঞায়িত দৈর্ঘ্যে প্যাড করা হয়। সুতরাং আপনি যদি একটি কলাম char(100)এবং একটি হিসাবে varchar(100)কেবল সংজ্ঞা দেন তবে প্রতিটিতে কেবলমাত্র 10 টি অক্ষর সংরক্ষণ করেন, char(100)কলামটি প্রতিটি মানের জন্য 100 টি অক্ষর ব্যবহার করে (10 টি অক্ষর আপনি সংরক্ষণ করেছেন, এবং 90 টি ফাঁকা স্থান), যেখানে varcharকলামটি কেবলমাত্র 10 টি অক্ষর সঞ্চয় করে।

১০০ টি বর্ণের সাথে ১০০ টি অক্ষরের তুলনা করা 10 অক্ষরের সাথে 10 টি বর্ণের তুলনা করার চেয়ে ধীর হতে চলেছে - যদিও আমি সন্দেহ করি যে আপনি আসলে এই এসকিউএল কোয়েরিতে এই পার্থক্যটি পরিমাপ করতে পারবেন।

যদি আপনি 10 টি অক্ষরের দৈর্ঘ্য সহ উভয়কে ঘোষণা করেন এবং সর্বদা সেগুলিতে 10 টি অক্ষর সংরক্ষণ করেন তবে যা কিছু আছে তা একেবারেই কোনও পার্থক্য নেই (এটি ওরাকল এবং পোস্টগ্রিসের ক্ষেত্রে সত্য)

সুতরাং পার্থক্যটি কেবল প্যাডিং যা charডেটা টাইপের জন্য করা হয় ।


এছাড়াও মনে রাখবেন যে সূচীকরণের তুলনা করার সময় প্রায়ই একটি CHAR এবং VARCHAR এর মধ্যে খুব বড় পার্থক্য থাকে

উপরের উদ্ধৃতিটি কেবলমাত্র সত্য যদি (এবং কেবলমাত্র) charকলামটি খুব প্রশস্তভাবে সংজ্ঞায়িত করা হয় (যেমন আপনি প্যাডিংয়ের কারণে স্থান নষ্ট করছেন)। যদি charকলামটির দৈর্ঘ্য সর্বদা সম্পূর্ণ ব্যবহৃত হয় (সুতরাং কোনও প্যাডিং হয় না), তবে উপরের উদ্ধৃতিটি ভুল (কমপক্ষে পোস্টগ্রিস এবং ওরাকল জন্য)


আমার দৃষ্টিকোণ থেকে, charডেটা টাইপের সত্যই কোনও সত্য শব্দ ব্যবহার হয় না। কেবল ব্যবহার করুন varchar(বা textপোস্টগ্রিসে) এবং ভুলে যা charবিদ্যমান।


2
১০০ টি চরিত্রের সাথে ১০০ টি অক্ষরের তুলনা করা 10 অক্ষরের সাথে 10 টি বর্ণের তুলনা করার চেয়ে ধীর হতে চলেছে - যদিও আমি সন্দেহ করি যে আপনি আসলে এই এসকিউএল কোয়েরিতে এই পার্থক্যটি পরিমাপ করতে পারবেন। - বাছাইয়ের পাশাপাশি কোয়েরিটি কী করে তার উপর নির্ভর করে পার্থক্যটি বিশাল হতে পারে। এজন্যই পোস্টগ্রিস 9.5 এর একটি নতুন "সংক্ষেপিত কীগুলি" বৈশিষ্ট্য রয়েছে: pgeoghegan.blogspot.de/2015/01/…
চিরলু

6

আমি_হর্স_বিহীন_নাম_নামে বলা সমস্ত কিছুর সাথে আমি একমত , এবং আমি সাধারণত এরউইনের মন্তব্য পরামর্শের সাথে একমত:

না, চরটি নিকৃষ্ট (এবং পুরানো)। পাঠ্য এবং বারচর একই (প্রায়) সম্পাদন করে।

মেটাডেটা

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

CREATE TABLE foo (
  x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));

আমি কয়েকটি কারণে এটি করি,

  1. char(x)কখনও কখনও স্থির-প্রস্থের কলাম হিসাবে স্কিমা-লোডারগুলির সাথে অনুমিত হয়। এটি স্থিত-প্রস্থের স্ট্রিংয়ের জন্য অনুকূলিত হওয়া কোনও ভাষার মধ্যে পার্থক্য আনতে পারে।
  2. এটি এমন একটি সম্মেলন প্রতিষ্ঠা করে যা অর্থবোধ করে এবং সহজেই প্রয়োগ করা হয়। এই কনভেনশন থেকে কোড উত্পন্ন করতে আমি কোনও ভাষায় স্কিমা-লোডার লিখতে পারি।

আমি যেখানে এটি করতে পারি তার একটি উদাহরণ দরকার,

  1. দুই অক্ষর রাষ্ট্র বর্ণমালা, যদিও কারণ এই তালিকা গণিত করা যেতে পারে, আমি সাধারণত এটি একটি সঙ্গে চেষ্টা করবো ENUM
  2. যানবাহন শনাক্তকরণের নম্বর
  3. মডেল নম্বর (স্থির আকারের)

ত্রুটিগুলিতে

লক্ষ্য করুন কিছু লোক সীমাবদ্ধতার উভয় পক্ষের ত্রুটি বার্তাগুলির অসঙ্গতিতে অস্বস্তিতে থাকতে পারে তবে এটি আমাকে বিরক্ত করে না

test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR:  new row for relation "foo" violates check constraint "foo_x_check"
DETAIL:  Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR:  value too long for type character(10)

বিপরীতের সাথে varchar

তদুপরি, আমি মনে করি উপরোক্ত পরামর্শটি প্রায় সর্বদা ব্যবহারেরtext একটি কনভেনশনের সাথে খুব ভাল ফিট করে । আপনি সম্পর্কে জিজ্ঞাসা varchar(n)আমি কখনই এটি ব্যবহার করি না । কমপক্ষে, আমি শেষ সময়টি ব্যবহার করার কথা মনে করতে পারি না varchar(n)

  • যদি কোনও স্পপের স্থিত-প্রস্থের ক্ষেত্র থাকে যা আমি বিশ্বাস করি, আমি ব্যবহার করি char(n),
  • অন্যথায়, আমি textকার্যকরভাবে যা ব্যবহার varchar(সীমাবদ্ধ নেই)

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

অতিরিক্ত নোট

সম্পর্কিত প্রশ্নোত্তর:


1

PostgreSQL

sales_reporting_db=# create table x (y char(2));
CREATE TABLE
sales_reporting_db=# insert into x values ('Y');
INSERT 0 1
sales_reporting_db=# select '*' || y || '*' from x;
 ?column? 
----------
 *Y*

আকাশবাণী

SQL> create table x ( y char(2));

Table created.

SQL> insert into x values ('Y');

1 row created.

SQL> select '*' || y || '*' from x;

'*'|
----
*Y *

পোস্টগ্রেস্কল স্পেস দিয়ে প্যাড দেয় না।


পোস্টগ্র্রেসে এটি কেবল একটি অপটিক্যাল মায়া। চেষ্টা করুনSELECT pg_column_size(y) FROM x;
dezso

-2

আমি এটি সবচেয়ে দরকারী এবং একটি দ্রুত 3 লাইন ব্যাখ্যা পেয়েছি:

থেকে CHAR (ঢ) বনাম VARCHAR (এন) বনাম টেক্সট Postgres ইন

  • আপনি যদি অজানা দৈর্ঘ্যের সাথে কিছু পাঠ্য সঞ্চয় করতে চান তবে TEXTডেটা টাইপ ব্যবহার করুন ।
  • আপনি একটি অজানা দৈর্ঘ্য সঙ্গে কিছু টেক্সট সঞ্চয় করতে চান, কিন্তু আপনি সর্বোচ্চ দৈর্ঘ্য চিনেন, ব্যবহার যদি VARCHAR(n)
  • আপনি যদি কোনও সঠিক দৈর্ঘ্যের সাথে কিছু পাঠ্য সঞ্চয় করতে চান তবে ব্যবহার করুন CHAR(N)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.