sys.allocation_units এবং sp_spaceused এ স্থান ব্যবহার


13

এটি একটি পরিচিত সত্য যে ডিএমভিগুলি পৃষ্ঠাগুলির সংখ্যা এবং সারিগুলির গণনা সম্পর্কিত সঠিক তথ্য রাখে না। তবে, যখন আপনার পরিসংখ্যান আপডেট হয়েছে, কেন তারা তা করবে না তা আমি দেখতে পাচ্ছি না।

আমি একটি মনিটরিং সরঞ্জামে কাজ করছি, প্রতিটি সূচক এবং ডেটা ইত্যাদির ডিস্ক আকার জানতে চাই Event শেষ পর্যন্ত আমি সঠিক ফিল ফ্যাক্টর এবং অন্যান্য জিনিস ইত্যাদি সন্ধান করতে চাই

আমার ফাংশন দ্বারা ব্যবহৃত স্থান এবং পুরাতন sp_spaceused স্থান স্থান ব্যবহারের ক্ষেত্রে কিছুটা আলাদা তবে রেকর্ড গণনায় নয়।

আমার সিলেক্টে কিছু অনুপস্থিত আছে কি দেখতে পাচ্ছেন?

এটি হল স্পেস স্পেসযুক্ত (তারপর আমি সংখ্যাগুলিকে এমবিতে রূপান্তর করি):

sp_spaceused 'tblBOrderRelationship'
go

select 318008/1024.00 AS reserved,
140208/1024.00  AS data,
177048/1024.00 AS index_size,
752/1024.00    AS unused

এখানে চিত্র বর্ণনা লিখুন

তবে আমি যখন আমার নির্বাচন, নীচের চিত্রের নীচে কোড চালাচ্ছি তখন আমি কিছুটা আলাদা চিত্র পেয়েছি different

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT 
    schema_name(t.schema_id) as SchemaName,
    t.NAME AS TableName,
    t.type_desc,
    t.is_ms_shipped,
    t.is_published,
    t.lob_data_space_id,
    t.filestream_data_space_id,
    t.is_replicated,
    t.has_replication_filter,
    t.is_merge_published,
    t.is_sync_tran_subscribed,
    --t.is_filetable,
    i.name as indexName,
    i.type_desc,
    i.is_unique,
    i.is_primary_key,
    i.is_unique_constraint,
    i.fill_factor,
    i.is_padded,


    sum(p.rows)               OVER (PARTITION BY t.OBJECT_ID,i.index_id)  as RowCounts,
    sum(a.total_pages)        OVER (PARTITION BY t.OBJECT_ID,i.index_id)  as TotalPages, 
    sum(a.used_pages)         OVER (PARTITION BY t.OBJECT_ID,i.index_id)  as UsedPages, 
    sum(a.data_pages)         OVER (PARTITION BY t.OBJECT_ID,i.index_id)  as DataPages,

    (sum(a.total_pages)       OVER (PARTITION BY t.OBJECT_ID,i.index_id)  * 8) / 1024 as TotalSpaceMB, 
    (sum(a.used_pages)        OVER (PARTITION BY t.OBJECT_ID,i.index_id)  * 8) / 1024 as UsedSpaceMB, 
    (sum(a.data_pages)        OVER (PARTITION BY t.OBJECT_ID,i.index_id)  * 8) / 1024 as DataSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 
AND T.NAME = 'tblBOrderRelationship'

চিএ

চিএ

সূচকের নাম সহ আরও বড় ছবি সূচকের নাম সহ আরও বড় ছবি

ফলাফলগুলি পরীক্ষা করার জন্য এখন কিছু গণনা করা হচ্ছে:

--==================================
-- the figures from sp_spaceused
--==================================
select 318008/1024.00 AS reserved,
140208/1024.00  AS data,
177048/1024.00 AS index_size,
752/1024.00    AS unused

--==================================
-- the figures from my select
--==================================
select 137+61+56+54 AS reserved,
       137 AS data,
       61+56+54 AS index_size

এখানে চিত্র বর্ণনা লিখুন

এটি খুব বেশি দূরে নয়, সত্যই বাদে আমি অব্যবহৃত স্থান গণনা করি না!

এটি সঠিক করতে আমি কী করতে পারি?

পরিবর্তনের পরে:

