এসকিউএল নির্বাচন স্পিড ইন্ট বনাম বর্ণচর


110

আমি একটি টেবিল তৈরির প্রক্রিয়াধীন এবং এটি আমাকে অবাক করে দিয়েছিল।

যদি আমি সঞ্চয় করি, গাড়িগুলি বলুন যেগুলির একটি মেক আছে (fx BMW, অডি ect।), যদি আমি মেক বা ইনচার্চার হিসাবে মেকটি সঞ্চয় করি তবে কী ক্যোয়ারী গতিতে কোনও পার্থক্য হবে?

তাই হয়

SELECT * FROM table WHERE make = 5 AND ...;

এর চেয়ে দ্রুত / ধীর

SELECT * FROM table WHERE make = 'audi' AND ...;

বা গতি কমবেশি একই হবে?

উত্তর:


99

ইন্টার তুলনাগুলি ভারচরের তুলনার তুলনায় দ্রুততর, সাধারণ বিষয়গুলির জন্য যে ইনচারগুলি ভারচারগুলির তুলনায় অনেক কম স্থান নেয়।

আনইনডেক্স এবং ইনডেক্সেড অ্যাক্সেসের জন্য এটি উভয়ই সত্য। যাওয়ার দ্রুততম উপায় হ'ল একটি সূচকযুক্ত ইন কলাম।


আমি দেখতে পাচ্ছি যে আপনি পোস্টগ্রিক প্রশ্নটি ট্যাগ করেছেন, আপনি বিভিন্ন তারিখের স্থানের স্থান ব্যবহারে আগ্রহী হতে পারেন:


13
আপনি পৃষ্ঠা 7.4 উল্লেখ করছেন। আধুনিক সংস্করণগুলিতে, আপনার যদি <126 বাইট থাকে তবে তারা 1 বাইট + দৈর্ঘ্য গ্রহণ করে। আরও মনে রাখবেন যে স্ট্রিংগুলি খুব ধীর হওয়ার কারণে প্রায়শই হ'ল কোলেশন-সংবেদনশীল তুলনা অত্যন্ত ব্যয়বহুল - স্ট্রিংটিতে বেশি জায়গা লাগে না। তবে শেষ ফলাফল অবশ্যই একই।
ম্যাগনাস হাগান্ডার

@ ম্যাগনাস - মাথা উঁচু করার জন্য ধন্যবাদ। আমার উত্তর সম্পাদনা করতে নির্দ্বিধায় যেমন আমি দেখছি আপনার কাছে যথেষ্ট পরিমাণে রেপ পয়েন্ট রয়েছে।
রবার্ট মুন্তানু

"স্ট্রিংটি আরও জায়গা নেয় না" ... ন্যূনতম আকারের অক্ষরের স্ট্রিংগুলি উচ্চ-নির্ভুল সংখ্যাগুলির চেয়ে অনেক বেশি স্থানের হ্যাক নেয়, কারণ একটি সংখ্যার (একক) একটি নির্দিষ্ট ইউনিট থাকে, স্ট্রিং সর্বদা সমষ্টিগত ধরণের হয় । একটি দৈর্ঘ্যের বাইট বা স্ট্রাক্ট সহ স্ট্রিংতে প্রতি-চরিত্রে 64-বিট সংখ্যা 4 বাইটের জন্য 8 বাইট; বা অবিশ্বাস্যভাবে নিখুঁত বাস্তবায়নের জন্য অন্য একটি টার্মিনেটর চরিত্র ...
মিস্টার মিিসিজ

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

2
"বর্ণের তুলনা তুলনায় ইন্টার তুলনাগুলি দ্রুততর, সাধারণ বিষয়গুলির জন্য যে ইনচার্স ভারচারের তুলনায় অনেক কম স্থান নেয়" - এটি সাধারণভাবে সত্য নয় । আপনি যে ডিবিএমএস ব্যবহার করেন এবং সঠিক ডেটা টাইপ এবং স্ট্রিংগুলি আপনি toোকাতে চান তার উপর নির্ভর করে এটি বেরিয়ে যেতে পারে যে আপনার (বলুন) 8-বাইট ইনটগুলি দৈর্ঘ্যের 3-4 টি অক্ষরের কিছু পাঠ্য আইডি ধারণকারী এসকিআই ভারচারের চেয়ে দীর্ঘ। সুতরাং, এই উত্তরটি সঠিক নয় এবং কোনও নির্দিষ্ট প্রসঙ্গ বা পরীক্ষামূলক ফলাফলের অভাব - সত্যই প্রশ্নের উত্তর দেয় না। প্রত্যেকেই জানেন যে ভার্চারদের ইনটসের চেয়ে অনেক বেশি জায়গা নিতে দেওয়া হয়, তবে তাদের দরকার নেই।
মার্সিন ওয়াজনারস্কি

