في الآونة الأخيرة ، راقبت استعلامًا بطيئًا مثل هذا:
حدد DELETE_FLAG ، DELETE_TIMEFROM D_ORDERINFO حيث (OrderID ليس فارغًا و orderid = n'xxxx ')
يوجد فهرس من OrderID على جدول D_OrderInfo ، ولكن حقل OrderID من نوع varchar.
نظرًا لأن Framework MyBatis يقوم تلقائيًا بإنشاء حالة المكان ولا يحدد نوع المعلمة ، ستصبح المعلمة من نوع السلسلة تلقائيًا NVARCHAR (4000) في SQLServer. ما هو صعب هو أنه من الجيد إذا لم تحدد نوع المعلمة ، لكنك أيضًا تضيف شرطًا غير SARG تلقائيًا مثل OrderID ليس فارغًا ، وتصبح خطة التنفيذ مثل هذا:
-------------------------------------------------------------------------------------------
إذا لم يكن هناك شرط فارغ ، فستكون خطة التنفيذ هكذا:
نظرًا لأن نوع المعلمة NVARCHAR له أولوية أعلى من نوع حقل الفهرس VARCHAR ، فلا يمكن تحويله مباشرةً ، لكن محسن SQLServer يحوله في النهاية إلى قيمة نطاق ، ويصبح استعلام الإشارة المتساوي النهائي مشابهًا لاستعلام النطاق الصغير.
يمكنك أن ترى من المعلومات التفصيلية للفهرس السعي:
-----------------------------------------------------------------------------
إذا تطابق أنواع المعلمات ، فستكون خطة التنفيذ كما هو متوقع (على الرغم من عدم تضمينها ، لا يزال هناك بحث مفتاح):
بالطبع ، الطريقة التي كنت آمل أخيرًا في الكتابة هي كما يلي:
حدد delete_flag ، delete_timefrom d_orderinfo حيث orderid = 'xxxx'
ستكون خطة التنفيذ بالطبع هكذا:
لكنني لا أعرف ما الذي يمكن أن يتغيره سيد التطوير في النهاية ...
حل سيد التطوير: تكوين سلسلة الاتصال:
SendStringParametersasUnicode = خطأ
بوستسكريبت:
بشكل افتراضي ، تتم معالجة بيانات الأحرف في Java كوحدة يونيكود ؛ تمثل كائنات سلسلة Java بيانات حرف Unicode. في برامج تشغيل JDBC ، فإن الأشياء الوحيدة التي لا يمكن أن تطيع هذه القاعدة هي أساليب Getter و Setter ASCII ، وهي حالات خاصة لأن تدفقات البايت المستخدمة في هذه الطرق تحمل الافتراض الضمني لصفحة رمز معروفة واحدة (ASCII).
بالإضافة إلى ذلك ، يوفر برنامج تشغيل JDBC خاصية سلسلة اتصال SendStringParametersasUnicode. يمكن استخدام هذه الخاصية لتحديد المعلمات المحددة مسبقًا لبيانات الأحرف المرسلة باسم ASCII بدلاً من Unicode.
كتحسين للأداء ، يمكن تمرير المعلمة السلسلة إلى SQL Server بتنسيق غير unicode عن طريق تعيين خاصية SendStringParametAsunicode String. الإعداد الافتراضي لـ SendStringParametersAsunicode هو "صحيح" ، مما يعني أنه سيتم إرسال معلمة السلسلة كحوض يونيكود.
إذا تم تعيين SendStringParametersAsunicode على "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