【问题标题】:In Oracle, is there a way to find shared pool usage per tablespace?在 Oracle 中,有没有办法找到每个表空间的共享池使用情况?
【发布时间】:2014-04-02 18:18:42
【问题描述】:

我们目前为每个 Oracle 实例维护“N”个表空间。我们想看看我们是否可以扩大规模。有没有办法找到每个表空间的共享池使用情况? Oracle 是否也维护这些统计信息?

Oracle 让我们可以访问许多视图,所以我想知道如何最好地解决这个问题。

【问题讨论】:

  • 你想“扩大规模”什么?您是否正在谈论添加表空间,因为您将多个数据库整合到一个数据库中,从而增加了表空间的数量?否则,我不确定我是否了解您要解决的业务问题。无论您要解决什么问题,我都会打赌有更好的方法。如果您确定您的方法是您想要的方法,我猜您希望报告基于缓冲区缓存(存储数据块)而不是共享池(存储 SQL 语句)中的内容。
  • 啊,是的。我想在不超载实例的情况下向同一个实例添加更多表空间。你是正确的,共享池不是唯一共享的区域。基本上,我正在寻找每个表空间的 SGA 使用情况。
  • 您是否因为将多个数据库中的应用程序整合到一个数据库中而添加了更多表空间?否则,我不清楚添加表空间如何或为什么会与系统过载有关。如果您的工作负载保持不变,则表空间的数量无关紧要。
  • 是的,这是为了将更多应用程序引入单个数据库。工作量必然会与表空间的数量成比例地增加。
  • 如果您正在谈论向现有应用程序添加功能,那么专注于表空间是一个红鲱鱼。这是您需要关注的额外工作负载,无论工作负载影响的对象驻留在哪个表空间中。如果您正在编写其他功能,您通常希望在较低环境中运行一些性能测试以确定新功能对现有功能的影响,这些影响可能来自缓冲区缓存之外的各种不同因素。

标签: oracle shared-memory tablespace


【解决方案1】:

您正在向应用程序添加额外的自定义功能,因此不适合使用表空间作为代理。新功能的性能影响将取决于新功能生成的工作负载,这与新代码引用的对象恰好驻留在哪个表空间无关。对象驻留在的表空间不会影响性能。

了解当前缓冲区缓存的使用方式并不能让您深入了解额外的功能如何影响缓存的性能,这些功能会导致新块被缓存并迫使一些现有块更快地老化。现有功能。除非你有一个小玩具应用程序,否则缓冲区缓存会充满一些东西。但是,缓冲区高速缓存已满这一事实并不能告诉您,在边缘,为了支持新功能而老化的额外块是否会导致数百万次额外的物理读取,或者它们是否没有对性能的影响。

不过,除了缓冲区缓存之外,新功能可能会通过消耗额外的 CPU 周期、给 I/O 子系统增加额外负载或锁定会对现有功能的性能产生负面影响的行来影响性能。理论上,可以对附加功能可能如何影响现有系统进行一些大致估计。然而,这不是胆小的人的任务,而是一项相当复杂的工作。

幸运的是,由于您是构建新功能的人,因此您有一个更简单的解决方案。您可以在较低的环境中对现有应用程序进行基准测试,添加新功能,然后使用新功能对现有功能进行基准测试。这使您可以进行更高级别的比较——例如,您是在比较更改前后的事务时间,而不是测量 CPU 消耗之类的东西并尝试模拟这将如何影响事务时间。而且它通常更容易实现——您所需要的只是某种负载测试,它以与 prod 中的使用方式大致相似的方式来练习现有功能。

