2010-02-08 2 views
0

20 만 레코드가있는 테이블이 있습니다. 다음과 같은 데이터를 삭제하고 싶습니다.SQL에서 삭제 쿼리의 성능

DELETE FROM Table Where IdColumn IN (SelectedID) 

SelectedID는 5000 개의 레코드가 포함 된 바람직한 데이터 ID로 채 웁니다. 2 접근 방식이 있습니다 :

1- 원하는 5000 레코드의 ID를 포함하는 SelectedID로 20,000 ID를 삽입합니다.

2- 나는 5000 레코드의 ID 만 삽입합니다.

질문은 두 가지 접근 방식의 차이점은 무엇입니까? (성능)

+0

당신은 방법 1에서 중복 15000 중복을 의미합니까? – Pentium10

+0

첫 번째 접근 방식에는 테이블에없는 15000 가지 ID가 있습니다. 하지만 나는 이것을 모른다. (내 응용 프로그램에서) –

답변

1

IN 절의 성능은 끔찍한데, 이는 주로 쿼리 컴파일 시간 때문입니다. 당신이 List<int> 다음 ID를 포함하는 말을 가지고 그래서 경우이 : 당신은 당신이 원하는 ID의 목록을 얻을 수 있다면,

List<int> inList = GetIDS(); //20,000 
//pass inList to SQL 

에 가입하는 경우가 대안입니다 :

List<int> myIDs = GetIDs(); //20,000 
var inList = myIDs.Distinct(); //5,000 distinct IDs 
//pass inList to SQL 

는 것보다 훨씬 빠른 것 목록은 exte에서 오는 경우

DELETE FROM Table 
Where IdColumn IN (Select ID 
        From OtherTable 
        Where Name Like '%DeleteMe%') 

나는 확실하지 않다 : 그것은 Where에서 쿼리를 사용하여, 이런 일을 그와 하위 쿼리를 수행하는 것이 좋습니다, 쿼리에 의해 삭제 최종 소스이며 이런 식으로 결정할 수는 없지만 가능한 경우 삭제가 매우 빠릅니다.

+0

Nick에게 감사드립니다. 쉼표로 구분 된 문자열을 반환하여 응용 프로그램에서 원하는 ID를 만듭니다. –

+1

그런 다음이 문자열을 DELETE 프로 시저에 전달하고,이를 테이블 값이있는 UDF로 sProc 내부로 분할하고 삭제할 테이블과 조인합니다. –

+0

@masoud ramezani - 이것으로 문자열 길이 한도를 치지 않습니까? –

0

완전히 이해한다면 잘 모르겠습니다 만 2 천 2 백 줄을 생성하는 데 자원 낭비가되는 것 같아서 # 2로 갈 것입니다. 삽입하는 대신 5.000 만 필요합니다. 필요한 5.000.

또한 200.000 행은 작은 테이블입니다. 정말!

+0

예 200.000 행이 작은 테이블이라는 것을 알고 있습니다. 그것은 샘플입니다. 당신은 100으로 곱할 수 있습니다. –

+0

내 응용 프로그램에서 그 5000 레코드를 검색 할 수 있지만 그것은 시간 낭비 따라서 나는 내 데이터를 검색하지 않고 모든 데이터 ID를 IN 절에 전달하지 않습니다. –

관련 문제