2012-06-20 72 views
2

我在Oracle 10g中發生了一個INSERT查詢,該查詢在「dblink」SQL * Net消息事件中停滯不前。它看起來像:來自Oracle中d​​blink等待事件的SQL * Net消息

INSERT INTO my_table (A, B, C, ...) 
    SELECT A, B, C, ... FROM [email protected]_system; 

我沒有看到任何my_table除了鎖從插入我試圖做一個。在[email protected]_system上的SELECT查詢完成時沒有任何麻煩,當它自己運行。我只在嘗試執行INSERT時遇到此問題。

有人知道這裏會發生什麼嗎?

UPDATE SELECT在單獨運行時返回約1.557分鐘的4857行。在我決定殺死它之前,INSERT運行了一個多小時的等待消息。

UPDATE 我在我的方法中發現一個錯誤。我正在使用日期範圍來限制結果。我僅在測試SELECT時使用的日期範圍在link_table上運行的最後一個OraStats之前,但測試INSERT時使用的日期範圍是在link_table上運行的最後一個OraStats之後。所以,這讓我誤以爲INSERT存在問題。我不是很科學的做這件事;我的錯。

+0

'SELECT'是否僅僅是一個沒有謂詞的表?還是它在做聯接和過濾器?對於獨立的'SELECT'和'INSERT ... SELECT'查詢計劃是否相同? –

+0

你抓到我了。有幾個連接,但都在同一個dblink上。我如何查看查詢計劃? – Paul

回答

2

您是否使用/*+ driving_site(link_table) */提示使Oracle在遠程服務器上執行連接?

如果是這樣,該提示將而不是與DML一起使用,如Jonathan Lewis在this page中所解釋的那樣。

這可能是罕見的情況下運行查詢就像SELECT使用一個非常不同的計劃,而不是作爲INSERT的一部分運行查詢。 (你肯定想學習如何在你的環境中生成解釋計劃,大多數工具都有一個按鈕來做到這一點)。

由於Andras Gabor在鏈接中推薦,你可能想使用PL/SQL BULK COLLECT來提高性能。這可能是PL/SQL比SQL更快的情況。

+0

添加'driving_site'提示根據我的第二次更新修復了SELECT問題。 – Paul

2

SQL*Net message from dblink通常意味着您的本地系統正在網絡上等待通過網絡傳輸數據。這種查詢是非常正常的等待事件。

SELECT語句返回多少行?這代表了多少數據(以MB/GB爲單位)?

當你說「它自己完成而沒有任何問題」時,你是否實際獲取所有數據?如果您使用的是TOAD或SQL Developer之類的東西,GUI通常會獲取前N行並返回給您。這可能非常快,但並不意味着數據庫完成了查詢 - 可能需要更多時間才能完成查詢返回的所有行。人們很容易測量獲取前N行所需的時間,而不是獲取最後一行的時間 - 顯然,在從遠程表獲取所有行之前,INSERT語句無法返回。

+0

看到有問題的更新。它非常小,不應該花很長時間。 – Paul