আমি 1024 প্রতি 1024.00 দ্বারা প্রতিস্থাপন করার পরে ফলাফলগুলি আরও অনেক নির্ভুল। আমি লক্ষ্য করেছি যে রেকর্ডগুলি প্রশ্নাবদ্ধ টেবিলে inোকানো হয়েছে এবং স্পষ্টতই পরিসংখ্যানগুলি এতটা আপ টু ডেট নয়, তবে এখনও ফলাফল মেলে (1 এমবি ব্যবধানের অধীনে - যা আমার পক্ষে সব ঠিক আছে)

নতুন ফলাফল সেটগুলি হ'ল:

--==================================
-- the figures from sp_spaceused
--==================================
select
318072 /1024.00 AS reserved,
140208 /1024.00 AS data,
177096 /1024.00 AS index_size,
768 /1024.00 AS unused
go

--==================================
-- the figures from my select
--==================================
select 137.7578125+61.7968750+56.4218750+54.6406250 as reserved,
       137.7578125 as data,
       61.7968750+56.4218750+54.6406250 as index_size

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


24

আপনি তাত্ক্ষণিক রাউন্ডিং ইস্যুটি স্থির করে নিলেও, প্রতি-বস্তু / সূচী পরিসংখ্যান পাওয়ার সামগ্রিক অ্যালগরিদমটি ভুল। এটি LOB এবং সারি-ওভারফ্লো ডেটা সঠিকভাবে পরিচালনা করে না। এটিও বাদ দেয়: সূচী দর্শন, ফুলটেক্সট সূচী, এক্সএমএল সূচক এবং আরও কয়েকটি কেস। সুতরাং, আপনি আপনার সমস্ত ডেটা দেখতে পাচ্ছেন না।

(নিচের কোডটি আমি Stackoverflow উপর একটি উত্তর পোস্ট একটি অভিযোজিত হয় sp_spaceused - সব SQL এর যে টেবিলের মধ্যে গিগাবাইট মাপ পরিমাপ কিভাবে ) সমস্ত মামলার হ্যান্ডলগুলি যে sp_spaceusedহ্যান্ডলগুলি। এই প্রশ্নটি কেবলমাত্র প্রতি-বস্তুর পরিসংখ্যানের সাথে সম্পর্কিত ছিল, প্রতি সূচক অনুসারে নয়, তাই আমি সূচী পর্যায়ে জিনিসগুলি পরিচালনা করতে কোডটি সামঞ্জস্য করেছি।

