데이터베이스 공급자 유형당 허용 가능한 최대 매개 변수 수는 몇 개입니까?
ADO를 통해 SQL Server 쿼리에 전달할 수 있는 매개 변수는 2,100개로 제한됩니다.망. 그러나 에 의해 사용되는 다른 공통 데이터베이스에 대한 문서화된 제한은 무엇입니까?넷 개발자 - 특히 관심이 있는 것은 다음과 같습니다.
- 오라클 10g/11g
- MySql
- PostgreSql
- SQLite
아는 사람이 있나요?
오라클: 64,000개.출처
MySQL:
- 기본적으로 제한은 없습니다.MySQL "text protocol"은 명령 텍스트를 서버로 보내기 전에 .NET 클라이언트 라이브러리가 모든 매개 변수를 대체해야 합니다. 서버 측 제한은 적용할 수 없으며 클라이언트는 사용 가능한 메모리를 제외하고 제한이 없습니다.
- 전화로 "준비된 진술서"를 사용하는 경우
MySqlCommand.Prepare()
(및 지정)IgnorePrepare=false
연결 문자열)에는 65,535개의 매개 변수의 한계가 있습니다(왜냐하면num_params
2바이트여야 함).
PostgreSql: EDIT: Magnus Hagander의 답변에 따라 쿼리의 경우 34464, 함수의 경우 100(단일 참조점을 제공하기 위해 여기에 복사된 답변)
SqlLite: 999(SQLITE_MAX_VARIBLE_NUMBER, 기본값은 999이지만 런타임에 낮출 수 있음) - 함수의 경우 기본값은 100개입니다.런타임 제한 문서의 섹션 9 참조
jOOQ에서는 벤더당 관련 수에 도달하면 바인딩 값을 인라인화하여 이러한 한계를 해결했습니다.번호는 여기에 기록되어 있습니다.공급업체 설명서에 따르면 모든 숫자가 정확한 것은 아닙니다. JDBC를 통해 시행착오를 통해 경험적으로 숫자를 발견했습니다.(특정 버전에 연결하지 않고) 다음과 같습니다.
- 입력: 1024
- Microsoft 액세스: 768
- Oracle : 32767
- PostgreSQL : 32767
- SQLite: 999
- SQL Server : 2100(버전에 따라 다름)
- Sybase ASE : 2000
다른 데이터베이스는 제한이 없는 것 같습니다. 적어도 아직 발견하지 못했습니다(그러나 100000개를 훨씬 초과하지는 않았습니다).
Postgre에 대한 정답쿼리에 바인딩된 매개 변수에 대해 말할 때 SQL은 34464로 나타납니다.반응 100은 함수에 대한 모수의 수에 대해서는 여전히 정확합니다.
더 포스트그SQL 와이어 프로토콜은 바인딩 메시지(https://www.postgresql.org/docs/current/protocol-message-formats.html) 의 매개 변수 개수에 16비트 정수를 사용합니다.
그러므로 포스트그레SQL 프로토콜은 단일 문에 65535개 이상의 매개 변수를 허용하지 않습니다.이것은 두 개의 문이 포함된 단일 ado.net 명령을 전송하는 것입니다. 각각 65535개의 매개 변수가 있습니다.
제가 보기에 MySQL 질문에는 실제로 두 가지 답이 있습니다.준비된 문 프로토콜은 서버에서 검색될 매개 변수의 수를 설명하기 위해 서명된 2바이트 길이의 짧은 값을 정의합니다.클라이언트는 먼저 COM_STMT_PREARE를 호출하고, 성공하면 COM_STMT_PREARE 응답을 받습니다.
응답에 대한 설명서에는 다음이 명시되어 있습니다.
num_params > 0인 경우 추가 패킷이 뒤따릅니다.
매개 변수 정의 블록
num_params
*Protocol::ColumnDefinition
EOF_Packet
점을 하면,num_params
최대 2^16(짧게 서명됨)만 사용할 수 있으며, 이는 매개 변수의 한계이며 회사에 사용자 지정 MySQL 드라이버가 있으므로 이를 구현할 때 이 규칙을 따르기로 선택했으며 제한을 초과할 경우 예외가 발생합니다.
하만지,COM_STMT_PREPARE
이 개수 이상의 매개 변수를 보내는 경우 실제로는 오류를 반환하지 않습니다. 값num_params
실제로는 2^16이며 이후에는 더 많은 매개 변수가 뒤따를 것입니다.이것이 버그인지는 모르겠지만 프로토콜 설명서에는 이 동작에 대해 설명되어 있지 않습니다.
매개 변수의 수를 알 수 있는 방법이 클라이언트 측에 있는 한 (client_num_params
할 수 . MySQL 클라이언트는 "", MySQL 클라이언트"를 볼 수 .client_num_params
x Protocol::ColumnDefinition
여분은또볼있다니습수한러를 볼 수 .EOF_Packet
하지만 그것은 단지 실제로 보내진 것입니다.CLIENT_DEPRECATE_EOF
활성화되지 않았습니다.
다음에 예약된 바이트가 있다는 점도 흥미롭습니다.num_params
프로토콜 설계자들이 이를 24비트 숫자로 만드는 옵션을 원했을 것이며, 약 830만 개의 매개 변수를 허용할 것임을 나타냅니다.이를 위해서는 추가 클라이언트 기능 플래그도 필요합니다.
요약:
- 클라이언트/서버 프로토콜 문서에서 최대 매개 변수 수가 32768일 수 있음을 나타내는 것 같습니다.
- 서버는 사용자가 더 많이 보내도 상관하지 않는 것처럼 보이지만 문서화되지 않은 것으로 보이며 이후 릴리스에서 지원되지 않을 수 있습니다.하지만 Oracle의 ADO.NET Connector를 포함한 여러 드라이버가 손상될 수 있기 때문에 이 문제가 발생할 가능성은 매우 낮습니다.
언급URL : https://stackoverflow.com/questions/6581573/what-are-the-max-number-of-allowable-parameters-per-database-provider-type
'programing' 카테고리의 다른 글
MS SQL에서 지난 30분 동안의 기록을 검색하는 방법은 무엇입니까? (0) | 2023.06.24 |
---|---|
git init를 두 번 실행하면 리포지토리가 초기화됩니까, 아니면 기존 repo가 다시 초기화됩니까? (0) | 2023.06.24 |
이름이 MKMapView인 클래스를 인스턴스화할 수 없습니다. (0) | 2023.06.24 |
EF4 - 선택한 저장 프로시저가 열을 반환하지 않습니다. (0) | 2023.06.24 |
IIS 7에서 하위 도메인을 설정하는 방법 (0) | 2023.06.24 |