কেন কোনও টেবিলের ডেটা স্পেসে কাঁচা ডেটার আকার 4x লাগতে পারে?


18

আমার কাছে 490 এম সারি এবং 55 গিগাবাইটের টেবিল স্পেস সহ একটি টেবিল রয়েছে, তাই প্রতি সারি প্রায় 167 বাইট। টেবিলে তিনটি কলাম রয়েছে: ক VARCHAR(100), ক DATETIME2(0)এবং ক SMALLINTVARCHARক্ষেত্রের পাঠ্যের গড় দৈর্ঘ্য প্রায় 21.5, সুতরাং কাঁচা ডেটা সারি প্রতি 32 বাইটের কাছাকাছি হওয়া উচিত: 22 এর জন্য 2 VARCHAR, 6 এর জন্য এবং 6 DATETIME2-বিট পূর্ণসংখ্যার জন্য 2।

নোট করুন যে উপরের স্থানটি কেবলমাত্র তথ্য, সূচকগুলি নয়। আমি প্রোপার্টি | এর অধীনে রিপোর্ট করা মানটি ব্যবহার করছি স্টোরেজ | জেনারেল | ডেটা স্পেস।

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

তুলনার জন্য, আমি দুটি INTক্ষেত্র এবং 1 এম সারি দিয়ে একটি টেবিল তৈরি করার চেষ্টা করেছি । প্রয়োজনীয় ডেটা স্পেসটি ছিল 16.4 এমবি: সারি প্রতি 17 বাইট, কাঁচা ডেটার 8 বাইটের তুলনায়। আসল টেবিলের মতো একই পাঠ্য সহ একটি INTএবং VARCHAR(100)জনবহুল সহ আরও একটি টেস্ট সারণীতে প্রতি সারি 39 বাইট (44 কে সারি) ব্যবহার করা হয়েছে, যেখানে আমি 28 প্লাসটি একটু বেশি আশা করব।

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

কোন পয়েন্টার জন্য অগ্রিম ধন্যবাদ!

সম্পাদনা করুন:

তালিকাভুক্ত ক্ষেত্রগুলির সবগুলি NOT NULL। আসল টেবিলটির VARCHARক্ষেত্র এবং ক্ষেত্রের একটি ক্রাস্টার্ড পিকে রয়েছে DATETIME2that দুটি পরীক্ষার জন্য, প্রথমটি INTছিল (ক্লাস্টারড) পিকে।

যদি এটি গুরুত্বপূর্ণ: টেবিলটি পিং ফলাফলের রেকর্ড। ক্ষেত্রগুলি হ'ল ইউআরএল, পিং তারিখ / সময় এবং মিলিসেকেন্ডে বিলম্ব। ডেটা অবিচ্ছিন্নভাবে সংযোজন করা হয়, এবং কখনই আপডেট হয় না, তবে ইউআরএল প্রতি ঘন্টা কয়েক ঘন্টা রেকর্ডে এটি কেটে ফেলার জন্য ডেটা পর্যায়ক্রমে মুছে ফেলা হয়।

সম্পাদনা করুন:

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

উত্তর:


11

মূল প্রশ্নে মন্তব্যে আলোচনার পরে, এটি প্রদর্শিত হয় যে হারিয়ে যাওয়া স্থানটি ক্লাস্টার কী বাছাইয়ের ফলে ঘটেছিল, যার ফলে বিশাল বিভাজন ঘটে।

এই পরিস্থিতিতে sys.dm_db_index_physical_stats এর মাধ্যমে বিভাজনের স্থিতিটি সর্বদা পরীক্ষণযোগ্য।

সম্পাদনা করুন: মন্তব্যে নিম্নলিখিত আপডেট

গড় পৃষ্ঠ ঘনত্ব (ক্লাস্টার ইনডেক্স পুনর্নির্মাণের আগে) ছিল 24%, যা মূল প্রশ্নের সাথে পুরোপুরি ফিট করে। পৃষ্ঠাগুলি কেবল 1/4 পূর্ণ ছিল, সুতরাং মোট আকার কাঁচা ডেটার আকার 4x ছিল।


