ওরাকল: কোনও টেবিল দ্বারা ব্যবহৃত স্টোরেজ স্পেসটি কীভাবে সন্ধান করবেন?


12

(এন্টারপ্রাইজ ম্যানেজারের মাধ্যমে সম্ভব হলে) কীভাবে সন্ধান করবেন, একটি নির্দিষ্ট টেবিলটি মোট এমবিতে কী ব্যবহার করছেন?


উত্তর:


17

ওএম 10 জি মাধ্যমে,

  1. যথারীতি ডাটাবেসে কানেক্ট করুন
  2. Schemaট্যাবে ক্লিক করুন
  3. উপর Tablesডাটাবেস অবজেক্ট মধ্যে লিঙ্কটি
  4. স্কিমা নাম এবং বস্তুর নাম প্রবেশ করুন (alচ্ছিক) এবং ক্লিক করুন Go
  5. আপনি দেখতে চান টেবিলটি নির্বাচন করতে রেডিও বোতামটি ব্যবহার করুন এবং ক্লিক করুন Edit (টেবিলের নাম লিঙ্কে ক্লিক করবেন না)
  6. Segmentsট্যাবে ক্লিক করুন (এবং অপেক্ষা করুন ...)
  7. আপনি টেবিলের ডেটার আকার এবং ব্যবহৃত সূচকগুলি দেখতে পাবেন।

ঠিক আছে, এটি প্রযুক্তিগতভাবে আপনার প্রশ্নের উত্তর দিয়েছে। তবে আরও ভাল উপায় হ'ল:

  1. এসকিউএলপিএলএস ব্যবহার করে লগন
  2. ভিনসেন্টের কাছ থেকে স্ক্রিপ্টটি চালান।

আমি স্ক্রিপ্টটি t.sqlদ্রুত রেফারেন্স হিসাবে সংরক্ষণ করতে চাই

COLUMN size_mb      FORMAT '999,999,990.0'
COLUMN num_rows     FORMAT '999,999,990'
COLUMN fmt_short    FORMAT A24


COLUMN owner        FORMAT A16
COLUMN table_name   LIKE fmt_short
COLUMN tablespace_name  LIKE fmt_short

SET LINESIZE 200
SET AUTOTRACE OFF

COMPUTE SUM OF size_mb ON REPORT
BREAK ON REPORT

SELECT 
    lower( owner )      AS owner
    ,lower(table_name)  AS table_name
    ,tablespace_name
    ,num_rows
    ,blocks*8/1024      AS size_mb
    ,pct_free
    ,compression 
    ,logging
FROM    all_tables 
WHERE   owner           LIKE UPPER('&1')
OR  owner           = USER
ORDER BY 1,2;

CLEAR COMPUTES
CLEAR BREAKS

12

একটি টেবিল দ্বারা ব্যবহৃত স্থানটি তার সমস্ত এক্সটেন্ট দ্বারা ব্যবহৃত স্থান:

SELECT SUM(bytes), SUM(bytes)/1024/1024 MB
    FROM dba_extents
    WHERE owner = :owner
    AND segment_name = :table_name;

SUM(BYTES)         MB
---------- ----------
3066429440   2924,375

নিশ্চিত না যে এটি কাজ করবে, কারণ এটি অ্যাকাউন্টগুলিকে আমলে নেয় না?
কোডেক 10'12

1
@ কোডেক: সঠিক, এটি কেবল টেবিলের দ্বারা ব্যবহৃত স্থান। আপনি একই পদ্ধতি অনুসারে সূচকগুলির দ্বারা ব্যবহৃত স্থান গণনা করতে পারেন (যেহেতু সূচকগুলি বিভাগগুলি এবং এক্সটেন্টস রয়েছে)।
ভিনসেন্ট

প্রকৃতপক্ষে - এটি কেবল কৌতূহলোদ্দীপক, কোনও সূচকের "নাম" হিসাবে দেখা কোনও কিছু হতে পারে!
কোডেক

1
এটি কেবলমাত্র সেই টেবিলগুলির জন্য কাজ করে যেগুলিতে LOB কলাম নেই।
প্যাকওভারফ্লো

@ প্যাকওভারফ্লো ভাল পয়েন্ট !
ভিনসেন্ট

8

আপনি কি নিশ্চিত যে অল-টেবিল ভিউ ব্যবহার করে আসল পদ্ধতির মধ্যে এলওবি এক্সটেন্টস অন্তর্ভুক্ত রয়েছে? আমি মনে করি না। এখানে একটি দরকারী যা আমি খুঁজে পাচ্ছি:

with da as (
 SELECT owner, segment_name, SUM(bytes)/1024/1024 size_mb
   FROM dba_extents
   group by rollup(owner, segment_name)
) select owner, segment_name, size_mb, round(size_mb/total_mb*100)
  from da 
    cross join (
      select size_mb as total_mb 
      from da t where owner is null and segment_name is null
    )
order by size_mb desc

এটি আমাকে দেখায় যে সর্বাধিক স্থান কী ব্যবহার করছে।


