Baru -baru ini, saya telah memantau kueri lambat seperti ini:
Pilih delete_flag, delete_timefrom d_orderinfo di mana (orderId tidak null dan orderid = n'xxxx ')
Ada indeks OrderID pada tabel D_OrderInfo, tetapi bidang OrderID adalah tipe varchar.
Karena kerangka pengembangan MyBatis secara otomatis menghasilkan kondisi WHERE dan tidak menentukan jenis parameter, parameter jenis string akan secara otomatis menjadi nvarchar (4000) di SQLServer. Yang rumit adalah tidak apa-apa jika Anda tidak menentukan jenis parameter, tetapi Anda juga secara otomatis menambahkan kondisi non-SARG seperti OrderId bukan nol, dan rencana eksekusi menjadi seperti ini:
-----------------------------------------------------------------------------------------
Jika tidak ada OrderId bukan kondisi nol, rencana eksekusi akan seperti ini:
Karena tipe parameter nvarchar memiliki prioritas yang lebih tinggi daripada jenis bidang indeks VARCHAR, tidak dapat dikonversi secara langsung, tetapi pengoptimal SQLServer akhirnya mengubahnya menjadi nilai rentang, dan kueri tanda yang sama menjadi mirip dengan kueri rentang kecil.
Anda dapat melihat dari informasi terperinci dari pencarian indeks:
-------------------------------------------------------------------------
Jika jenis parameter cocok, rencana eksekusi akan seperti yang diharapkan (meskipun tidak termasuk, masih ada pencarian kunci):
Tentu saja, cara saya akhirnya berharap untuk menulis adalah sebagai berikut:
Pilih delete_flag, delete_timefrom d_orderinfo di mana orderid = 'xxxx'
Rencana eksekusi tentu saja akan seperti ini:
Tapi, saya tidak tahu apa yang dapat diubah oleh master pengembangan pada akhirnya ...
Solusi Master of Development: Konfigurasikan string koneksi:
sendStringParametersAsunicode = false
nota bene:
Secara default, data karakter di Java diproses sebagai Unicode; Objek string Java mewakili data karakter Unicode. Dalam driver JDBC, satu -satunya hal yang tidak dapat mematuhi aturan ini adalah metode pengambil dan setter ASCII, yang merupakan kasus khusus karena aliran byte yang digunakan oleh metode ini membawa asumsi implisit dari satu halaman kode yang diketahui (ASCII).
Selain itu, driver JDBC menyediakan properti SendStringParametersAsUnicode Connection String. Properti ini dapat digunakan untuk menentukan parameter yang telah ditentukan untuk data karakter yang dikirim sebagai ASCII, bukan Unicode.
Sebagai peningkatan kinerja, parameter string dapat diteruskan ke SQL Server dalam format non-unicode dengan mengatur properti SendStringParametersAsUnicode Connection String. Pengaturan default SendStringParametersAsUnicode adalah "benar", yang berarti bahwa parameter string akan dikirim sebagai unicode.
Jika SendStringParametersAsUnicode disetel ke "FALSE", semua parameter string pada koneksi dikirim ke server menggunakan kolasi default database.
Lihat:
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