改善SELECT和UPDATE性能

时间:2016-02-14 11:21:51

标签: sql oracle performance informatica

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

我通过使用处理SQL数据的映射来使用INFORMATICA工具,因此我将尝试解释我的映射对SQL的逻辑。

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

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

然后添加另一列并更新具有大约8mil记录的其他表。查询可能是通过

加入更新
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

此table_2是以下索引:

(ACCOUNT_NUMBER, SUB_ACCOUNT_NUMBER) - UNIQUE

选择和更新都需要一些时间来处理,具体取决于我每天获得的数据量(我们每三个月有1天,数据量大约是正常日期的X30,大概是2 ...小时)

所以,我的问题是:如何加快这个过程的速度有以下限制:

我不能(除非有充分的理由)在表上添加索引,因为它在许多其他进程中使用,因此会损害他们的性能

2 个答案:

答案 0 :(得分:0)

建议1:创建基于函数的索引:

CREATE INDEX index_name
          ON table (TRUNC(START_DATE));

正如您所提到的,这可能无法实现,因为您无法使用索引。

建议2:使用BETWEEN:

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');

(另见http://oraclecoder.com/tutorials/quick-tip-do-not-use-trunc-to-filter-on-a-date-and-time-field--2120

答案 1 :(得分:0)

这与您在“get current date fomatted”下提出的问题基本相同。您要么必须修改sql,要么使用基于函数的索引。是的,索引可能会导致DML的一些额外开销,但可以显着改善SELECT。像所有设计决策一样,您可以权衡成本并确定哪些更重要。