7

অন ​​ডিস্ক স্ট্রাকচারের ওভারহেড রয়েছে:

  • সারি শিরোনাম
  • নাল বিটম্যাপ + পয়েন্টার
  • পরিবর্তনশীল দৈর্ঘ্যের কলাম অফসেট
  • সারি সংস্করণ পয়েন্টার (alচ্ছিক)
  • ...

2 এক্স 4 বাইট ইন্ট কলামগুলি নিচ্ছেন, আপনার কাছে রয়েছে

  • 4 বাইট সারি শিরোনাম
  • নুল বিটম্যাপে 2 বাইট পয়েন্টার
  • 2 ইন্ট কলামগুলির জন্য 8 বাইট
  • 3 বাইট নুল বিটম্যাপ

বাহ 17 বাইট!

আপনি আপনার দ্বিতীয় পরীক্ষার টেবিলে একই করতে পারেন যাতে আপনার মূলের মতো আরও ওভারহেড রয়েছে:

  • পরিবর্তনশীল-দৈর্ঘ্যের কলামগুলির গণনার জন্য 2 বাইট
  • পরিবর্তনশীল দৈর্ঘ্যের কলামে 2 বাইট

কেন পার্থক্য? অতিরিক্ত (আমি এগুলির সাথে লিঙ্ক করব না)

  • আপনি কি কখনও সূচকগুলি ডিফল্ট করতে পুনরায় নির্মাণ করেছেন?
  • মুছে ফেলা স্থান পুনরায় দাবি না
  • আপনি মাঝখানে প্রবেশ করালে ডেটা পৃষ্ঠাগুলি বিভক্ত হবে
  • আপডেটগুলি ফরোয়ার্ড পয়েন্টারগুলির কারণ হতে পারে (একটি ফাঁক ছেড়ে দেয়)
  • সারি ওভারফ্লো
  • সূচি পুনর্নির্মাণ বা ডিবিসিসি স্বচ্ছল ছাড়াই বারচর কলাম সরানো হয়েছে
  • হিপ বা টেবিল (গাদাটির কোনও ক্লাস্টারড সূচক নেই = রেকর্ডগুলি ছড়িয়ে ছিটিয়ে আছে)
  • আরসিএসআই বিচ্ছিন্নতা স্তর (প্রতি সারি অতিরিক্ত 14 বাইট)
  • ভেরচারে ট্রেলিং স্পেসস (ডিফল্টরূপে SET ANSI_PADDING চালু আছে)। LEN নয়, চেক করতে DATLENGTH ব্যবহার করুন
  • স্পি স্পেসিউসড দিয়ে চালান @updateusage = 'true'
  • ...

এটি দেখুন: এসকিউএল সার্ভার: একটি 8 কেবি পৃষ্ঠা পূরণ করে এমন একটি টেবিল কীভাবে তৈরি করবেন?

এসও থেকে:


2x4 বাইট ইন কলামের নমুনা 100% সঠিক নয়। আপনার কাছে 4 বাইট সারি শিরোনাম থাকবে (2 দৈর্ঘ্য বাইট এবং স্থির দৈর্ঘ্যের ডেটার আকারের জন্য 2 বাইট)। তারপরে আপনার কাছে ডেটার জন্য 2x4 বাইট থাকবে। কলাম গণনার জন্য দুটি বাইট এবং নাল বিটম্যাপের জন্য একটি একক বাইট, 17 টি নয় মোট 15 বাইট রেকর্ড দৈর্ঘ্য দেয়
মার্ক এস। রাসমুসেন

@ মার্ক এস। রাসমুসেন: আপনি "স্থির দৈর্ঘ্যের ডেটার আকারের জন্য 2 বাইট" পাবেন? দুটিই MSDN? আর নাল বিটম্যাপ সবসময় 3 বাইট: sqlskills.com/blogs/paul/post/... + + msdn.microsoft.com/en-us/library/ms178085%28v=sql.90%29.aspx
gbn

