Oracle 如何在没有任何连接或where条件的情况下提高视图的性能?

Oracle 如何在没有任何连接或where条件的情况下提高视图的性能?,oracle,performance,view,Oracle,Performance,View,我有一个简单的视图,它根据管道字符(如varchar2数据类型)从表中获取列,并将一些列转换为数字。我很难通过视图将完整记录从源表加载到目标表。有没有可能提高它的性能 视图如下图所示,包含150列拆分和35次转换 CREATE OR FORCE MYVIEW as WITH CommonTableExpression AS (SELECT a.* ,CAST(REGEXP_SUBSTR(a.Line, '([^|]*)(\||$)',1,1,NULL, 1) AS VARCHAR2(1

我有一个简单的视图,它根据管道字符(如varchar2数据类型)从表中获取列,并将一些列转换为数字。我很难通过视图将完整记录从源表加载到目标表。有没有可能提高它的性能

视图如下图所示,包含150列拆分和35次转换

CREATE OR FORCE MYVIEW as
WITH CommonTableExpression
AS 
(SELECT   
a.* 
,CAST(REGEXP_SUBSTR(a.Line, '([^|]*)(\||$)',1,1,NULL, 1) AS VARCHAR2(1)) Column1
FROM  MYTABLE a)
SELECT 
LINE
,CAST(REGEXP_SUBSTR (Line || '|', '([^|]*)(\||$)',1,1, NULL, 1 ) AS NUMBER(1,0)) Column1_NBR
FROM CommonTableExpression;

我无法加载完整的16000000条记录,加载表的三分之一需要15个小时。

。。。您只有两个输出列,第二个只是从字符串前面提取一个1位数的数字,对吗?您能展示示例数据和预期输出吗?我觉得我遗漏了一些东西,这似乎太复杂了。代码只表示视图的基本结构。像Column1一样,最多有150列,像Column1_NBR一样,最多有35列。您应该发布一个数据样本(并非所有150列)和一些从该样本派生的预期输出。你不必这么做,这只会大大增加你得到及时而有用的响应的机会。无论如何,基本问题是regexp函数执行起来非常昂贵。您正在仔细检查1600万个非常大的字符串实例。所以,基本上你是在为没有以第一种正常形式存储数据而纳税。(我知道这可能不是你的决定,你只是笨手笨脚的。)考虑到你不能更改范围(也就是说,你只能按原样处理MYTABLE中的数据),你所能做的就是减少使用regex所做的工作量。也许可以尝试使用INSTR()或SUBSTR(),因为它们更有效。谢谢@APC。正如你所说,regexp太累人了。正如你所说,我能够使用instr()和substr()。花了3小时的时间现在花了4分钟所以。。。您只有两个输出列,第二个只是从字符串前面提取一个1位数的数字,对吗?您能展示示例数据和预期输出吗?我觉得我遗漏了一些东西,这似乎太复杂了。代码只表示视图的基本结构。像Column1一样,最多有150列,像Column1_NBR一样,最多有35列。您应该发布一个数据样本(并非所有150列)和一些从该样本派生的预期输出。你不必这么做,这只会大大增加你得到及时而有用的响应的机会。无论如何,基本问题是regexp函数执行起来非常昂贵。您正在仔细检查1600万个非常大的字符串实例。所以,基本上你是在为没有以第一种正常形式存储数据而纳税。(我知道这可能不是你的决定,你只是笨手笨脚的。)考虑到你不能更改范围(也就是说,你只能按原样处理MYTABLE中的数据),你所能做的就是减少使用regex所做的工作量。也许可以尝试使用INSTR()或SUBSTR(),因为它们更有效。谢谢@APC。正如你所说,regexp太累人了。正如你所说,我能够使用instr()和substr()。花了3个小时的时间现在花了4分钟。