복붙노트

[SQL] SQL WHERE ID IN (ID1, ID2, ..., IDN)

SQL

SQL WHERE ID IN (ID1, ID2, ..., IDN)

나는 ID의 큰 목록을 검색 쿼리를 작성해야합니다.

나는 표준 SQL을 작성해야합니다, 그래서 우리는 많은 백엔드 (MySQL은, 파이어 버드, SQLServer에, 오라클, PostgreSQL의를 ...)을 지원 않습니다.

아이디 세트의 크기가 큰 수, 쿼리가 프로그램을 생성 할 것이다. 그래서 가장 좋은 방법은 무엇인가?

SELECT * FROM TABLE WHERE ID IN (id1, id2, ..., idn)

여기에 내 질문입니다. n이 매우 큰 경우 어떻게됩니까? 또한, 어떤 성능에 대한?

SELECT * FROM TABLE WHERE ID = id1 OR ID = id2 OR ... OR ID = idn

n이 매우 큰 경우, 나는이 방법은 N 제한이없는 생각,하지만 성능에 대한?

  foreach (var id in myIdList)
  {
      var item = GetItemByQuery("SELECT * FROM TABLE WHERE ID = " + id);
      myObjectList.Add(item);
  }

데이터베이스 서버가 네트워크를 통해 조회 할 때 우리는이 방법을 몇 가지 문제를 경험했다. 일반적으로 작은 쿼리를 많이 만드는 대 모든 결과를 검색 한 쿼리를 수행하는 것이 좋습니다. 어쩌면 내가 틀렸다.

이 문제에 대한 올바른 해결책이 있을까요?

해결법

  1. ==============================

    1.옵션 1은 유일하게 좋은 솔루션입니다.

    옵션 1은 유일하게 좋은 솔루션입니다.

  2. ==============================

    2.또 다른 접근 방식은 ID 값을 포함하는 다른 테이블을 사용할 수 있습니다. 이 다른 테이블은 제한 반환 된 행에 표에 합류 내부 될 수 있습니다. 이것은 당신이 (시대의 최고의에서 문제가) 동적 SQL이 필요하지 않습니다 있다는 큰 장점이있을 것이다, 당신은 절 무한히 오랫동안이 없습니다.

    또 다른 접근 방식은 ID 값을 포함하는 다른 테이블을 사용할 수 있습니다. 이 다른 테이블은 제한 반환 된 행에 표에 합류 내부 될 수 있습니다. 이것은 당신이 (시대의 최고의에서 문제가) 동적 SQL이 필요하지 않습니다 있다는 큰 장점이있을 것이다, 당신은 절 무한히 오랫동안이 없습니다.

    당신은 행 당신의 많은 수의 삽입 후 아마도이 조인의 성능을 돕기 위해 인덱스를 생성이 다른 테이블을자를 것이다. 그것은 또한 당신이 아마 당신에게 성능 조정에 더 많은 옵션을 제공, 데이터의 검색에서 이러한 행의 축적을 분리 할 것입니다.

    업데이트 : 임시 테이블을 사용할 수 있지만, 당신이해야 심지어는 것을 암시하는 말은하지 않았다. 임시 데이터에 사용되는 영구 테이블 여기에 기재된 장점과 이후 일반적인 솔루션이다.

  3. ==============================

    3.무엇 에드 기네스 제안하는 것은 정말 성능 부스터,이 같은 쿼리를했다

    무엇 에드 기네스 제안하는 것은 정말 성능 부스터,이 같은 쿼리를했다

    select * from table where id in (id1,id2.........long list)
    

    제가 한 :

    DECLARE @temp table(
                ID  int
                )
    insert into @temp 
    select * from dbo.fnSplitter('#idlist#')
    

    그런 다음 내부 기본 테이블과 임시 가입 :

    select * from table inner join temp on temp.id = table.id
    

    그리고 성능이 크게 개선되었다.

  4. ==============================

    4.첫 번째 옵션은 확실히 최선의 방법입니다.

    첫 번째 옵션은 확실히 최선의 방법입니다.

    SELECT * FROM TABLE WHERE ID IN (id1, id2, ..., idn)
    

    그러나 ID의 목록이 매우 큰 것을 고려, 수백만, 당신은 다음과 같은 청크 크기를 고려해야 말 :

    당신은 덩어리로 이유를 분할해야합니까?

    그것은 항상 나를 위해 마법처럼 일했다. 이뿐만 아니라 동료 개발자를 위해 일하는 것이 희망 :)

  5. ==============================

    5.5 억 개 기록과 푸른 SQL 테이블에 () 명령 ID가> 7 분의 대기 시간의 결과 곳을 MyTable에서 SELECT *를 수행!

    5 억 개 기록과 푸른 SQL 테이블에 () 명령 ID가> 7 분의 대기 시간의 결과 곳을 MyTable에서 SELECT *를 수행!

    바로이 대신 반환 된 결과를 수행 :

    select b.id, a.* from MyTable a
    join (values (250000), (2500001), (2600000)) as b(id)
    ON a.id = b.id
    

    조인을 사용합니다.

  6. ==============================

    6.대부분의 데이터베이스 시스템, IN (VAL1, val2만큼, ...)와 OR의 시리즈 같은 계획에 최적화되어 있습니다.

    대부분의 데이터베이스 시스템, IN (VAL1, val2만큼, ...)와 OR의 시리즈 같은 계획에 최적화되어 있습니다.

    세 번째 방법은 임시 테이블에 값 목록을 가져오고 값이 많이가있는 경우, 대부분의 시스템에서 더 효율적이다 그것을 결합 될 것이다.

    이 기사를 읽고 할 수 있습니다 :

  7. ==============================

    7.당신이 뚜렷한 이유도 수없이 데이터베이스를 타격하는 모든 때문에 샘플 3은 그 중 최악의 연기자 나올 것입니다.

    당신이 뚜렷한 이유도 수없이 데이터베이스를 타격하는 모든 때문에 샘플 3은 그 중 최악의 연기자 나올 것입니다.

    임시 테이블에 데이터를로드하고 그에 가입하는 것은 지금까지 가장 빠른 의해 것입니다. 그 후 IN은 논리합의 그룹보다 약간 더 빠르게 작동합니다.

  8. ==============================

    8.난 당신이 SQLSERVER을 의미 생각하지만, 오라클에 당신은 당신이 지정할 수 있습니다 얼마나 많은 요소 하드 제한이 있습니다 (1000).

    난 당신이 SQLSERVER을 의미 생각하지만, 오라클에 당신은 당신이 지정할 수 있습니다 얼마나 많은 요소 하드 제한이 있습니다 (1000).

  9. from https://stackoverflow.com/questions/5803472/sql-where-id-in-id1-id2-idn by cc-by-sa and MIT license