SQL이 직접적으로 사용되거나 Hibernate에 의해 생성 된 경우, "in/not in ([1 to 100 parameters])"조건이 클 수 있으므로 가능한 한 매개 변수를 채우고 제한된 수의 쿼리 계획?매개 변수화 된 SQL - 쿼리 계획 캐시 최적화를 위해 고정 된 수의 매개 변수가 있거나 없습니까?
매개 변수는 int/number이며, DBMS는 MSSQL 또는 Oracle입니다. 쿼리는 sp_executesql/executeimmediate를 통해 호출되어 쿼리 계획 캐싱을 시행합니다.
일반적으로 이러한 쿼리에는 동일한 쿼리에 대해 최대 100 개의 쿼리 계획이 있습니다. 이러한 여러 쿼리가 캐시를 빠르게 채울 수도 있고 캐시 된 쿼리 계획을 전혀 사용하지 않아 성능이 저하 될 수도 있습니다.
사용자는 특정 수의 매개 변수에 도달 할 때까지 마지막 값을 반복하여 매개 변수 목록을 채울 수 있습니다.
내가 아는 한 MSSQL과 Oracle은 알려진 쿼리를 문자열 동일성으로 식별하므로 서로 다른 수의 매개 변수에 대해 서로 다른 쿼리 계획이 생성됩니다.
(값은 물론 매개 변수가 아니며 연결된 숫자가 아님).
SELECT * FROM MyTable WHERE Id in (4001, 4002, 4003, ... , 4055, 4056, 4056, 4056, 4056, 4056)
가리스트 (50)의 길이, 60, 70, 80, 90, 100를 갖는 "의"전체 길이와 값 4056을 반복함으로써 60 개 매개 변수를 갖는 56 개 파라미터 변화와
SELECT * FROM MyTable WHERE Id in (4001, 4002, 4003, ... , 4055, 4056)
10 매개 변수 만 남습니다.
최대 100 개의 매개 변수가있는 이러한 쿼리의 경우 10 개에서 100 개까지의 매개 변수에 대해 10 개의 쿼리 계획과 1에서 9 개의 매개 변수에 대해 9 개의 쿼리 계획 (채우기 없음)이 있습니다.
EDIT : 배치 크기 = "200"인 NHibernate (3.1.0.4 이상)와 SQL Server는 실제로 매개 변수 목록을 고정 길이 매개 변수 목록과 함께 여러 문으로 나눕니다. 예를 들어, 118 ID 매개 변수로 선택하면 배치 ID = "200"은 ID가 118 인 ID 대신 100, 12 및 6 ID가있는 세 개의 선택 사항으로 전송 될 수 있습니다. 이것은 내가 원했던 것과 비슷하지만, 200 개의 서로 다른 SQL 문자열이 아니기 때문에 batch-size = "200"과 비슷하지만 시간이 지남에 따라 쿼리 계획이 누적되지만 더 적은 수의 16 개가 될 것입니다. 1 사이의 각 매개 변수 개수에 대해 하나의 SQL이있는 것으로 보입니다 12, 25, 50 및 100 매개 변수가있는 명령문. 아마도 반복되는 값으로 채우기가 더 효율적일 수 있지만 이는 쿼리 계획 재사용을 보장하는 좋은 방법입니다.
불행히도 NHibernate는 현재 테이블 매개 변수를 지원하지 않는 것 같습니다. 링크 된 예제는 실제 NHibernate 구현 (데이터 모델)이 아니라 고전적인 ADO.NET 스타일의 NHibernate를 통한 단순한 SQL 호출입니다. Id 값은 모두 클라이언트 로직에 의해 선택되며 여기서는 필터 테이블이 의미가 없습니다. 어쨌든, NHibernate가 데이터 모델을 통해 테이블 매개 변수를 지원하면 훌륭합니다! –