SQL Server 쿼리의 최대 크기? IN 절? 더 나은 접근 방법이 있습니까 [중복]
중복 가능성 :
T-SQL WHERE col IN (…)
SQL Server 쿼리의 최대 크기는 얼마입니까? (문자 수)
IN 절의 최대 크기? 나는 Oracle에 대해 1000 개의 항목 제한이있는 것을 본 것 같지만 2 개의 IN을 AND로 연결하면이 문제를 해결할 수 있습니다. SQL Server에서 비슷한 문제가 있습니까?
업데이트 따라서 다른 시스템 (비 관계형 데이터베이스)에서 1000 개의 GUID를 가져 와서 SQL Server에 대해 "코드에서 JOIN"을 수행해야하는 경우 가장 좋은 방법은 무엇입니까? 1000 개의 GUID 목록을 IN 절에 제출하는 것입니까? ? 아니면 더 효율적으로 작동하는 또 다른 기술이 있습니까?
나는 이것을 테스트하지 않았지만 GUID를 XML 문서로 제출할 수 있는지 궁금합니다. 예를 들면
<guids>
<guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
<guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>
그런 다음 Doc 및 Table에 대해 일종의 XQuery JOIN을 수행하십시오. 1000 항목 IN 절보다 덜 효율적입니까?
모든 SQL 배치는 배치 크기 제한 : 65,536 * 네트워크 패킷 크기 에 맞아야합니다 .
그 외에 쿼리는 런타임 조건에 의해 제한됩니다. x IN (a, b, c)은 x = a OR x = b OR x = c에 불과하기 때문에 일반적으로 스택 크기가 부족하여 x = a OR (x = b OR (x = c)), 그래서 많은 수의 OR로 매우 깊어집니다. SQL 7은 IN에서 약 10k 값에서 SO 에 도달 하지만, 요즘에는 스택이 훨씬 더 깊기 때문에 (x64 때문에) 꽤 깊을 수 있습니다.
최신 정보
목록 / 배열을 SQL Server로 전달하는 주제에 대한 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;
SQL Server 최대 값은 http://msdn.microsoft.com/en-us/library/ms143432.aspx(2008 버전)에 공개되어 있습니다 .
SQL 쿼리는 varchar (max) 일 수 있지만 65,536 * 네트워크 패킷 크기로 제한되는 것으로 표시되지만 가장 가능성이 높은 것은 쿼리 당 매개 변수 2100 개입니다. SQL이 in 절의 리터럴 값을 매개 변수화하기로 선택하면 먼저 해당 제한에 도달 할 것이라고 생각하지만 테스트하지는 않았습니다.
편집 : 강제 매개 변수화 하에서도 테스트하십시오-빠른 테스트를 수행하고 In 절 내에서 30k 항목으로 실행했습니다. (SQL Server 2005)
10 만 개의 항목에서 시간이 좀 걸렸고 다음과 같이 삭제되었습니다.
메시지 8623, 수준 16, 상태 1, 줄 1 쿼리 프로세서에 내부 리소스가 부족하여 쿼리 계획을 생성 할 수 없습니다. 이는 드문 이벤트이며 매우 많은 수의 테이블 또는 파티션을 참조하는 매우 복잡한 쿼리 또는 쿼리에서만 예상됩니다. 쿼리를 단순화하십시오. 이 메시지가 잘못 수신되었다고 생각되면 고객 지원 서비스에 자세한 정보를 문의하십시오.
따라서 30k가 가능하지만 할 수 있기 때문에 가능하다는 의미는 아닙니다. :)
편집 : 추가 질문으로 계속됩니다.
50k는 효과가 있었지만 60k는 중퇴했기 때문에 테스트 장비 btw의 어딘가에 있습니다.
In terms of how to do that join of the values without using a large in clause, personally I would create a temp table, insert the values into that temp table, index it and then use it in a join, giving it the best opportunities to optimse the joins. (Generating the index on the temp table will create stats for it, which will help the optimiser as a general rule, although 1000 GUIDs will not exactly find stats too useful.)
Per batch, 65536 * Network Packet Size which is 4k so 256 MB
However, IN will stop way before that but it's not precise.
You end up with memory errors but I can't recall the exact error. A huge IN will be inefficient anyway.
Edit: Remus reminded me: the error is about "stack size"
Can you load the GUIDs into a scratch table then do a
... WHERE var IN SELECT guid FROM #scratchtable
'programing tip' 카테고리의 다른 글
IIS : 유휴 시간 초과 대 재활용 (0) | 2020.09.08 |
---|---|
TypeScript를 사용하여 Angular2의 http 데이터에서 RxJS Observables 연결 (0) | 2020.09.08 |
IntelliJ IDEA는 Spring의 @Autowired 주석을 사용할 때 오류를 표시합니다. (0) | 2020.09.08 |
JWT 토큰의 최대 크기는 얼마입니까? (0) | 2020.09.08 |
new operator [duplicate]보다 std :: make_unique 사용의 장점 (0) | 2020.09.08 |