从名称存储在另一个表中的表中选择值
我有下面的视图,其中使用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。
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之间切换是这段时间运行的问题。
任何人都可以想出另一种解决方案来减少这个时间?
回答:
你需要用一个存储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 ...;
另外,请确保您在用于连接的字段上具有所需的索引。
以上是 从名称存储在另一个表中的表中选择值 的全部内容, 来源链接: utcz.com/qa/261898.html