;WITH agg AS
(   -- Get info for Tables, Indexed Views, etc
    SELECT  ps.[object_id] AS [ObjectID],
            ps.index_id AS [IndexID],
            NULL AS [ParentIndexID],
            NULL AS [PassThroughIndexName],
            NULL AS [PassThroughIndexType],
            SUM(ps.in_row_data_page_count) AS [InRowDataPageCount],
            SUM(ps.used_page_count) AS [UsedPageCount],
            SUM(ps.reserved_page_count) AS [ReservedPageCount],
            SUM(ps.row_count) AS [RowCount],
            SUM(ps.lob_used_page_count + ps.row_overflow_used_page_count)
                    AS [LobAndRowOverflowUsedPageCount]
    FROM    sys.dm_db_partition_stats ps
    GROUP BY    ps.[object_id],
                ps.[index_id]
    UNION ALL
    -- Get info for FullText indexes, XML indexes, Spatial indexes, etc
    SELECT  sit.[parent_id] AS [ObjectID],
            sit.[object_id] AS [IndexID],
            sit.[parent_minor_id] AS [ParentIndexID],
            sit.[name] AS [PassThroughIndexName],
            sit.[internal_type_desc] AS [PassThroughIndexType],
            0 AS [InRowDataPageCount],
            SUM(ps.used_page_count) AS [UsedPageCount],
            SUM(ps.reserved_page_count) AS [ReservedPageCount],
            0 AS [RowCount],
            0 AS [LobAndRowOverflowUsedPageCount]
    FROM    sys.dm_db_partition_stats ps
    INNER JOIN  sys.internal_tables sit
            ON  sit.[object_id] = ps.[object_id]
    WHERE   sit.internal_type IN
               (202, 204, 207, 211, 212, 213, 214, 215, 216, 221, 222, 236)
    GROUP BY    sit.[parent_id],
                sit.[object_id],
                sit.[parent_minor_id],
                sit.[name],
                sit.[internal_type_desc]
), spaceused AS
(
SELECT  agg.[ObjectID],
        agg.[IndexID],
        agg.[ParentIndexID],
        agg.[PassThroughIndexName],
        agg.[PassThroughIndexType],
        OBJECT_SCHEMA_NAME(agg.[ObjectID]) AS [SchemaName],
        OBJECT_NAME(agg.[ObjectID]) AS [TableName],
        SUM(CASE
                WHEN (agg.IndexID < 2) THEN agg.[RowCount]
                ELSE 0
            END) AS [Rows],
        SUM(agg.ReservedPageCount) * 8 AS [ReservedKB],
        SUM(agg.LobAndRowOverflowUsedPageCount +
            CASE
                WHEN (agg.IndexID < 2) THEN (agg.InRowDataPageCount)
                ELSE 0
            END) * 8 AS [DataKB],
        SUM(agg.UsedPageCount - agg.LobAndRowOverflowUsedPageCount -
            CASE
                WHEN (agg.IndexID < 2) THEN agg.InRowDataPageCount
                ELSE 0
            END) * 8 AS [IndexKB],
        SUM(agg.ReservedPageCount - agg.UsedPageCount) * 8 AS [UnusedKB],
        SUM(agg.UsedPageCount) * 8 AS [UsedKB]
FROM    agg
GROUP BY    agg.[ObjectID],
            agg.[IndexID],
            agg.[ParentIndexID],
            agg.[PassThroughIndexName],
            agg.[PassThroughIndexType],
            OBJECT_SCHEMA_NAME(agg.[ObjectID]),
            OBJECT_NAME(agg.[ObjectID])
)
SELECT sp.SchemaName,
       sp.TableName,
       sp.IndexID,
       CASE
         WHEN (sp.IndexID > 0) THEN COALESCE(si.[name], sp.[PassThroughIndexName])
         ELSE N'<Heap>'
       END AS [IndexName],
       sp.[PassThroughIndexName] AS [InternalTableName],
       sp.[Rows],
       sp.ReservedKB,
       (sp.ReservedKB / 1024.0 / 1024.0) AS [ReservedGB],
       sp.DataKB,
       (sp.DataKB / 1024.0 / 1024.0) AS [DataGB],
       sp.IndexKB,
       (sp.IndexKB / 1024.0 / 1024.0) AS [IndexGB],
       sp.UsedKB AS [UsedKB],
       (sp.UsedKB / 1024.0 / 1024.0) AS [UsedGB],
       sp.UnusedKB,
       (sp.UnusedKB / 1024.0 / 1024.0) AS [UnusedGB],
       so.[type_desc] AS [ObjectType],
       COALESCE(si.type_desc, sp.[PassThroughIndexType]) AS [IndexPrimaryType],
       sp.[PassThroughIndexType] AS [IndexSecondaryType],
       SCHEMA_ID(sp.[SchemaName]) AS [SchemaID],
       sp.ObjectID
       --,sp.ParentIndexID
FROM   spaceused sp
INNER JOIN sys.all_objects so -- in case "WHERE so.is_ms_shipped = 0" is removed
        ON so.[object_id] = sp.ObjectID
LEFT JOIN  sys.indexes si
       ON  si.[object_id] = sp.ObjectID
      AND  (si.[index_id] = sp.IndexID
         OR si.[index_id] = sp.[ParentIndexID])
WHERE so.is_ms_shipped = 0
--so.[name] LIKE N''  -- optional name filter
--ORDER BY ????

8

আপনি ভাগ করে নিচ্ছেন INTতাই আপনি কেবল কখনও পুরো সংখ্যার উত্তর পাবেন।

অতএব আপনি আপনার নিজের স্পেস গণনাগুলিতে গোলাকার সমস্যাটি শেষ করেন। এই কারণেই, আপনি যখন তাদের একত্রে যোগ করেন, তখন আপনি আলাদা উত্তর পান।

যদিও পার্থক্যটি ন্যূনতম তবে এসকিউএল সার্ভারে নন-পুরো সংখ্যাগুলি পরিচালনা করার সাথে এই কীগুলি 'গোটচস' এর মধ্যে একটি।

পদ্ধতিতে আপনার পার্টিশন কোয়েরি পরিবর্তন করুন:

(sum(a.total_pages)       OVER (PARTITION BY t.OBJECT_ID,i.index_id)  * 8) / 1024.00 as TotalSpaceMB, 
(sum(a.used_pages)        OVER (PARTITION BY t.OBJECT_ID,i.index_id)  * 8) / 1024.00 as UsedSpaceMB, 
(sum(a.data_pages)        OVER (PARTITION BY t.OBJECT_ID,i.index_id)  * 8) / 1024.00 as DataSpaceMB
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.