Sql 提高选择和更新性能
我将尝试解释我的问题,因为我没有直接使用SQL 我使用INFORMATICA工具,使用处理SQL数据的映射,因此我将尝试解释映射到SQL中的逻辑 我的地图基本上使用以下查询从SCD(缓慢变化的维度)中选择数据,其中start_date=sysdate,ind=1(此表有大约600条IL记录):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
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-大多数情况下,维度变化的事物本质上是报告数据库,您需要存储空间允许的尽可能多的索引。索引只会在数据有大量更新或插入时“损害”性能(这就是为什么有时在分析重建时关闭索引的原因),这通常发生在日常事务数据库上。即使如此,它还是在更新的“受限”速度(可能比您想象的要慢)和表的实用性之间取得了平衡。