36

কিছু রুক্ষ মানদণ্ড:

Postgres 9.x এ 4 মিলিয়ন রেকর্ড

Table A = base table with some columns
Table B = Table A + extra column id of type bigint with random numbers
Table C = Table A + extra column id of type text with random 16-char ASCII strings

8 জিবি র‌্যাম, আই 7, এসএসডি ল্যাপটপের ফলাফল:

Size on disk:                A=261MB        B=292MB        C=322MB
Non-indexed by id: select count(*), select by id: 450ms same on all tables
Insert* one row per TX:       B=9ms/record        C=9ms/record
Bulk insert* in single TX:    B=140usec/record    C=180usec/record
Indexed by id, select by id:  B=about 200us       C=about 200us

* inserts to the table already containing 4M records

সুতরাং এই সেটআপটির জন্য দেখে মনে হচ্ছে, যতক্ষণ আপনার সূচীগুলি রামে ফিট থাকে ততক্ষণ বিগিন্ট বনাম 16-চরের পাঠের গতিতে কোনও পার্থক্য নেই।


6
খুব আকর্ষণীয়. পার্থক্য কীভাবে নগন্য?
চিবুয়েজ ওপাটা

18

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

ইন্ট ব্যবহার করার অন্য একটি কারণ রয়েছে এবং তা হ'ল ডাটাবেসকে স্বাভাবিক করা। 'মার্সিডিজ-বেঞ্জ' পাঠ্যটি টেবিলে হাজারবার সঞ্চারিত না করে আপনার আইডিটি সংরক্ষণ করা উচিত এবং ব্র্যান্ডের নামটি আলাদা টেবিলে একবার সঞ্চয় করা উচিত।


আপনি আরও ব্যাখ্যা করতে পারেন? Mercedes-Benzহাজার হাজার বার আইডি সংরক্ষণ করার পরিবর্তে আপনার অর্থ কী 1? উদাহরণস্বরূপ সারণী car_brands, কলাম Brandsএবং Id। সারি Mercedes-Benzএবং 1। এবং প্রধান টেবিল কলাম Brandsএবং মান 1। এবং কখন SELECT, তারপরে প্রথমে Idটেবিল থেকে car_brandsএবং তারপরে SELECT Something FROM main_table WHERE Brands = (SELECT Id FROM car_brands WHERE Brands = Mercedes-Benz)। নাকি অন্য কোন পন্থা?
অ্যান্ডিস

3
@ ব্যবহারকারী2118559: হ্যাঁ, আপনি এটি এটি সঞ্চয় করবেন। ডেটা আপনি সাধারণত বরং একটি subquery চেয়ে যোগদানের ব্যবহার করেন পেতে: select something from main_table c inner join car_brands b on b.Id = c.Brands where b.Brands = 'Mercedes-Benz'
গুফা

ডাউনটা কেন? আপনি যদি ভুল বলে মনে করেন তবে এটি কী ব্যাখ্যা না করে তবে উত্তরটি উন্নত করতে পারে না।
গুফা

8

স্ট্রিং তুলনা বনাম অ-ফ্লোটগুলির প্রকৃত কার্য সম্পাদনকে সরিয়ে ফেলা, এক্ষেত্রে স্বাক্ষরবিহীন ও স্বাক্ষরযুক্ত কোনও আকারের বিষয়টি বিবেচনা করে না। আকার আসলে পারফরম্যান্সের মধ্যে সত্য পার্থক্য। এটি 1byte + (126bytes পর্যন্ত) বনাম 1,2,4 বা 8 বাইট তুলনা ... স্পষ্টতই নন-ফ্লোট স্ট্রিং এবং ফ্লোটের চেয়ে ছোট এবং এইভাবে সমাবেশে আরও সিপিইউ বান্ধব।

সমস্ত ভাষায় স্ট্রিং তুলনা স্ট্রিং সিপিইউ দ্বারা 1 নির্দেশনা তুলনা করা যেতে পারে যে কিছু চেয়ে ধীর। এমনকি একটি 32 বিট সিপিইউতে 8 বাইট (64 বিট) তুলনা করা এখনও ভিআচআরএআরএর (2) বা তার চেয়ে বড় এর চেয়ে দ্রুত। * আবার, উত্পাদিত সমাবেশটি দেখুন (এমনকি হাতেও) এটি 1 থেকে 8 বাইট সিপিইউ সংখ্যার চেয়ে চরের সাথে তুলনামূলক আরও বেশি নির্দেশনা দেয়।

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

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

Ozz


