অ-প্রাসঙ্গিক কলামগুলি কি নির্বাচিত বিবৃতিগুলির প্রশ্নের সময়কে প্রভাবিত করে?


10

আমি উৎসুক.

বলুন আপনার কাছে 1 মিলিয়ন রেকর্ড / সারিগুলির একটি সারণী রয়েছে।

select order_value from store.orders

সেই টেবিলটির 1 টি ক্ষেত্র, 2 ক্ষেত্র, বা 100 টি ক্ষেত্র প্রকৃত ক্যোয়ারির সময় রয়েছে কিনা তা কোনও ত্রুটি করে? আমার অর্থ "অর্ডার_ভ্যালু" ব্যতীত অন্য সমস্ত ক্ষেত্র।

এই মুহুর্তে আমি ডেটা গুদামে ডেটা চাপছি। কখনও কখনও আমি ক্ষেত্রগুলি টেবিলের মধ্যে ফেলে রাখি যা "ভবিষ্যতে কোনও দিন ব্যবহৃত হতে পারে" - তবে এগুলি এখনই কোনও কিছুর দ্বারা অনুসন্ধান করা হচ্ছে না। এই 'বহিরাগত' ক্ষেত্রগুলি এমন নির্বাচিত বিবৃতিগুলিকে প্রভাবিত করবে যা প্রত্যক্ষ বা অপ্রত্যক্ষভাবে (কোনও * আমি বলতে চাইনি) এগুলিকে অন্তর্ভুক্ত করে না?


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

উত্তর:


10

এটি সত্যই সূচী এবং ডেটা ধরণের উপর নির্ভর করে।

উদাহরণস্বরূপ স্ট্যাক ওভারফ্লো ডাটাবেস ব্যবহার করে, ব্যবহারকারীদের টেবিলটি দেখতে এটির মতো:

পাগল

এটির আইডি কলামে একটি পিকে / সিএক্স রয়েছে। সুতরাং এটি আইডি অনুসারে সাজানো টেবিলের সম্পূর্ণতা।

একমাত্র সূচক হিসাবে, এসকিউএলকে ইতিমধ্যে সেখানে না থাকলে পুরো জিনিসটি (এলওবি কলামগুলি স্যানস) মেমোরিতে পড়তে হবে।

DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.

SET STATISTICS TIME, IO ON 

SELECT u.Id
INTO  #crap1
FROM dbo.Users AS u

পরিসংখ্যানের সময় এবং আইও প্রোফাইলটি দেখতে এমন দেখাচ্ছে:

Table 'Users'. Scan count 7, logical reads 80846, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 2406 ms,  elapsed time = 446 ms.

আমি যদি শুধু আইডিতে একটি অতিরিক্ত অবিবাহিত সূচক যুক্ত করি

CREATE INDEX ix_whatever ON dbo.Users (Id)

আমার কাছে এখন আরও অনেক ছোট সূচক রয়েছে যা আমার জিজ্ঞাসাকে সন্তুষ্ট করে।

DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.

SELECT u.Id
INTO  #crap2
FROM dbo.Users AS u

এখানে প্রোফাইল:

Table 'Users'. Scan count 7, logical reads 6587, physical reads 0, read-ahead reads 6549, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 2344 ms,  elapsed time = 384 ms.

আমরা আরও কম পড়া এবং সামান্য সিপিইউ সময় সাশ্রয় করতে সক্ষম're

আপনার টেবিল সংজ্ঞা সম্পর্কে আরও তথ্য ব্যতীত, আপনি যা আরও ভালভাবে পরিমাপ করার চেষ্টা করছেন তা আমি পুনরুত্পাদন করার চেষ্টা করতে পারি না।

তবে আপনি বলছেন যে সেই একাকী কলামে একটি নির্দিষ্ট সূচক না থাকলে অন্যান্য কলাম / ক্ষেত্রগুলিও স্ক্যান হবে? এটি কি কেবল সারি টেবিলগুলির নকশার অন্তর্নিহিত একটি অপূর্ণতা? কেন অপ্রাসঙ্গিক ক্ষেত্রগুলি স্ক্যান করা হবে?

