यहाँ केंद्र लिटिल द्वारा विभाजन पर एक अच्छा प्राइमर है। इससे आपको इस सवाल का जवाब देने में मदद मिलेगी कि विभाजन करना है या नहीं। http://www. brentozar.com/archive/2012/03/how-decide-if- should-use-table-partitioning/
मेरे पास एक सिफारिश यह सुनिश्चित करने के लिए है कि तालिका में आने वाली प्रत्येक क्वेरी विधेय में विभाजन उन्मूलन का उपयोग करती है।
फ़ाइल समूहों के लिए, ध्यान रखें कि विभाजन योजना विभाजन को फ़ाइल समूह में मैप करती है। यदि आप प्रति टैनेंट 1 फ़ाइल समूह करना चाहते हैं तो यह जटिल हो सकता है।
SQL सर्वर 2005 - 2008 R2 के साथ, 1,000 विभाजन अधिकतम हैं जो एक तालिका में हो सकते हैं। 2012 के साथ, उन्होंने सीमा को बढ़ाकर 15,000 विभाजन कर दिया। यदि आपको इससे अधिक की आवश्यकता है, तो विभाजन मानों को स्थान दें और सीमा को यह निर्धारित करने दें कि डेटा किस विभाजन में जाएगा।
यहां एक टेबल वैल्यू फ़ंक्शन है जिसका उपयोग आप विभाजन द्वारा अंतरिक्ष उपयोग प्राप्त करने के लिए कर सकते हैं:
CREATE FUNCTION tvfPartitionAllocationDetails (@schema_name sysname, @table_name sysname)
RETURNS TABLE
AS
RETURN
select f.data_space_id,
f.NAME AS file_group_name,
SCHEMA_NAME(t.schema_id) AS table_schema,
t.name AS table_name,
[HOBT?] = CASE pst.index_id WHEN 0 THEN 'HEAP' WHEN 1 THEN 'B-TREE' END,
p.partition_number,
ps.name AS partition_scheme_name,
pf.name AS partition_function_name,
partition_function_range = CASE pf.boundary_value_on_right WHEN 1 THEN 'RIGHT' WHEN 0 THEN 'LEFT' END,
left_prv.value AS left_range,
right_prv.value AS right_value,
ISNULL(STR(CAST(left_prv.value AS BIGINT)), '-INF')
+ CASE WHEN pf.boundary_value_on_right = 0 THEN ' < '
ELSE ' <= '
END + 'X' + CASE WHEN pf.boundary_value_on_right = 0 THEN ' <= '
ELSE ' < '
END + ISNULL(STR(CAST(right_prv.value AS BIGINT)), 'INF') AS range_desc
,SUM(used_page_count) * 8 [TableSpaceUsed(KB)]
,(SELECT SUM(ISNULL(used_page_count,0)) * 8 FROM sys.dm_db_partition_stats WHERE object_id = p.OBJECT_ID AND partition_number = p.partition_number AND index_id > 1) [NCIndexSpaceUsed(KB)]
,SUM(used_page_count) used_page_count
,row_count
from sys.dm_db_partition_stats pst
INNER JOIN sys.partitions p ON pst.partition_id = p.partition_id
JOIN sys.tables t
ON p.object_id = t.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
JOIN sys.allocation_units au
ON p.hobt_id = au.container_id
JOIN sys.filegroups f
ON au.data_space_id = f.data_space_id
LEFT JOIN sys.partition_schemes ps
ON ps.data_space_id = i.data_space_id
LEFT JOIN sys.partition_functions pf
ON ps.function_id = pf.function_id
LEFT JOIN sys.partition_range_values left_prv
ON left_prv.function_id = ps.function_id
AND left_prv.boundary_id + 1 = p.partition_number
LEFT JOIN sys.partition_range_values right_prv
ON right_prv.function_id = ps.function_id
AND right_prv.boundary_id = p.partition_number
where pst.object_id = object_id(quotename(@schema_name) + '.' + quotename(@table_name))
AND used_page_count > 0
AND pst.index_id IN (0,1)/*Remove Nonclustered index counts*/
GROUP BY f.data_space_id,
f.NAME,
t.schema_id,
t.name,
p.partition_number,
ps.name,
pf.name,
pf.boundary_value_on_right,
left_prv.value,
right_prv.value,
ISNULL(STR(CAST(left_prv.value AS BIGINT)), '-INF')
+ CASE WHEN pf.boundary_value_on_right = 0 THEN ' < '
ELSE ' <= '
END + 'X' + CASE WHEN pf.boundary_value_on_right = 0 THEN ' <= '
ELSE ' < '
END + ISNULL(STR(CAST(right_prv.value AS BIGINT)), 'INF') ,
row_count,
p.OBJECT_ID,
pst.index_id;
फिर आप टेबल वैल्यू वाले फंक्शन को इस तरह से क्वेरी कर सकते हैं:
SELECT * FROM dbo.tvfPartitionAllocationDetails('dbo','mytablename');
यह कोई आउट ऑफ रो या लॉब पेज नहीं मानता है। यदि आपके पास वे हैं, और उन्हें प्रदर्शित करना चाहते हैं, तो उन्हें आसानी से फ़ंक्शन में जोड़ा जा सकता है।