최근에는 다음과 같은 느린 쿼리를 모니터링했습니다.
delete_flag, delete_timefrom d_orderInfo를 선택하십시오
D_OrderInfo 테이블에는 OrderID의 색인이 있지만 OrderID 필드는 Varchar 유형입니다.
개발 프레임 워크 MyBatis는 자동으로 WERE 조건을 생성하고 매개 변수 유형을 지정하지 않기 때문에 문자열 유형의 매개 변수는 SQLServer에서 자동으로 NVARCHAR (4000)가됩니다. 까다로운 점은 매개 변수 유형을 지정하지 않으면 괜찮다는 것이 좋지만 OrderId와 같은 비 사고 조건을 자동으로 추가하고 실행 계획이 다음과 같이됩니다.
------------------------------------------------------------------------------------------------------------------
OrderId가없는 경우 널 상태가 아닌 경우 실행 계획은 다음과 같습니다.
매개 변수 유형 nvarchar는 인덱스 필드 유형 Varchar보다 우선 순위가 높기 때문에 직접 변환 할 수는 없지만 SQLServer Optimizer는 결국 범위 값으로 변환되며 최종 동일한 부호 쿼리는 작은 범위 쿼리와 유사하게됩니다.
INDEX SEEK의 자세한 정보에서 볼 수 있습니다.
---------------------------------------------------------------------------
매개 변수 유형이 일치하면 실행 계획은 예상대로됩니다 (포함되지는 않지만 여전히 핵심 조회가 있습니다).
물론, 내가 마침내 쓰기를 바라는 방식은 다음과 같습니다.
delete_flag, delete_timeff에서 d_orderinfo를 선택하십시오.
실행 계획은 물론 다음과 같습니다.
그러나 나는 결국 개발 마스터가 무엇을 바꿀 수 있는지 모른다 ...
개발 마스터의 솔루션 : 연결 문자열 구성 :
sendstringparametersasunicode = false
추신:
기본적으로 Java의 문자 데이터는 유니 코드로 처리됩니다. Java 문자열 객체는 유니 코드 문자 데이터를 나타냅니다. JDBC 드라이버 에서이 규칙에 순종 할 수없는 유일한 것은 ASCII 스트림 getter 및 setter 메소드입니다.이 방법에 의해 사용되는 바이트 스트림은 단일 알려진 코드 페이지 (ASCII)의 암시 적 가정을 가지고 있기 때문에 특별한 경우입니다.
또한 JDBC 드라이버는 SendStringParametersAsunicode 연결 문자열 속성을 제공합니다. 이 속성은 유니 코드 대신 ASCII로 전송 된 문자 데이터의 사전 정의 된 매개 변수를 지정하는 데 사용될 수 있습니다.
성능 향상으로서 String Parameter는 SendStringParametersAsunicode Connection String 속성을 설정하여 비공개 형식의 SQL Server로 전달할 수 있습니다. SendStringSparametersAsunicode의 기본 설정은 "true"이므로 문자열 매개 변수가 유니 코드로 전송됩니다.
SendStringParametersAsUnicode가 "False"로 설정된 경우 연결의 모든 문자열 매개 변수는 데이터베이스 기본 Collation을 사용하여 서버로 전송됩니다.
참조 :
http://d.hatena.ne.jp/gnarl/20110706/1309945379
https://technet.microsoft.com/zh-cn/library/ms378857(sql.90).aspx
https://technet.microsoft.com/zh-cn/library/ms378988(v=sql.90).aspx