Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 提高选择和更新性能_Sql_Oracle_Performance_Informatica - Fatal编程技术网

Sql 提高选择和更新性能

Sql 提高选择和更新性能,sql,oracle,performance,informatica,Sql,Oracle,Performance,Informatica,我将尝试解释我的问题,因为我没有直接使用SQL 我使用INFORMATICA工具,使用处理SQL数据的映射,因此我将尝试解释映射到SQL中的逻辑 我的地图基本上使用以下查询从SCD(缓慢变化的维度)中选择数据,其中start_date=sysdate,ind=1(此表有大约600条IL记录): SELECT table.ACCOUNT_NUMBER, table.SUB_ACCOUNT_NUMBER, table.SUB_ACCOUNT_KEY FROM table WHERE table.C

我将尝试解释我的问题,因为我没有直接使用SQL

我使用INFORMATICA工具,使用处理SQL数据的映射,因此我将尝试解释映射到SQL中的逻辑

我的地图基本上使用以下查询从SCD(缓慢变化的维度)中选择数据,其中start_date=sysdate,ind=1(此表有大约600条IL记录):

SELECT table.ACCOUNT_NUMBER, table.SUB_ACCOUNT_NUMBER, table.SUB_ACCOUNT_KEY 
FROM table
WHERE table.CURR_IND=1
  AND table.START_DATE=trunc(sysdate)
该表如下所示:

SUB_ACCOUNT_KEY - UNIQUE
(ACCOUNT_NUMBER, SUB_ACCOUNT_NUMBER) - UNIQUE
然后添加另一列并更新一个包含大约8mil记录的不同表。其查询可能是使用join by更新的

SET table2.ind =The_New_Column,table_2.sub_account_key = table1.sub_account_key
WHERE Table.account_number = Table_2.account_number
  AND table.sub_account_number = table_2.sub_account_number
表2的索引如下所示:

SUB_ACCOUNT_KEY - UNIQUE
(ACCOUNT_NUMBER, SUB_ACCOUNT_NUMBER) - UNIQUE
select和update都需要一些时间来处理,具体取决于我每天获得的数据量(我们每三个月有一天,数据量约为正常日的30倍,这需要花费大约2小时)

因此,我的问题是:我如何加快这一过程有以下限制:


我无法(除非给出很好的理由)在表上添加索引,因为它正在许多其他进程中使用,因此可能会损害它们的性能建议1:创建基于函数的索引:

CREATE INDEX index_name
          ON table (TRUNC(START_DATE));
正如您所提到的,这可能是不可能的,因为您不能使用索引

建议2:在以下两者之间使用:

SELECT table.ACCOUNT_NUMBER, table.SUB_ACCOUNT_NUMBER, table.SUB_ACCOUNT_KEY 
  FROM table
 WHERE table.CURR_IND=1
   AND table.START_DATE BETWEEN TO_DATE('2016.02.14 12:00:00 AM', 'YYYY.MM.DD HH:MI:SS AM') 
                            AND TO_DATE('2016.02.15 11:59:59 PM', 'YYYY.MM.DD HH:MI:SS PM');

(另请参见)

这与您在“”下提出的问题基本相同。您要么必须修改sql,要么使用基于函数的索引。是的,索引可能会在DML上造成一些额外的开销,但可以显著改善SELECTs。与所有设计决策一样,您必须权衡成本效益,并决定什么更重要。

如果您无法创建索引或对表进行分区,那么查询似乎是一项非常困难的任务。您应该注意,您查询的表上的索引是无用的,因为您没有将该列用作筛选器。表2上的索引应该会加快更新速度,但在尝试处理您提到的卷时,分区是您最好的选择。我在这里使用@Yaron-大多数情况下,维度变化的事物本质上是报告数据库,您需要存储空间允许的尽可能多的索引。索引只会在数据有大量更新或插入时“损害”性能(这就是为什么有时在分析重建时关闭索引的原因),这通常发生在日常事务数据库上。即使如此,它还是在更新的“受限”速度(可能比您想象的要慢)和表的实用性之间取得了平衡。