복붙노트

[SQL] 는 SQL Server 쿼리에 대한 최대 크기? IN 절? 더 나은 접근 방법이 있나요 [중복]

SQL

는 SQL Server 쿼리에 대한 최대 크기? IN 절? 더 나은 접근 방법이 있나요 [중복]

는 SQL Server 쿼리의 최대 크기는 얼마입니까? (문자 수)

IN 절에 대한 최대 크기? 나는 오라클은 1000 항목 제한을 가지고 있지만 함께 2 인을 AND 연산과이 주위에 얻을 수에 대해 뭔가를 본 것 같아요. SQL Server의 유사한 문제?

최신 정보 나는 그것이 IN 절 1000 개의 GUID의 목록을 제출인가?은 SQL Server에 대해 '다른 시스템 1000 개의 GUID (비 관계형 데이터베이스) 말을 취하고는 "코드에 가입해야 할 경우 어떤 일이 가장 좋은 방법이 될 것입니다? 또는 더 효율적으로 작동하는 또 다른 방법이있다?

나는이 시험하지 않았다 그러나 나는가 XML 문서로 GUID를 제출 할 수 있을까. 예를 들면

<guids>
    <guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
    <guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>

다음 XQuery에 어떤 종류의 문서와 표에 가입 할. 이하 1,000 항목 IN 절보다 효율적인가요?

해결법

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

    1.65,536 * 네트워크 패킷 크기 : 모든 SQL 배치는 배치 크기 제한에 맞게 있습니다.

    65,536 * 네트워크 패킷 크기 : 모든 SQL 배치는 배치 크기 제한에 맞게 있습니다.

    그 외에는, 쿼리 런타임 조건에 의해 제한됩니다. X IN (A, B, C)은 아무것도 없지만 때문에 일반적으로 스택 크기가 부족합니다 X = A 또는 X = B 또는 X = 비슷한 식 트리를 생성 C에 X = A 또는 (X = B 또는 (X = c)는), 그래서 그것은 또는 많은 수의 매우 깊은 가져옵니다. 꽤 깊은 갈 수 있도록 SQL 7은 IN에서 10K에 대한 값에 SO 충돌,하지만 nowdays 스택은 훨씬 더 깊은 (때문에 64의)입니다.

    최신 정보

    이미 SQL 서버 목록 / 배열을 전달하는 주제에 ERLAND의 기사를 발견했다. SQL 2008로 당신은 또한 당신이 하나의 테이블 형식 매개 변수로 전체의 DataTable을 전달할 수 있으며 조인 테이블 반환 매개 변수가 있습니다.

    XML 및 XPath는 또 다른 가능한 솔루션입니다 :

    SELECT ...
    FROM Table
    JOIN (
       SELECT x.value(N'.',N'uniqueidentifier') as guid
       FROM @values.nodes(N'/guids/guid') t(x)) as guids
     ON Table.guid = guids.guid;
    
  2. ==============================

    2.은 SQL Server 최대 값은 (이 2008 년 버전) 공개 http://msdn.microsoft.com/en-us/library/ms143432.aspx된다

    은 SQL Server 최대 값은 (이 2008 년 버전) 공개 http://msdn.microsoft.com/en-us/library/ms143432.aspx된다

    는 SQL 쿼리는 VARCHAR (최대)이 될 수 있지만 65,536 * 네트워크 패킷 크기로 제한으로 표시되어 있지만, 그렇다하더라도 당신을 여행 할 가능성이 높습니다 어떤 쿼리 당 2,100 매개 변수입니다. SQL이 절에서의 리터럴 값을 매개 변수화 선택하면, 당신이 먼저 한도에 도달 할 것이라고 생각하지만의 havn't는 그것을 테스트했습니다.

    편집 : 그것은 살아 심지어 강제 매개 변수화에 따라 시험이, - 나는 빠른 테스트를 노크하고 IN 절 내에서 30K 항목 실행했다. (2005 SQL 서버)

    100,000 항목에서, 그 다음 약간의 시간이 걸렸로 떨어졌다 :

    그래서 30K는 가능하지만, 당신이 그것을 할 수해서 - 당신이해야 의미하지 않는다 :)

    편집 : 추가 질문으로 인해 계속.

    50K는 작동했지만 60K는 BTW 내 테스트 장비에 그렇게 어딘가에서 밖으로 떨어졌다.

    절에 큰를 사용하지 않고 값의 조인을 수행하는 방법의 측면에서, 개인적으로 나는에게 최고의 기회를주고, 그 임시 테이블, 색인에 그것을 값을 삽입하고 조인에서 사용, 임시 테이블을 만들 것 optimse 조인. (1000 GUID를 정확히 너무 유용한 통계를 찾을 수 없습니다 있지만, 일반적으로 옵티마이 도움이 될 것입니다 그것에 대한 통계를 생성 할 임시 테이블에 인덱스를 생성.)

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

    3.배치 당, 256메가바이트 있도록 4K 65,536 * 네트워크 패킷 크기 인

    배치 당, 256메가바이트 있도록 4K 65,536 * 네트워크 패킷 크기 인

    그러나, 인디애나는 그 전에 길을 중지하지만 정확한 아니다.

    당신은 메모리 오류와 끝까지하지만 정확한 오류를 불러올 수 없습니다. 거대한 IN 비효율적 어쨌든 될 것입니다.

    편집 : 레무스가 생각 나게 : 오류가 "스택 크기"에 관한 것입니다

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

    4.당신이 처음 테이블에 GUID를로드 할 수 있습니다 후 않는

    당신이 처음 테이블에 GUID를로드 할 수 있습니다 후 않는

    ... WHERE var IN SELECT guid FROM #scratchtable
    
  5. from https://stackoverflow.com/questions/1869753/maximum-size-for-a-sql-server-query-in-clause-is-there-a-better-approach by cc-by-sa and MIT license