বাহ, দুর্দান্ত বিস্তারিত! VARCHARউপরের আমার অনুমানে আমি এর দৈর্ঘ্যের ক্ষেত্রের জন্য হিসাব করেছি, কিন্তু কলামগুলির গণনার জন্য নয়। এই টেবিলটির কোনও নুলযোগ্য ক্ষেত্র নেই (এটি উল্লেখ করা উচিত ছিল), এটি এখনও তাদের জন্য বাইট বরাদ্দ করে?
সমস্ত ট্রেডের জোন

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

1
@gbn স্থির দৈর্ঘ্যের ডেটা আকারের জন্য 2 বাইটগুলি আপনার উল্লেখ করা 4 বাইট সারি শিরোনামের অংশ। এটি সেই পয়েন্টার যা স্থির ডেটা দৈর্ঘ্যের অংশ / কলাম গণনা / নাল বিটম্যাপের শুরুতে শেষ করে। NULL বিটম্যাপ সবসময় তিন বাইট হয় না । আপনি যদি কলামের গণনাটি অন্তর্ভুক্ত করেন তবে এটি সর্বনিম্ন তিনটি বাইট হবে তবে আরও বেশি হতে পারে - আমি আমার বিবরণে বিটম্যাপ এবং কলামের সংখ্যাকে বিভক্ত করব। এছাড়াও, NULL বিটম্যাপ সবসময় উপস্থিত থাকে না , যদিও এটি এই ক্ষেত্রে হবে।
মার্ক এস রাসমুসেন

5

সময়ের সাথে সাথে কি ডেটা ধরণের পরিবর্তন হয়েছে? পরিবর্তনশীল দৈর্ঘ্যের কলামগুলি সরানো হয়েছে? সূচিগুলি প্রায়শই Defragmented হয়েছে কিন্তু কখনও পুনর্নির্মাণ করা হয়েছে? প্রচুর সারি মুছে ফেলা হয়েছে বা প্রচুর ভেরিয়েবল-দৈর্ঘ্যের কলামগুলি উল্লেখযোগ্যভাবে আপডেট হয়েছে? এখানে কিছু ভাল আলোচনা ।


আমি 97% আত্মবিশ্বাসী যে আমি কোনও ডেটা টাইপ পরিবর্তন করি নি বা কোনও ক্ষেত্র সরিয়ে নেই। আমি যদি এটি করি তবে টেবিলে খুব কম সারি থাকলে এটি খুব তাড়াতাড়িই শুরু হত। কোনও মুছে ফেলা বা আপডেট নেই, ডেটা কেবল কখনও সংযুক্ত থাকে।
সমস্ত ট্রেডের জোন

কারেকশন আছে: হয় মোছা হয়, এবং বেশ একটু। টেবিলটির যথেষ্ট নেট বৃদ্ধি রয়েছে, সুতরাং আমি কল্পনা করতে পারি যে এই স্থানটি আবার ব্যবহার করা হবে।
সমস্ত ট্রেডের জোন

প্রচুর মুছে ফেলা সহ ডেটা আবার ব্যবহার করা যেতে পারে বা নাও হতে পারে। টেবিলের গুচ্ছ কী? সারণিগুলির মাঝখানে বা শেষে সন্নিবেশ করা হয়?
mrdenny

ক্লাস্টার্ড কীটি সেই ক্ষেত্রগুলিতে VARCHARএবং DATETIME2ক্ষেত্রগুলিতে যৌগিক । প্রথম ক্ষেত্রের জন্য সন্নিবেশ সমানভাবে বিতরণ করা হবে। দ্বিতীয় ক্ষেত্রের জন্য, নতুন মান এবং সর্বদা যে কোনও বিদ্যমানের চেয়ে বড় হবে।
সমস্ত ট্রেডের জোন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.