1

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

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

4

3 回答 3

1

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

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

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

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

于 2014-04-02T21:03:37.477 回答
0

这能满足你的需要吗?

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;
于 2014-04-02T18:39:31.090 回答
0

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

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;
/
于 2016-05-11T05:28:56.613 回答