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。
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之間切換是這段時間運行的問題。
任何人都可以想出另一種解決方案來減少這個時間?
是的,但要加入的表名存儲在另一個表中 - 「NODETYPE」,我不能直接加入 –
你想說你有幾張表來存儲IP地址?不是很好的主意。如果不可能將它們合併成一個,使用'union all'。 – Dmitry
是的,這是正確的,每個節點類型有幾個表,從應用程序的原始設計,我會嘗試然後與'union all' –