হ্যাঁ, এটি সারি সারি সারণিতে নির্দিষ্ট specific তথ্য পৃষ্ঠাগুলিতে সারি দ্বারা ডেটা সংরক্ষণ করা হয়। এমনকি যদি পৃষ্ঠার অন্যান্য ডেটা আপনার প্রশ্নের সাথে অপ্রাসঙ্গিক হয় তবে সেই পুরো সারি> পৃষ্ঠা> সূচকটি মেমোরিতে পড়তে হবে। আমি এটি বলব না যে অন্যান্য কলামগুলি যে পরিমাণ পৃষ্ঠাগুলিতে রয়েছে সেগুলি কোয়েরির সাথে সম্পর্কিত একক মান পুনরুদ্ধার করতে স্ক্যান করা হয়।

ওলের ফোনবুক উদাহরণ ব্যবহার করে: আপনি কেবল ফোন নম্বরগুলি পড়ছেন, পৃষ্ঠাটি সরিয়ে দেওয়ার পরেও আপনি ফোন নম্বর সহ শেষ নাম, প্রথম নাম, ঠিকানা ইত্যাদি সরিয়ে দিচ্ছেন।


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

12

এটি নির্ভর করে টেবিলের কাঠামো এবং উপলভ্য সূচকে।

  • কেস এ: সাধারণ (রোস্টস্টোর) টেবিল, কোনও সূচক নেই (order_value)

    একমাত্র সম্ভাব্য সম্পাদনের পরিকল্পনাটি হ'ল পুরো টেবিলটি পড়ুন (এটি যখন 2 বনাম 200 কলামের মধ্যে অবশ্যই অনেক আলাদা, সুতরাং কয়েক বনাম কয়েক হাজার বাইট প্রশস্ত)।

  • কেস বি: সাধারণ টেবিল, সেখানে একটি সূচক রয়েছে (order_value)বা অন্য কিছু সূচি রয়েছে যাতে সেই কলামটি অন্তর্ভুক্ত রয়েছে।

    এখন আরও একটি ভাল পরিকল্পনা আছে, পুরো সূচকটি স্ক্যান করুন (এর মধ্যে একটি) - যা অবশ্যই পুরো টেবিলের চেয়ে অনেক সংকীর্ণ, মাত্র কয়েক বাইট। টেবিলের 2 বা 200 কলাম থাকলে এটি অপ্রাসঙ্গিক করে তোলে। কেবল সূচকটি স্ক্যান করা হয়।

  • কেস সি: এটি একটি কলামের দোকান টেবিল।

    নামটি থেকেই বোঝা যাচ্ছে যে এই টেবিলগুলির কাঠামো কলাম ভিত্তিক নয়, সারি অনুসারে নয়। কোনও সূচকের প্রয়োজন নেই, টেবিল ডিজাইন নিজেই পুরো কলামগুলি পড়ার জন্য উপযুক্ত।


এই বিষয়ে আমার জ্ঞানটি কিছুটা সবুজ। সর্বাধিক প্রচলিত (সাধারণত এসকিউএল সার্ভারের ডাটাবেসটি বলুন) সারি স্টোর সারণী রাখা ঠিক আছে? যদি কেবল একটি কলাম / ক্ষেত্রটি ফেরত দেওয়া দরকার হয় তবে কেন পুরো টেবিলটি স্ক্যান হবে? এটি কি রোউস্টোর টেবিলগুলির ডিজাইনের অন্তর্নিহিত?
ব্যবহারকারী 45867

@ ব্যবহারকারী 45867 হ্যাঁ, তথ্যগুলি সারিগুলিতে সঞ্চিত হয় (কিছু খুব বড় কলাম যা বাইরে সঞ্চিত থাকে তা বাদে)। এসকিউএল সার্ভার যখন ডিস্ক থেকে পড়ে, এটি পুরো ব্লকগুলিতে পড়ে, এটিতে কেবল একটি অংশই পড়তে পারে না যার একটি কলাম রয়েছে।
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.