从表中选择值,其中名称存储在另一个表中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从表中选择值,其中名称存储在另一个表中相关的知识,希望对你有一定的参考价值。
我有下面的视图,它使用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;
我必须在select stmt中添加该函数,以便获取存在于其他一些表中的ipaddresses,这些表的名称存储在NODETYPE
表中。
例如,这是屏幕截图形式的节点类型表。所以get_rationalized_ip_adr
调用一个API,它从NR_NODE_DDF
获取传递给它的每个nodeid。
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;
现在问题就是这个select语句需要大约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 ...;
此外,请确保在用于连接的字段上具有必需的索引。
以上是关于从表中选择值,其中名称存储在另一个表中的主要内容,如果未能解决你的问题,请参考以下文章