SQL Server의 "IN" 절 제한
IN 절에 대한 식 목록에서 (일치 여부를 테스트하기 위해) 가질 수 있는 값의 수에 대한 한계가 무엇인지 아는 사람이 있습니까?
예, 제한이 있지만 Microsoft는 제한이 "수천 개"에 있다고만 지정합니다.
괄호 안에 매우 많은 수의 값(쉼표로 구분된 수천 개의 값)을 명시적으로 포함하면 IN 절은 리소스를 소비하고 오류 8623 또는 8632를 반환할 수 있습니다.이 문제를 해결하려면 IN 목록의 항목을 테이블에 저장하고 IN 절 내에서 SELECT 하위 쿼리를 사용합니다.
세부적으로 이러한 오류를 살펴보면, 이 제한이 특정하지 않음을 알 수 있습니다.IN그러나 일반적으로 쿼리 복잡성에 적용됩니다.
오류 8623:
쿼리 프로세서의 내부 리소스가 부족하여 쿼리 계획을 생성할 수 없습니다.이것은 드문 이벤트이며 매우 많은 수의 테이블 또는 파티션을 참조하는 매우 복잡한 쿼리에만 예상됩니다.쿼리를 단순화하십시오.이 메시지를 잘못 수신한 것 같으면 고객 지원 서비스에 문의하십시오.
오류 8632:
내부 오류:식 서비스 제한에 도달했습니다.쿼리에서 잠재적으로 복잡한 식을 찾고 단순화하십시오.
특정하지 않지만 쿼리 계획 생성기가 메모리 제한을 초과하는 것과 관련이 있습니다.수천 개의 오류가 종종 발생하지만 먼저 표에 값을 삽입하고 쿼리를 다음과 같이 변경하여 해결할 수 있음을 확인할 수 있습니다.
select * from b where z in (select z from c)
여기서 in 절에서 원하는 값은 표 c에 있습니다.우리는 100만 개의 가치를 가진 조항으로 이것을 성공적으로 사용했습니다.
사용 중인 데이터베이스 엔진에 따라 명령어 길이에 제한이 있을 수 있습니다.
SQL Server에는 매우 큰 제한이 있습니다.
SQL Server의 최대 용량 사양
따라서 큰 IN 절의 경우에는 임시 테이블을 만들고 값을 삽입한 후 JOIN을 수행하는 것이 좋습니다.더 빨리 작동합니다.
제한이 있지만 값을 ()의 별도 블록으로 분할할 수 있습니다.
Select *
From table
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)
2008년에 테이블 값 매개 변수를 사용하거나 여기에 설명된 일부 접근 방식을 사용합니다.
하는 방법 종류의 SQL-GUI과 하위 .where X in (1, 2, 3...)또한 다음 오류가 발생할 수 있습니다.
이 RPC 요청에 너무 많은 매개 변수가 제공되었습니다.최대 2100입니다.
따라서 이러한 경우 한계는 2100(또는 다른 매개 변수가 있는 경우에는 더 적음)입니다.
SQL Server JDBC 드라이버의 제한은 2100이며 SQL Server Exception:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The incoming request has too many parameters. The server supports a maximum of 2100 parameters. Reduce the number of parameters and resend the request.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:265) ~[mssql-jdbc-10.2.1.jre8.jar:na]
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1676) ~[mssql-jdbc-10.2.1.jre8.jar:na]
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:615) ~[mssql-jdbc-10.2.1.jre8.jar:na]
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:537) ~[mssql-jdbc-10.2.1.jre8.jar:na]
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7730) ~[mssql-jdbc-10.2.1.jre8.jar:na]
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3786) ~[mssql-jdbc-10.2.1.jre8.jar:na]
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:268) ~[mssql-jdbc-10.2.1.jre8.jar:na]
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:242) ~[mssql-jdbc-10.2.1.jre8.jar:na]
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:456) ~[mssql-jdbc-10.2.1.jre8.jar:na]
언급URL : https://stackoverflow.com/questions/21178390/in-clause-limitation-in-sql-server
'programing' 카테고리의 다른 글
| 선택 항목 내 SQL 사용자 정의 함수 (0) | 2023.07.03 |
|---|---|
| 오류: 모듈 파일의 최소 배포 대상은 ios8.3 v8.3입니다. (0) | 2023.07.03 |
| MariaDB 다시 시작 오류 "variable 'default-character-set = cp932'" (0) | 2023.07.03 |
| Firebase 관리자용 "serviceAccountCredentials.json"은 어디에서 얻을 수 있습니까? (0) | 2023.07.03 |
| 앱을 Spring Boot로 마이그레이션한 후 Spring Data Rest를 사용하는 동안 @Id의 엔티티 속성이 더 이상 JSON으로 마샬링되지 않음을 확인했습니다. (0) | 2023.07.03 |