2017-12-18 170 views
0

我有下面的视图,其中使用get_rationalized_ip_adr函数来检索某些给定值作为输入来自NODE表的nodeid。从名称存储在另一个表中的表中选择值

CREATE OR REPLACE VIEW A_DEVICE AS 
    SELECT NODE.NAME AS DEVICE 
      , NODETYPE.TABLENAME AS TABLENAME 
      , ext_a_device.get_rationalized_ip_adr(NODE.NODEID) AS IPADDRESS 
      , COALESCE(LOC_SITE.OS_EASTING, LOC_RAILWAY.OS_EASTING, LOC_SIGNALBOX.EASTING) AS OS_EASTING 
      , COALESCE(LOC_SITE.OS_NORTHING, LOC_RAILWAY.OS_NORTHING, LOC_SIGNALBOX.NORTHING) AS OS_NORTHING 
    FROM NODE NODE 
    JOIN NODETYPE NODETYPE 
    ON NODE.NODE2NODETYPE = NODETYPE.NODETYPEID; 

我不得不添加的功能,在选择语句,以获取存在于其他一些表格,其中有存储在NODETYPE表的名称表ipaddresses。

例如,这是一个截屏形式的节点类型表。因此,get_rationalized_ip_adr调用一个API,它为从每个传递给它的nodeid执行从NR_NODE_DDF获取的API。

enter image description here

get_rationalized_ip_adr功能只是调用与NODEID输入的API,并返回相应的节点ip_adr。

FUNCTION get_rationalized_ip_adr(pin_node_id IN NUMBER) 

RETURN VARCHAR2 IS 
ln_errorcode NUMBER; 
ls_errortext VARCHAR2(200); 
ls_result VARCHAR2(200); 
BEGIN 
    pkggeneral.getobjectattribute(o_errorcode => ln_errorcode 
             , o_errortext => ls_errortext 
             , i_dimobject => pkgdimensionconstants.dimensionObject_Node 
             , i_objectid => pin_node_id 
             , i_attribute => 'IP_ADDRESS' 
             , o_result => ls_result); 
    RETURN ls_result; 
END get_rationalized_ip_adr; 

现在问题的例子是,这个选择语句大约需要90秒,这是太多了。

SELECT * FROM A_DEVICE ad where ad.ipaddress = '10.16.52.152' 

正如我所理解的,在sql和pl-sql之间切换是这段时间运行的问题。

任何人都可以想出另一种解决方案来减少这个时间?

回答

0

你需要用一个存储IP地址的表来替换你的函数调用。

CREATE OR REPLACE VIEW A_DEVICE AS 
    SELECT NODE.NAME AS DEVICE 
      , NODETYPE.TABLENAME AS TABLENAME 
      , t.IPADDRESS 
      , COALESCE(LOC_SITE.OS_EASTING, LOC_RAILWAY.OS_EASTING, LOC_SIGNALBOX.EASTING) AS OS_EASTING 
      , COALESCE(LOC_SITE.OS_NORTHING, LOC_RAILWAY.OS_NORTHING, LOC_SIGNALBOX.NORTHING) AS OS_NORTHING 
    FROM NODE NODE 
    JOIN NODETYPE NODETYPE 
     ON NODE.NODE2NODETYPE = NODETYPE.NODETYPEID 
    join table_with_ip_address t 
     on ...; 

另外,请确保您在用于连接的字段上具有所需的索引。

+0

是的,但要加入的表名存储在另一个表中 - “NODETYPE”,我不能直接加入 –

+0

你想说你有几张表来存储IP地址?不是很好的主意。如果不可能将它们合并成一个,使用'union all'。 – Dmitry

+0

是的,这是正确的,每个节点类型有几个表,从应用程序的原始设计,我会尝试然后与'union all' –

相关问题