2013-03-21 1 views
0

아래와 같은 경우 SQL Server 동작을 이해하려고합니다.Oracle에서 데이터를 추출하는 동안 SQL Server 2005의 테이블 잠금 동작

SQL Server에서 만든 연결된 서버를 사용하여 Oracle에서 SQL Server 2005 데이터베이스로 약 50 만 행을 가져옵니다. Insert Into select 쿼리에 약 50 개의 기수 열을 사용하고 있습니다.

쿼리를 완료하지 못했고 수동으로 중지 할 때까지는 무기한으로 실행되는 것으로 나타났습니다. 그러나 약 1 시간 후 대상 테이블을 확인하면 테이블의 행을 찾을 수있었습니다. 그러나 쿼리 실행이 중지되지도 않았고 desination 테이블에서 독점적 인 잠금을 해제하지도 않았습니다.

오라클 링크 서버로 간단한 쿼리를 실행했을 때 오라클과 SQL Server의 데이터 유형 중 일부가 명시 적으로 변환되어야한다는 것을 알았습니다 (특히 은 SQL 서버 Varchar).

이 문제를 겪은 모든 데이터 유형을 명시 적으로 변환 한 후에도이 전체 페치를 아무런 문제없이 완료 할 수 있습니다. 즉, 쿼리가 정상적으로 중지되고 테이블에 부주의 한 잠금을 해제합니다.

내가 가진 질문은 쿼리에서 데이터 형식 변환 문제에도 불구하고 쿼리가 모든 데이터를 가져와 왜 모든 데이터를 가져온 후에도 해당 데이터를 가져온 이유는 무엇입니까? 이 문제에 대한 설명은 고맙게 여길 것입니다 (문제가 해결 되었더라도 :))

+1

질문 : ** 왜 ** 숫자 * 값을 SQL Server의'varchar'로 저장하고 있습니까?!?!? [나쁜 습관 : 잘못된 데이터 유형 선택] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong-data-type .aspx) - 항상 가장 적절한 데이터 유형을 사용해야합니다. –

+0

나는 당신이 공유하는 링크에 대해 절대적으로 동의하고 감사하며, 도움이되었습니다. 하지만 어쨌든 많은 의존성으로 인해 테이블 ​​데이터 유형을 변경할 수 없었습니다. 심지어 내가 그런 식으로 설계된 이유를 알아 냈습니다. SQL Server 데이터 형식과 호환되지 않는 Oracle의 데이터 형식 형식이 있습니까? – Charudatta

답변

1

MS SQL은 다양한 잠금, 행, 열, 테이블을 사용합니다. 아마 테이블에 자물쇠를 에스컬레이션. 또한 각 행 삽입에 관련된 각 색인을 사용자가 지시하지 않는 한 갱신합니다. 이 문제를 해결하는 방법에는 두 가지가 있습니다. 행을 일괄 적으로 삽입합니다 (예 : 1000 또는 10000). 실험을 통해 열 너비에 맞는 배치 크기를 찾습니다. 또는 인덱스를 사용하지 않도록 설정하고 인덱스를 다시 사용할 수 있도록하십시오. MSSQL은 전체 선택을 위해 하나의 모든 유형 변환을 수행해야하며 tempdb 또는 메모리를 사용하므로 제한이있는 경우 메모리 스왑 파일 등이 느려지므로 일괄 적으로 처리하면 병목. 또한 각 삽입은 일관성 SQL에서 롤백 할 수 있어야하는 암시 적 변환이 될 것입니다 ...이 모든 로그 파일을 기록하는 것을 잊지 마십시오.