pl/sql 比游标慢

王胡子

我正在转换 SQL Server 系统以在 Oracle (11g) 上运行。系统已经全部搭建完成,数据加载等,数据量相当大(表中160m记录等)。服务器是 HP DL380,具有 1tb raid 1+0 和 96gb 内存。

在测试中,我发现莫名其妙的是,使用 3-4 个表的 SQL 插入语句需要运行 90 多分钟,而使用游标的相同逻辑需要大约 3 分钟!

游标大约需要 8 分钟,SQL Server 上的 SQL 大约需要 2-3 分钟(这是我期望的)。

换句话说,Oracle SQL 比游标慢 30-50 倍。它给我的印象是 Oracle 系统在 OLTP(单个记录插入)方面非常快,但在 SQL 中处理更大的表时真的很慢。

我确定这不是通常的情况,所以我问,是否有任何需要调整的 Oracle '参数'?

下面是使用的 SQL 的示例:

INSERT INTO TMP_TXN ......
SELECT .......
  FROM TXN (160m rows), CUSTOMERS (1m rows), PRODUCTS (1k rows)
 WHERE TXN.TXN_DATE = p_date 
   AND TXN.TXN_AMOUNT > 0 
   AND TXN.PRODUCT_ID = PRODUCTS.PRODUCT_ID 
   AND PRODUCTS.PRODTYPE_ID IN ('1', '12', '13');
   AND TXN.CUSTOMER_ID = CUSTOMERS.CUSTOMER_ID 
   AND CUSTOMERS.CUSTOMER_STATUS LIKE 'A%' 

FOR item IN (SELECT .....
              FROM TXN (160m rows), CUSTOMERS (1m rows), PRODUCTS (1k rows)
              WHERE TXN.CUSTOMER_ID = CUSTOMERS.CUSTOMER_ID
                AND CUSTOMERS.CUSTOMER_STATUS LIKE 'A%'
                AND TXN.PRODUCT_ID = PRODUCTS.PRODUCT_ID
                AND PRODUCTS.PRODTYPE_ID IN ('1', '12', '13')
                AND TXN.TXN_DATE = p_date
                AND TXN.TXN_AMOUNT > 0
              ORDER BY CUSTOMER_ID);
  LOOP         
     IF item.customer_id <> customer_id_old THEN
     etc.

索引(在 TXN 上)用于 CUSTOMER_ID 和 TXN_DATE。TMP_TXN 上的索引用于 CUSTOMER_ID(以及此脚本不需要的其他几个)。

请不要纠结于这个示例 SQL。它实际上是数百个之一,每个运行缓慢,但使用游标时,脚本运行速度快 10-50 倍。运行 SQL 时,我查看了资源监视器,发现数据表空间几乎没有被触及(1mb/秒),而 UNDO/REDO 表空间是 3-50mb/秒。REDO 日志文件被调整为 10gb,因为它们之前大约每 1-2 秒切换一次!

由于这是完全错误的,我的猜测是我遗漏了一些 Oracle 设置问题。对于 Oracle SQL 的这种令人难以置信的缓慢性能有什么想法吗?

瑞克曼X

如果你只是做一些大批量的操作,不需要Oracle的实时备份,你可以考虑使用Direct Load Insert,这样会跳过写REDO。

INSERT /*+ append nologging */ INTO TMP_TXN ...
SELECT ...

将问题附加到“高水印”后面,即表空间中表位置的当前末尾,而不是搜索足够大的空块以插入新行。根据您的数据库设置,有必要使 Direct Load 工作,更多信息请点击此处在表的 DDL 中定义它不是强制性的,因为您可能不会在每个操作中都需要它。

p_date参数来看,您似乎在 PL/SQL 过程中同时使用了两者?请注意,在 plsql 引擎和 sql 引擎之间切换会对性能产生影响一条FOR语句将在处理它们之前获取数百行,从而带来一些好处,但插入仍将是逐行的。

给定的示例似乎在每个客户的 n 个插入和只有 1 个插入之间有所不同,并且没有关于 的支持索引CUSTOMERS,但您要求不要专注于此。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章