AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 87132
Accepted
whysoserious
whysoserious
Asked: 2014-12-29 23:56:43 +0800 CST2014-12-29 23:56:43 +0800 CST 2014-12-29 23:56:43 +0800 CST

应用程序测试:在 Oracle 中使用多个用户而不是 mem H2。如何让它尽可能快?

  • 772

出于显而易见的原因,我决定停止使用 H2(我在生产中使用 Oracle,兼容模式是假的)。因此,我编写了简单的测试框架,它为我的应用程序中的每个测试执行以下操作:

  1. 生成随机用户名(在下面的示例中是test_user)。

  2. 创建新用户和表空间:

    create tablespace test_user_ts
    datafile 'test_user_tabspace.dat'
    size 10M reuse
    autoextend on next 500K;
    
    create temporary tablespace test_user_ts_tmp
    tempfile 'test_user.tabspace_temp.dat'
    size 10M reuse
    autoextend on next 500K;
    
    create user test_user
    identified by test_password
    default tablespace test_user_ts
    temporary tablespace test_user_ts_tmp;
    
    grant create session to test_user;
    
    grant all privileges to test_user;
    
  3. 用测试数据填充数据库。

  4. 运行测试。

  5. 清理:

    drop user test_user cascade;
    drop tablespace test_user_ts_tmp;
    drop tablespace test_user_ts;
    

问题是阶段 1-3 很慢。我怎样才能使它们尽可能快?有没有办法将现有的数据库模式复制到另一个数据库模式?

数据库版本:Oracle 11g

我可以完全控制 Oracle 实例。它在我的开发机器上运行在一个 vagrant 图像上。

oracle testing
  • 2 2 个回答
  • 393 Views

2 个回答

  • Voted
  1. Best Answer
    o0x258
    2014-12-30T03:01:01+08:002014-12-30T03:01:01+08:00

    加速2:

    • 如果您创建的表空间比方说 100M 并将其扩展为 50M 或 100M,则您的数据库比使用 500k 扩展要快得多。这样数据库就不断地扩展文件。
    • 您还可以使用 ASM,它创建文件的速度比传统文件系统快得多。

      EDIT1:ASM 的结构与普通文件系统不同。例如,在 ext4 中创建一个 32G 的文件需要 3-8 分钟。在 ASM 中,它只需要几分之一秒。原因是,在 ASM 中,您不必更新大量文件系统记录来分配空间。我会说一般来说 ASM 比其他文件系统稍微快一些,因为它针对 Oracle 数据库进行了优化。

    加速3:

    你如何用测试数据填充数据库?

    • impdp:如果你有 EE,你可以用多个线程加载
    • 插入语句文件:你无能为力
    • sqlLoader:sqlLoader 非常快并且有一些选项可以调整进程
    • INSERT INTO AS SELECT...在 EE 中你可以使用并行查询,在 SE 中你必须将它拆分并启动多个外部线程。

    优化5:

    • 就像提到的 ibre5041 一样,您不必一直删除表空间。如果你仍然想为每个测试创建一个新的表空间,那么删除表空间drop tablespace test_user including contents and datafiles;。此命令也将删除数据文件。
    • 您可以使用默认的临时表空间。您不需要为每个用户提供临时表。

    编辑1:

    • 每个数据库都有一个默认的临时表空间,如果您没有指定,数据库用户将使用该临时表空间。所以如果你配置数据库如下:

    alter database default temporary tablespace temp;

    (this is the default configuration by the way)

    您可以使用此命令创建用户:create user <username> identified by <pw> default tablespace test_user_ts quota unlimited on test_user_ts;

    从性能方面来说,您不必创建多个临时表空间。

    在内存中(EDIT1)

    从 Oracle 12c 开始,您可以使用 In-Memory 选项(请记住,这是一个额外的成本选项)。它是一种与普通数据缓冲区高速缓存完全不同的内存结构。我们用它做了一些基准测试,它非常非常快。

    在 Oracle 11g 中没有 In-Memory 选项,但这并不意味着您无法优化数据库性能。我会推荐以下行动计划来找出最佳内存设置:

    1. 使用 AWR 报告或 statspack 报告(取决于您是否有诊断包许可)

      • 检查缓冲区命中率(应在 90% 以上)
      • 或者检查是否 / = x。“x”应低于 10%
      • 检查缓冲区缓存咨询列表(这不是很可靠,但它给了你一个想法)
      • 检查缓冲区缓存与共享池的大小,共享池不应大于缓冲区缓存
    2. 调整内存参数

      • 使用大页面(use_large_pages=TRUE)(需要配置操作系统,不适用于win)
      • 如果缓冲区高速缓存命中率小于 90%,则增加 sga 大小(sga_target 和 sga_max_size)
      • 如果共享池过度扩展,则将缓冲区缓存的最小大小设置为至少 sga 大小的 60% (db_cache_size = sga_target/100*60)
      • 也许(!!!)您可以使用 KEEP 和 RECYCLE 池来优化数据缓冲区缓存的使用。
    • 2
  2. whysoserious
    2014-12-30T16:06:09+08:002014-12-30T16:06:09+08:00

    实际上,我想到了另一种可能的方法。

    1. 使用表空间创建数据库n。

    2. 测试框架将维护这些表空间的池。

    3. 每个测试都会从池中租用一个表空间。

    4. 当返回表空间时,框架会清理它并使其准备好供另一个测试使用。

    5. 如果所有表空间都在使用中,那么框架只会创建一个新表空间!

    你怎么看?

    它可以独立于 @ora-600 提到的优化来完成。

    • 0

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve