我使用信息映射来处理我的数据库中的数据,因此我将尝试解释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,所以它应该与另一个范围完全相同(是的,他们在每个范围内都有相同的金额)
任何帮助将不胜感激..
答案 0 :(得分:1)
为了生成计划,oracle考虑了很多不同的因素,更重要的是对表的统计,还有初始化参数,如优化器模式,兼容,多块读取计数,索引成本调整等等。甚至cpu成本和io成本,如果Dev和Prod是不同的机器/存储器,这可能会有所不同。
在不查看实际计划的情况下,很难分辨出发生了什么,我建议检查两个表的统计信息并确保它们是相同的,以及所有会影响查询的初始化参数。您可以随时使用sql plus或sql developer等工具检查计划,并使用正确的权限