两个完全相同的查询在不同的环境中执行不同

时间:2016-03-01 14:01:29

标签: sql oracle performance partitioning informatica

我使用信息映射来处理我的数据库中的数据,因此我将尝试解释SQL中的逻辑。

我有一个映射,可以将数据从一个环境交换到另一个环境(从我的登台到我的数据仓库)。这基本上是

INSERT INTO table (select ... from ...)

在informatica中,可以选择向表中添加分区,以加快进程并并行运行。

现在我的问题:

我创建了一个会话,将一个表从一个环境交换到另一个环境,按表键范围划分为4个分区,这些是生成的查询:

SELECT ....
  FROM MyTable
 WHERE MyTable.DWH_END_DATE =
       to_date('31/12/2999', 'dd/mm/yyyy')
   AND MyTable.DWH_PRODUCT_KEY >= 292000001  

  SAME QUERY
  """" AND  FCT_CUSTOMER_SERVICES.DWH_PRODUCT_KEY >= 282000001 AND FCT_CUSTOMER_SERVICES.DWH_PRODUCT_KEY < 292000000

  SAME QUERY
  """" AND FCT_CUSTOMER_SERVICES.DWH_PRODUCT_KEY >= 250000001 AND FCT_CUSTOMER_SERVICES.DWH_PRODUCT_KEY < 282000000

  SAME QUERY
  """"  AND FCT_CUSTOMER_SERVICES.DWH_PRODUCT_KEY < 250000000

此查询正在并行运行。现在的问题是:我首先在我的DEVELOP环境中检查了这个(完全相同的数据,表结构,索引ETC ..)

每个分区运行大约4分钟,有500万条记录(我可以分别看到每个分区进程)

当我在我的PRODUCTION环境中运行完全相同的东西时 - 前三个分区的运行方式与开发中的完全相同,但最后一个分区的速度会慢下来并运行10倍以上它应该是(相同数量的数据,它只是选择并插入较慢的)

我正在谈论这个

MyTable.DWH_PRODUCT_KEY >= 292000001  

我真的完全不知道是什么导致这个..如果所有分区都会变慢,那么它可能有意义,但它基本上是WHERE子句上的RANGE,所以它应该与另一个范围完全相同(是的,他们在每个范围内都有相同的金额)

任何帮助将不胜感激..

1 个答案:

答案 0 :(得分:1)

为了生成计划,oracle考虑了很多不同的因素,更重要的是对表的统计,还有初始化参数,如优化器模式,兼容,多块读取计数,索引成本调整等等。甚至cpu成本和io成本,如果Dev和Prod是不同的机器/存储器,这可能会有所不同。

在不查看实际计划的情况下,很难分辨出发生了什么,我建议检查两个表的统计信息并确保它们是相同的,以及所有会影响查询的初始化参数。您可以随时使用sql plus或sql developer等工具检查计划,并使用正确的权限