【讨论】:

    【解决方案2】:

    这能满足你的需要吗?

    SELECT a.tablespace_name, a.file_name, a.bytes allocated_bytes, b.free_bytes 
    FROM dba_data_files a, 
      (SELECT file_id, SUM(bytes) free_bytes FROM dba_free_space b GROUP BY file_id) b 
    WHERE a.file_id=b.file_id ORDER BY a.tablespace_name;
    

    【讨论】:

    • 不,这是磁盘空间使用情况。我正在寻找 SGA 内存使用拆分
    【解决方案3】:

    您可以运行它来获取共享内存池的统计信息。不完全是你想要的,但可能会帮助你。

    SET serveroutput on;
    
    DECLARE
       object_mem       NUMBER;
       shared_sql       NUMBER;
       cursor_mem       NUMBER;
       mts_mem          NUMBER;
       used_pool_size   NUMBER;
       free_mem         NUMBER;
       pool_size        VARCHAR2 (512);                     -- Now from V$SGASTAT
    BEGIN
       -- Stored objects (packages, views)
       SELECT SUM (sharable_mem)
         INTO object_mem
         FROM v$db_object_cache;
    
       -- Shared SQL -- need to have additional memory if dynamic SQL used
       SELECT SUM (sharable_mem)
         INTO shared_sql
         FROM v$sqlarea;
    
       -- User Cursor Usage -- run this during peak usage.
       --  assumes 250 bytes per open cursor, for each concurrent user.
       SELECT SUM (250 * users_opening)
         INTO cursor_mem
         FROM v$sqlarea;
    
       -- For a test system -- get usage for one user, multiply by # users
       -- select (250 * value) bytes_per_user
       -- from v$sesstat s, v$statname n
       -- where s.statistic# = n.statistic#
       -- and n.name = 'opened cursors current'
       -- and s.sid = 25;  -- where 25 is the sid of the process
       -- MTS memory needed to hold session information for shared server users
       -- This query computes a total for all currently logged on users (run
       --  multiply by # users.
       SELECT SUM (VALUE)
         INTO mts_mem
         FROM v$sesstat s, v$statname n
        WHERE s.statistic# = n.statistic# AND n.NAME = 'session uga memory max';
    
       -- Free (unused) memory in the SGA: gives an indication of how much memory
       -- is being wasted out of the total allocated.
       SELECT BYTES
         INTO free_mem
         FROM v$sgastat
        WHERE NAME = 'free memory' AND pool = 'shared pool';
    
       -- For non-MTS add up object, shared sql, cursors and 20% overhead.
       used_pool_size := ROUND (1.2 * (object_mem + shared_sql + cursor_mem));
    
       -- For MTS mts contribution needs to be included (comment out previous line)
       -- used_pool_size := round(1.2*(object_mem+shared_sql+cursor_mem+mts_mem));
       SELECT SUM (BYTES)
         INTO pool_size
         FROM v$sgastat
        WHERE pool = 'shared pool';
    
       -- Display results
       DBMS_OUTPUT.put_line ('Shared Pool Memory Utilization Report');
       DBMS_OUTPUT.put_line ('Obj mem:  ' || TO_CHAR (object_mem) || ' bytes');
       DBMS_OUTPUT.put_line ('Shared sql:  ' || TO_CHAR (shared_sql) || ' bytes');
       DBMS_OUTPUT.put_line ('Cursors:  ' || TO_CHAR (cursor_mem) || ' bytes');
       -- dbms_output.put_line ('MTS session: '||to_char (mts_mem) || ' bytes');
       DBMS_OUTPUT.put_line (   'Free memory: '
                             || TO_CHAR (free_mem)
                             || ' bytes '
                             || '('
                             || TO_CHAR (ROUND (free_mem / 1024 / 1024, 2))
                             || 'MB)'
                            );
       DBMS_OUTPUT.put_line (   'Shared pool utilization (total):  '
                             || TO_CHAR (used_pool_size)
                             || ' bytes '
                             || '('
                             || TO_CHAR (ROUND (used_pool_size / 1024 / 1024, 2))
                             || 'MB)'
                            );
       DBMS_OUTPUT.put_line (   'Shared pool allocation (actual):  '
                             || pool_size
                             || ' bytes '
                             || '('
                             || TO_CHAR (ROUND (pool_size / 1024 / 1024, 2))
                             || 'MB)'
                            );
       DBMS_OUTPUT.put_line (   'Percentage Utilized:  '
                             || TO_CHAR (ROUND (used_pool_size / pool_size * 100))
                            );
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2019-07-07
      • 2013-02-17
      相关资源
      最近更新 更多