2010-06-28 53 views
0

2010年6月29日 - 我從之前的刪除語句中獲得了未提交的操作。我犯了這個行爲,並且我得到了另一個關於衝突的主ID的錯誤。我可以解決這個問題。因此,故事的士氣,承諾你的行爲。鏈接服務器查詢運行但不完成?

原來的問題 -

我試圖運行此查詢:

with spd_data as (
select * 
from openquery(IRPROD,'select * from budget_user.spd_data where fiscal_year = 2010') 
) 

insert into [IRPROD]..[BUDGET_USER].[SPD_DATA_BUD] 
    (REC_ID, FISCAL_YEAR, ENTITY_CODE, DIVISION_CODE, DEPTID, POSITION_NBR, EMPLID, 
    spd_data.NAME, JOB_CODE, PAY_GROUP_CODE, FUND_CODE, FUND_SOURCE, CLASS_CODE, 
    PROGRAM_CODE, FUNCTION_CODE, PROJECT_ID, ACCOUNT_CODE, SPD_ENC_AMT, SPD_EXP_AMT, 
    SPD_FB_ENC_AMT, SPD_FB_EXP_AMT, SPD_TUIT_ENC_AMT, SPD_TUIT_EXP_AMT, 
    spd_data.RUNDATE, HOME_DEPTID, BUD_ORIG_AMT, BUD_APPR_AMT) 
SELECT REC_ID, FISCAL_YEAR, ENTITY_CODE, DIVISION_CODE, DEPTID, POSITION_NBR, EMPLID, 
     spd_data.NAME, JOB_CODE, PAY_GROUP_CODE, FUND_CODE, FUND_SOURCE, CLASS_CODE, 
     PROGRAM_CODE, FUNCTION_CODE, PROJECT_ID, ACCOUNT_CODE, SPD_ENC_AMT, SPD_EXP_AMT, 
     SPD_FB_ENC_AMT, SPD_FB_EXP_AMT, SPD_TUIT_ENC_AMT, SPD_TUIT_EXP_AMT, 
     spd_data.RUNDATE, HOME_DEPTID, lngOrig_amt, lngAppr_amt 
    from spd_data 
left join Budgets.dbo.tblAllPosDep on project_id = projid 
            and job_code = jcc and position_nbr = psno 
            and emplid = empid 
where OrgProjTest = 'EQUAL'; 

基本上我選擇從IRPROD(一個Oracle數據庫)的表,與當地表連接它,將結果返回到IRPROD。

我遇到的問題是,查詢運行時,它永遠不會停止。我已經讓它運行了一個小時,並一直持續到我取消它。我可以在帶寬監視器上看到進出的SQL Server數據。另外,如果我只運行查詢的select部分,它會在4秒內返回結果。

任何想法爲什麼它沒有完成?我有類似的方式設置其他查詢,並沒有任何問題(從本地表中授予這些插入而不是遠程表)。

+0

你有沒有看過Oracle的一面?那就是你插入的地方,那就是鎖和約束最有可能的地方。 – 2010-06-28 18:28:46

+0

@Stephanie沒有看過Oracle方面。如果有約束不會拋出錯誤?我會在這方面進行更深入的檢查,但是我的問題是我不熟悉Oracle和SQL Server。 – 2010-06-28 18:35:00

+0

使用單個列創建一個唯一約束表。從一個會話開始兩個會話插入1,然後從第二個插入1。第二個將等待第一個提交或回滾。如果一個提交,只有一個錯誤。但它可以永遠等待。但是,您可能會遇到什麼可能不確定的等待從SQL Server中讀取?是的,可能有1個線程,但爲什麼要注意ZERO阻塞的可能性?只因爲你最熟悉?這就像盯着車內空的燃油表,想知道爲什麼沒有氣體從泵中流出。 – 2010-06-29 13:32:32

回答

0

您沒有包含任何數量指標。但我會建議使用臨時表來收集結果。

然後你應該嘗試插入第一對幾行。如果成功,你會有一個強大的指標,一切都很好。

嘗試通過project_id或emplid來分解每個插入任務以避免大事務日誌。

您還應該考慮制定批量批處理流程。

+0

避免大型事務日誌在哪一邊?甲骨文?這不是一個真正的問題。不管您提交的頻率如何,每個插入將包含相同數量的事務日誌。你在談論回滾空間還是撤消空間?批量批量?這是批量批量(看起來多餘)。他正在做所有的行,一次......批次;而不是一次一個......交易。 – 2010-06-29 13:40:12

+0

我試圖避免臨時表,但這就是我最終做的事情。我不明白什麼是批量批處理,我認爲這正是我正在做的。 – 2010-06-29 14:34:56

+0

鏈接服務器有不同的問題。我總是試圖避免的一件事是移動大量的數據。最好的辦法是找到一個好的分區鍵,將數據分成更小的塊。我談的是25k到50k行以上的行。 我敢打賭,如果他這樣做,導入將會成功。 – 2010-06-29 18:10:08

0

如果只運行沒有插入的select,返回多少條記錄?數據看起來是否正確或者由於連接而有多個記錄?

您要插入的表上是否存在觸發器?如果您正在返回許多記錄,並且觸發器在設計用於逐行運行的表上,這可能會降低速度。您也正在發送到另一臺服務器,因此網絡管道可能會導致您的速度下降。也許最好將預算數據發送到Oracle服務器,並從那裏進行插入,而不是從SQL Server進行插入。

+0

當我剛剛運行選擇數據看起來不錯。桌子上沒有觸發器。我相信網絡正在讓我放慢腳步,但就像我說過的,我還有其他類似的工作可以正常運行。 – 2010-06-29 14:35:53

相關問題