6

সূচক বা না, ইনট অনেক দ্রুত (ভার্চার যত দীর্ঘতর হয়, ধীরে ধীরে এটি পায়)।

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


3
"অডি" এর 5 মিলিয়ন রেকর্ডের উদাহরণস্বরূপ, সূচকটি কেবল "অডি" এর স্ট্রিংয়ের কেবল একটি অনুলিপি এবং প্রাথমিক_কির 5 মিলিয়ন পূর্ণসংখ্যা রাখবে না? আকারের পার্থক্যটি কি সত্যিই বড় হবে, এটি vchar বা পূর্ণসংখ্যা হবে?
লুলালালা

আপনি ঠিক লুলালালা তবে একটি কলামের জন্য যা এলোমেলো স্ট্রিং ধারণ করে উত্তর উত্তর যথেষ্ট fair
আওয়েস ফিয়াজ

4

সাধারণভাবে ইনটি দ্রুততর হবে। লম্বাটি হ'ল ধীরে ধীরে ভারচর


3

ইঙ্গিত: ক্ষেত্রের জন্য সম্ভাব্য মান যদি করতে হবে না (অথবা কদাচিৎ) পরিবর্তন করুন, আপনি ENUM সমঝোতার যেমন ব্যবহার করতে পারেন। এটি ভাল পঠনযোগ্যতার সাথে ভাল গতির একত্রিত করে।


1
আকর্ষণীয়, ENUM এবং int এর মধ্যে গতির পার্থক্য কীভাবে হবে?
googletorp

PostgresSQL এর কি কোনও enumডেটা টাইপ আছে? আমি যদিও এটি মাইএসকিউএল নির্দিষ্ট ছিল।
রবার্ট মুন্তানু

পোস্টগ্রিসের ENUM রয়েছে, তবে আমি মনে করি না যে এটি মাইএসকিউএলের মতো কার্যকরভাবে কার্যকর হয়েছে। postgresql.org/docs/current/static/datatype-enum.html
googletorp

2
পারফরম্যান্স অনুসারে, ENUM অনুসন্ধান ক্ষেত্রের ইনট এর মতো কম বা কম সম্পাদন করবে, তবে লক্ষ্য তালিকার বার্চার হিসাবে (কারণ এটি পুরো স্ট্রিংটি ক্লায়েন্টকে কেবল ইনট নয়, সংযুক্ত সারির জন্য স্থানান্তর করতে হবে)
ম্যাগনাস হাগান্ডার

1
এখানে মাইএসকিউএল কেন এনাম ব্যবহার করবেন না সে সম্পর্কে একটি আকর্ষণীয় পঠন (কেবল আগুনে কিছু জ্বালানী যুক্ত করতে: ডি)
উইল্ট

1

আপনি যদি উভয় ক্ষেত্রের সূচি চালু করেন , এটি দ্রুত হবে। আপনার প্রশ্নের হিসাবে, আমি মনে করি এর intচেয়ে দ্রুত varchar


0

কিছুটা আপেক্ষিক। হ্যাঁ, আইএনটি দ্রুততর হবে, তবে এটি যদি আপনার পরিস্থিতিতে লক্ষ্যণীয় হয় তবে প্রশ্ন is ভর্চারগুলি কি কেবল কিছু ছোট শব্দ, বা দীর্ঘতর পাঠ্য? এবং টেবিলের মধ্যে কত সারি রয়েছে? যদি কেবল কয়েকটি সারি থাকে তবে এটি সম্ভবত মেমরির সম্পূর্ণভাবে বাফার হবে (যখন প্রায়ই অনুরোধ করা হয়) তবে আপনি খুব বেশি পার্থক্য লক্ষ্য করতে পারবেন না। তারপরে অবশ্যই ইনডেক্সিং রয়েছে, যা টেবিল বাড়ার সাথে আরও গুরুত্বপূর্ণ হয়ে ওঠে। এসএসডি ব্যবহার করা দ্রুততর হতে পারে তারপরে অপ্টিমাইজড কোয়েরিগুলির সাথে এইচডি। এছাড়াও ভাল ডিস্ক-নিয়ন্ত্রকরা মাঝে মাঝে প্রশ্নের> 10x গতি বাড়ায়। এটি কেবলমাত্র VARCHARs ব্যবহারের জন্য জায়গা ছেড়ে দিতে পারে যা পাঠ এবং লেখাগুলি প্রশ্নের সহজ করে তোলে (জটিল যোগদানের প্রয়োজন নেই) এবং বিকাশের গতি বাড়ায়। পুরিস্টরা তবে দ্বিমত এবং সর্বদা সবকিছু স্বাভাবিক করবে normal

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