Недавно я контролировал такой медленный запрос, как это:
Выберите DELETE_FLAG, DELETE_TIMEFROM D_ORDERINFO, где (ORDERID не является null и orderid = n'xxxx ')
В таблице D_ORDERINFO существует индекс OrderID, но поле OrderID имеет тип VARCHAR.
Поскольку структура разработки mybatis автоматически генерирует условие, где не указывает тип параметра, параметр типа строки автоматически станет Nvarchar (4000) в SQLServer. Что сложно, так это то, что это нормально, если вы не указаете тип параметра, но вы также автоматически добавляете условие, не связанного с SARG, подобное OrderID, не является нулевым, а план выполнения становится таким:
---------------------------------------------------------------------------------------------
Если нет OrderID, не является нулевым условием, план выполнения будет таким:
Поскольку тип параметра NVARCHAR имеет более высокий приоритет, чем тип поля индекса VARCHAR, его нельзя преобразовать напрямую, но оптимизатор SQLServer в конечном итоге преобразует его в значение диапазона, а конечный запрос на равные знаки становится аналогичным запросу небольшого диапазона.
Вы можете увидеть подробную информацию об индексе, иначе:
------------------------------------------------------------------------
Если типы параметров совпадают, план выполнения будет таким же, как и ожидалось (хотя и не включенные, все еще есть поиск ключей):
Конечно, то, как я наконец надеялся написать, выглядит следующим образом:
Выберите DELETE_FLAG, DELETE_TIMEFROM D_ORDERINFO, где ORDERID = 'XXXX'
План исполнения, конечно, будет таким:
Но я просто не знаю, что может изменить мастер разработки в конце концов ...
Решение мастера разработки: настроить строку подключения:
SendStringParametersAsasunicode = false
PostScript:
По умолчанию данные символов в Java обрабатываются как Unicode; Строковые объекты Java представляют данные символов Unicode. У драйверов JDBC единственные вещи, которые не могут подчиняться этому правилу, - это методы Getter и сеттера ASCII, которые являются особыми случаями, потому что байтовые потоки, используемые этими методами, имеют неявное предположение одной известной кодовой страницы (ASCII).
Кроме того, драйвер JDBC предоставляет свойство строки подключения SendStringParameterSasasAsunicode. Это свойство может использоваться для указания предопределенных параметров для данных символов, отправленных как ASCII вместо Unicode.
В качестве повышения производительности, параметр строки может быть передана в SQL Server в формате без Unicode, установив свойство строки подключения SendStringParameterSasAsunicode. Настройка по умолчанию SendStringParameterSasasUnicode - «true», что означает, что параметр строки будет отправлен как Unicode.
Если SendStringParameterSasasUnicode установлен на «FALSE», все струнные параметры на подключении отправляются на сервер, используя базу данных по умолчанию.
См.
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