যদি কোনও ভিআরচআরআর (ম্যাক্স) কলামটি কোনও সূচকে অন্তর্ভুক্ত করা হয় তবে পুরো মানটি কি সর্বদা সূচক পৃষ্ঠাতে সঞ্চিত থাকে?


12

আমি এই কৌতূহল থেকে জিজ্ঞাসা করছি, এই প্রশ্ন দ্বারা অনুপ্রাণিত হয়ে ।

আমরা জানি যে VARCHAR(MAX)মান বেশি 8000 বাইট সারি মধ্যে সংরক্ষিত হয় না, কিন্তু পৃথক lob পাতায়। পরবর্তীকালে এই জাতীয় মান সহ একটি সারি পুনরুদ্ধার করতে দুই বা ততোধিক যৌক্তিক আইও অপারেশন প্রয়োজন (মূলত, তাত্ত্বিকভাবে প্রয়োজনের তুলনায় আরও একটি প্রয়োজন)।

লিঙ্কিত প্রশ্নের মধ্যে প্রদর্শিত হিসাবে আমরা একটি VARCHAR(MAX)কলাম, INCLUDEডি হিসাবে একটি অনন্য সূচীতে যুক্ত করতে পারি। যদি এই কলামে 8000 বাইটের দৈর্ঘ্যের মান থাকে তবে এই জাতীয় মানগুলি কি সূচির পাতায় "ইনলাইন" সংরক্ষণ করা যেতে পারে, বা সেগুলিও এলওবি পৃষ্ঠায় স্থানান্তরিত হবে?

উত্তর:


16

8000 বাইটের বেশি হওয়া মানগুলি "ইনলাইন" সংরক্ষণ করা যায় না। এগুলি এলওবি পৃষ্ঠায় সঞ্চিত রয়েছে। আপনি এটি sys.dm_db_index_physical_stats সহ দেখতে পারেন । একটি সাধারণ টেবিল দিয়ে শুরু করুন:

USE tempdb;

DROP TABLE IF EXISTS #LOB_FOR_ME;

CREATE TABLE #LOB_FOR_ME (
ID BIGINT,
MAX_VERNON_WAS_HERE VARCHAR(MAX) 
);

CREATE INDEX IX ON #LOB_FOR_ME (ID) INCLUDE (MAX_VERNON_WAS_HERE);

VARCHAR(MAX)কলামের জন্য 8000 বাইট নেওয়ার সাথে মান সহ কয়েকটি সারি প্রবেশ করান এবং ডিএমএফ দেখুন:

USE tempdb;

INSERT INTO #LOB_FOR_ME
SELECT 1, REPLICATE('Z', 8000)
FROM master..spt_values;

SELECT index_level, index_type_desc, alloc_unit_type_desc, page_count, record_count
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('#LOB_FOR_ME'), 2, NULL , 'DETAILED'); 

সূচীতে কোনও এলওবি পৃষ্ঠা নেই:

╔═════════════╦════════════════════╦══════════════════════╦════════════╦══════════════╗
 index_level   index_type_desc    alloc_unit_type_desc  page_count  record_count 
╠═════════════╬════════════════════╬══════════════════════╬════════════╬══════════════╣
           0  NONCLUSTERED INDEX  IN_ROW_DATA                 2540          2540 
           1  NONCLUSTERED INDEX  IN_ROW_DATA                   18          2540 
           2  NONCLUSTERED INDEX  IN_ROW_DATA                    1            18 
╚═════════════╩════════════════════╩══════════════════════╩════════════╩══════════════╝

তবে আমি যদি 8001 বাইটের মান সহ সারি যুক্ত করি:

USE tempdb;

INSERT INTO #LOB_FOR_ME
SELECT 2, REPLICATE(CAST('Z' AS VARCHAR(MAX)), 8001)
FROM master..spt_values;

SELECT index_level, index_type_desc, alloc_unit_type_desc, page_count, record_count
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('#LOB_FOR_ME'), 2, NULL , 'DETAILED'); 

আমি সবে সন্নিবেশ করা প্রতিটি সারির সূচীতে এখন আমার 1 টি এলওবি পৃষ্ঠা রয়েছে:

╔═════════════╦════════════════════╦══════════════════════╦════════════╦══════════════╗
 index_level   index_type_desc    alloc_unit_type_desc  page_count  record_count 
╠═════════════╬════════════════════╬══════════════════════╬════════════╬══════════════╣
           0  NONCLUSTERED INDEX  IN_ROW_DATA                 2556          5080 
           1  NONCLUSTERED INDEX  IN_ROW_DATA                   18          2556 
           2  NONCLUSTERED INDEX  IN_ROW_DATA                    1            18 
           0  NONCLUSTERED INDEX  LOB_DATA                    2540          2540 
╚═════════════╩════════════════════╩══════════════════════╩════════════╩══════════════╝

আপনি এটি এবং SET STATISTICS IO ON;সঠিক প্রশ্নের সাথেও দেখতে পারেন । নিম্নলিখিত ক্যোয়ারীটি বিবেচনা করুন যা কেবল 8000 বাইট সহ সারিগুলিতে দেখায়:

SELECT SUM(LEN(MAX_VERNON_WAS_HERE))
FROM #LOB_FOR_ME
WHERE ID = 1;

মৃত্যুদন্ড কার্যকর করার পরে ফলাফল:

স্ক্যান কাউন্ট 1, লজিকাল 2560, শারীরিক 0 0, পঠন-এগিয়ে 0, লব লজিকাল 0, লব শারীরিক 0

আমি যদি এর পরিবর্তে 8001 বাইটের সাহায্যে সারিগুলিকে জিজ্ঞাসা করি:

SELECT SUM(LEN(MAX_VERNON_WAS_HERE))
FROM #LOB_FOR_ME
WHERE ID = 2;

এখন আমি দেখতে পাচ্ছি:

স্ক্যান কাউন্ট 1, লজিকাল রিডিং 20, ফিজিকাল রিড 0, রিড-ফরোডড রিড 0, লব লজিকাল রিডিং 5080, লব ফিজিকাল রিড 0, লব রিড-ফরোয়ার্ড 0 0

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