2

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

সাধারণ আউটপুট হল:

table    ; segment type  ; used (mb) ; unused (mb) ;  total (mb)
user     ; INDEX         ;       0,78;         0,00;         0,78
user     ; LOBINDEX      ;       0,15;         0,00;         0,15
user     ; LOBSEGMENT    ;       3,48;         1,19;         4,67
user     ; TABLE         ;      12,11;         2,74;        14,85
address  ; INDEX         ;       0,12;         0,00;         0,12
(...)

লিপি:

DECLARE
  input_owner         NVARCHAR2(128) := 'MY_ORACLE_OWNER';
  segment_size_blocks NUMBER;
  segment_size_bytes  NUMBER;
  used_blocks         NUMBER;
  used_bytes          NUMBER;
  expired_blocks      NUMBER;
  expired_bytes       NUMBER;
  unexpired_blocks    NUMBER;
  unexpired_bytes     NUMBER;
  total_blocks        NUMBER;
  total_bytes         NUMBER;
  unused_blocks       NUMBER;
  unused_bytes        NUMBER;
  last_ext_file_id    NUMBER;
  last_ext_blk_id     NUMBER;
  last_used_blk       NUMBER;
  result_table        NVARCHAR2(128);
  result_segment_type NVARCHAR2(128);
  result_used_mb      NUMBER;
  result_unused_mb    NUMBER;
  result_total_mb     NUMBER;
  CURSOR cur
  IS
    SELECT
      s.segment_name   AS segment_name,
      s.owner          AS segment_owner,
      s.partition_name AS partition_name,
      s.segment_type   AS segment_type,
      CASE WHEN s.segment_type IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION')
        THEN s.segment_name
      WHEN s.segment_type IN ('INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION')
        THEN (SELECT i.table_name
              FROM dba_indexes i
              WHERE s.segment_name = i.index_name AND s.owner = i.owner)
      WHEN s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION')
        THEN (SELECT l.table_name
              FROM dba_lobs l
              WHERE s.segment_name = l.segment_name AND s.owner = l.owner)
      WHEN s.segment_type IN ('LOBINDEX')
        THEN (SELECT l.table_name
              FROM dba_lobs l
              WHERE s.segment_name = l.index_name AND s.owner = l.owner)
      ELSE 'Unknown'
      END              AS table_name,
      s.bytes          AS segment_bytes
    FROM dba_segments s
    WHERE owner = input_owner
    ORDER BY table_name, segment_type;
BEGIN
  dbms_output.put_line('table                         ; segment type        ;   used (mb)     ; unused (mb)     ;  total (mb)');

  FOR ro IN cur
  LOOP

    result_table := ro.table_name;
    result_segment_type := ro.segment_type;

    IF ro.segment_type IN ('TABLE', 'INDEX')
    THEN
      dbms_space.unused_space(
          segment_owner             => ro.segment_owner,
          segment_name              => ro.segment_name,
          segment_type              => ro.segment_type,
          total_blocks              => total_blocks,
          total_bytes               => total_bytes,
          unused_blocks             => unused_blocks,
          unused_bytes              => unused_bytes,
          last_used_extent_file_id  => last_ext_file_id,
          last_used_extent_block_id => last_ext_blk_id,
          last_used_block           => last_used_blk);

      result_used_mb := (total_bytes - unused_bytes) / 1024 / 1024;
      result_unused_mb := unused_bytes / 1024 / 1024;
      result_total_mb := total_bytes / 1024 / 1024;

    ELSIF ro.segment_type IN ('LOBSEGMENT')
    THEN
      dbms_space.space_usage(
          segment_owner           => ro.segment_owner,
          segment_name            => ro.segment_name,
          segment_type            => 'LOB',
          partition_name          => ro.partition_name,
          segment_size_blocks     => segment_size_blocks,
          segment_size_bytes      => segment_size_bytes,
          used_blocks             => used_blocks,
          used_bytes              => used_bytes,
          expired_blocks          => expired_blocks,
          expired_bytes           => expired_bytes,
          unexpired_blocks        => unexpired_blocks,
          unexpired_bytes         => unexpired_bytes
      );
      result_used_mb := used_bytes / 1024 / 1024;
      result_unused_mb := (segment_size_bytes - used_bytes) / 1024 / 1024;
      result_total_mb := segment_size_bytes / 1024 / 1024;
    ELSE
      -- TODO ??
      result_used_mb := ro.segment_bytes / 1024 / 1024;
      result_unused_mb := 0;
      result_total_mb := result_used_mb + result_unused_mb;
    END IF;

    dbms_output.put_line(
        RPAD(result_table, 30) || '; ' ||
        RPAD(result_segment_type, 20)|| '; ' ||
        TO_CHAR(result_used_mb  / 1024 / 1024, '999999999990D00')|| '; ' ||
        TO_CHAR(result_unused_mb  / 1024 / 1024, '999999999990D00')|| '; ' ||
        TO_CHAR(result_total_mb / 1024 / 1024, '999999999990D00'));

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