2010-06-28 4 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 (오라클 DB)에서 테이블을 선택하고있어 및 결과를 다시 IRPROD에 삽입합니다.

내가 갖고있는 문제는 쿼리가 실행되는 동안 멈추지 않는다는 것입니다. 나는 그것을 1 시간 흘려 보내고 그것을 취소 할 때까지 계속 간다. 나는 SQL Server 데이터가 들어오고 나가는 대역폭 모니터에서 볼 수 있습니다. 또한 쿼리의 select 부분 만 실행하면 4 초 후에 결과가 반환됩니다.

끝내지 않는 아이디어가 있습니까? 비슷한 방식으로 다른 쿼리 설정을했는데 문제가 없습니다 (원격 테이블이 아닌 로컬 테이블에서 삽입 됨).

+0

오라클 측을 보았습니까? 그것이 삽입되는 곳입니다. 잠금 장치와 구속 조건이있을 가능성이 큽니다. –

+0

@Stephanie 오라클 측을 보지 않았습니다. 제약 조건이 있으면 오류가 발생하지 않습니까? 나는 그면을 더 깊이 확인 하겠지만, 문제는 내가 SQL Server만큼 오라클에 익숙하지 않다는 것입니다. –

+0

단일 열, 고유 제한 조건을 사용하여 테이블을 만듭니다. 한 세션에서 두 개의 세션 삽입 1을 시작한 다음 두 번째 세션에서 1을 삽입하십시오. 두 번째는 커밋 또는 롤백을 기다립니다. 커밋되면 오류가 발생합니다. 그러나 그것은 영원히 기다릴 수 있습니다. 그러나 SQL Server로부터 READING을 만나기가 쉽지 않을 수 있습니다. 예, 아마도 1 개의 스레드가 있지만 왜 차단할 가능성이 0 인 측면을보아야합니까? 네가 가장 익숙하기 때문에? 그것은 차안의 빈 연료 게이지를 쳐다보고 왜 펌프에서 가스가 나오지 않는지 궁금해하는 것과 같습니다. –

답변

0

볼륨 메트릭을 포함하지 않았습니다. 그러나 임시 테이블을 사용하여 결과를 수집하는 것이 좋습니다.

그런 다음 처음 몇 개의 행을 삽입해야합니다. 이 작업이 성공하면 모든 것이 정상이라는 강력한 지표를 얻게됩니다.

큰 트랜잭션 로그를 피하려면 project_id 또는 emplid로 각 삽입 작업을 분할하십시오.

일괄 처리를 만드는 것에 대해서도 고려해야합니다.

+0

큰 트랜잭션 로그를 사용하지 마십시오. 신탁? 그것은 정말로 걱정거리가 아닙니다. 각 인서트에는 커밋 빈도에 상관없이 동일한 양의 트랜잭션 로그가 포함됩니다. Rollback Space 또는 Undo Space에 대해 이야기하고 있습니까? 벌크 배치? 이것은 일괄 처리입니다 (중복 됨). 그는 한번에 모든 행을하고 있습니다 ... 배치 (Batch); 한 번에 하나씩 반대 ... 거래. –

+0

임시 테이블을 피하려고했지만 어쨌든 그 일이 끝났습니다. 벌크 배치 프로세스가 무엇인지 이해하지 못합니다. –

+0

연결된 서버에는 여러 가지 문제가 있습니다. 필자가 항상 피하려고하는 한 가지 방법은 많은 양의 데이터를 전선으로 이동시키는 것입니다. 가장 좋은 방법은 데이터를 작은 덩어리로 나누기위한 좋은 파티션 키를 찾는 것입니다. 저는 25k에서 50k 줄 이상에 대해서 이야기하고 있습니다. 그가 그렇게하면 가져 오기가 성공할 것입니다. –

0

삽입없이 select 만 실행하면 몇 개의 레코드가 반환됩니까? 데이터가 올바르게 보이거나 조인으로 인해 여러 레코드가 있습니까?

삽입하려는 테이블에 트리거가 있습니까? 많은 레코드를 반환하고 트리거가 row-byrow를 실행하도록 설계된 테이블에 있으면 작업 속도가 느려질 수 있습니다. 또한 다른 서버로 보내므로 네트워크 파이프 라인이 느려질 수 있습니다. 오라클 서버에 예산 데이터를 보내고 SQL Server가 아닌 해당 서버에서 삽입하는 것이 더 나을 것입니다.

+0

방금 ​​선택을 실행하면 데이터가 올바르게 보입니다. 테이블에 트리거가 없습니다. 나는 네트워크가 저를 늦추고 있다고 확신하지만 나는 비슷한 다른 비슷한 일이 있다고 말한 것처럼 잘 돌아갑니다. –

관련 문제