SQL Server 쿼리의 최대 크기?IN절?더 나은 접근법이 있습니까?
중복 가능성:
T-SQL WHERE colin(…)
SQL Server 쿼리의 최대 크기는 얼마입니까?(문자 수)
IN 절의 최대 크기?Oracle이 1000개의 항목 제한을 가지고 있다는 것을 본 것 같습니다. 하지만 AND 2IN을 함께 사용하면 이 문제를 해결할 수 있습니다.SQL Server에서도 비슷한 문제가 있습니까?
업데이트 다른 시스템(비관계형 데이터베이스)에서 1000개의 GUID를 가져와 SQL 서버에 대해 "JOIN in code"를 수행해야 하는 경우 가장 좋은 방법은 무엇입니까?1000개의 GUID 목록을 IN 조항에 제출하기 위한 것입니까?아니면 더 효율적으로 작동하는 다른 기술이 있습니까?
저는 이것을 테스트하지 않았지만 GUID를 XML 문서로 제출할 수 있는지 궁금합니다.예를들면
<guids>
<guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
<guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>
그런 다음 문서와 테이블에 대해 XQuery JOIN 같은 것을 수행합니다.1000 항목 IN 조항보다 효율성이 떨어집니까?
모든 SQL 배치는 배치 크기 제한 65,536 * 네트워크 패킷 크기에 맞아야 합니다.
그 외에는 런타임 조건에 따라 쿼리가 제한됩니다.일반적으로 x IN(a,b,c)은 x=a OR(x=b OR(x=c))과 유사한 식 트리를 생성하는 x=a OR 또는 x=c에 불과하기 때문에 스택 크기가 부족합니다. 따라서 많은 OR과 함께 매우 깊어집니다. SQL 7은 IN에서 약 10k 값으로 SO에 도달하지만 오늘날에는 스택이 훨씬 더 깊어집니다(x64로 인해).
갱신하다
SQL Server에 목록/어레이 전달 항목에 대한 Erland의 기사를 이미 찾았습니다.SQL 2008에는 전체 DataTable을 단일 테이블 유형 매개 변수로 전달하고 이 매개 변수에 가입할 수 있는 Table Valueed Parameter도 있습니다.
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;
SQL Server Maximums는 http://msdn.microsoft.com/en-us/library/ms143432.aspx (2008 버전)에 공개됩니다.
SQL 쿼리는 varchar(max)일 수 있지만 65,536 * 네트워크 패킷 크기로 제한되어 표시되지만, 쿼리당 2100개의 매개 변수를 사용할 수 있습니다.SQL이 in 절의 리터럴 값을 매개 변수화하기로 선택하면 당신이 먼저 그 한계에 도달할 것이라고 생각하지만, 저는 그것을 테스트하지 않았습니다.
편집 : 강제 매개변수화 하에서도 생존한 테스트 - 빠른 테스트를 수행하여 In 절 내에서 30,000개의 항목으로 실행했습니다.(SQL Server 2005)
100,000개의 항목에서 시간이 좀 걸렸지만 다음과 함께 삭제되었습니다.
Msg 8623, Level 16, State 1, Line 1 쿼리 프로세서의 내부 리소스가 부족하여 쿼리 계획을 생성할 수 없습니다.이것은 드문 이벤트이며 매우 많은 수의 테이블 또는 파티션을 참조하는 매우 복잡한 쿼리에만 예상됩니다.쿼리를 단순화하십시오.이 메시지를 잘못 수신한 것 같으면 고객 지원 서비스에 문의하십시오.
그래서 30k는 가능하지만, 당신이 할 수 있다고 해서 당신이 해야 한다는 것을 의미하지는 않습니다 :)
편집 : 추가 질문으로 인해 계속됩니다.
50,000은 작동했지만 60,000은 탈락했습니다. 그래서 제 시험 RBTW 어딘가에 있습니다.
큰 인 절을 사용하지 않고 값을 조인하는 방법과 관련하여, 개인적으로 저는 임시 테이블을 만들고, 해당 임시 테이블에 값을 삽입하고, 색인화한 다음 조인에 사용하여 조인을 최적화할 수 있는 최상의 기회를 제공합니다. (템플 테이블에 인덱스를 생성하면 해당 테이블에 대한 통계가 생성됩니다.이는 일반적인 규칙으로 옵티마이저에 도움이 되지만 1000개의 GUID는 정확하게 통계가 너무 유용하지 않다고 생각합니다.)
배치당 65536 * 네트워크 패킷 크기(4,000 ~ 256MB)
그러나 IN은 그 전에 멈출 것이지만 정확하지 않습니다.
결국 메모리 오류가 발생하지만 정확한 오류는 기억나지 않습니다.어쨌든 큰 IN은 비효율적일 것입니다.
편집: 리머스는 나에게 상기시켰다: 오류는 "스택 크기"에 관한 것이다.
스크래치 테이블에 GUID를 로드한 후 다음을 수행할 수 있습니까?
... WHERE var IN SELECT guid FROM #scratchtable
언급URL : https://stackoverflow.com/questions/1869753/maximum-size-for-a-sql-server-query-in-clause-is-there-a-better-approach
'programing' 카테고리의 다른 글
로컬 분기 삭제 실행 취소 (0) | 2023.05.26 |
---|---|
이전에 추가한 라이브러리 제거 또는 제거: cocoapods (0) | 2023.05.26 |
Eclipse 프로젝트에서 모든 Java 파일을 한 번에 포맷하는 방법은 무엇입니까? (0) | 2023.05.26 |
버려진 Mongodb를 어떻게 수입합니까? (0) | 2023.05.26 |
Objective-C 블록을 속성으로 사용할 수 있습니까? (0) | 2023.05.26 |