เมื่อเร็ว ๆ นี้ฉันได้ตรวจสอบการสืบค้นช้าเช่นนี้:
เลือก DELETE_FLAG, DELETE_TIMEFROM D_ORNERINFO โดยที่ (orderId ไม่ใช่ null และ orderId = n'xxxx ')
มีดัชนีของ orderId บนตาราง d_orderinfo แต่ฟิลด์ orderid เป็นประเภท varchar
เนื่องจากเฟรมเวิร์กการพัฒนา MyBatis จะสร้างเงื่อนไขโดยอัตโนมัติและไม่ได้ระบุประเภทพารามิเตอร์พารามิเตอร์ของประเภทสตริงจะกลายเป็น nvarchar (4000) โดยอัตโนมัติใน SQLServer สิ่งที่ยุ่งยากคือมันไม่เป็นไรถ้าคุณไม่ได้ระบุประเภทพารามิเตอร์ แต่คุณยังเพิ่มเงื่อนไขที่ไม่ใช่ Sarg โดยอัตโนมัติเช่น OrderID ไม่ใช่ NULL และแผนการดำเนินการจะเป็นเช่นนี้:
-
หากไม่มี orderId ไม่ได้เป็นโมฆะแผนการดำเนินการจะเป็นเช่นนี้:
เนื่องจากประเภทพารามิเตอร์ NVARCHAR มีลำดับความสำคัญสูงกว่าประเภทฟิลด์ดัชนี VARCHAR จึงไม่สามารถแปลงได้โดยตรง แต่ SQLServer Optimizer ในที่สุดก็จะแปลงเป็นค่าช่วงและการสืบค้นสัญญาณเท่ากันสุดท้ายจะคล้ายกับแบบสอบถามขนาดเล็ก
คุณสามารถดูได้จากข้อมูลรายละเอียดของดัชนี SEET:
-
หากประเภทพารามิเตอร์ตรงกับแผนการดำเนินการตามที่คาดไว้ (แม้ว่าจะไม่รวมอยู่ก็ยังมีการค้นหาคีย์):
แน่นอนวิธีที่ฉันหวังว่าจะเขียนในที่สุดก็มีดังนี้:
เลือก DELETE_FLAG, DELETE_TIMEFROM D_ORNERINFO โดยที่ orderId = 'xxxx'
แน่นอนว่าแผนการดำเนินการจะเป็นเช่นนี้:
แต่ฉันแค่ไม่รู้ว่าอาจารย์พัฒนาสามารถเปลี่ยนไปได้ในตอนท้าย ...
วิธีการแก้ปัญหาของ Master of Development: กำหนดค่าสตริงการเชื่อมต่อ:
SendStringParametersAsunicode = FALSE
Postscript:
โดยค่าเริ่มต้นข้อมูลอักขระใน Java จะถูกประมวลผลเป็น Unicode; วัตถุสตริง Java แสดงข้อมูลอักขระ Unicode ในไดรเวอร์ JDBC สิ่งเดียวที่ไม่สามารถปฏิบัติตามกฎนี้ได้คือ ASCII Stream Getter และวิธีการตั้งค่าซึ่งเป็นกรณีพิเศษเนื่องจากสตรีมไบต์ที่ใช้โดยวิธีการเหล่านี้มีสมมติฐานโดยนัยของหน้ารหัสเดียวที่รู้จัก (ASCII)
นอกจากนี้ไดรเวอร์ JDBC ยังให้คุณสมบัติการเชื่อมต่อสตริง SendStringParametersAnicode คุณสมบัตินี้สามารถใช้เพื่อระบุพารามิเตอร์ที่กำหนดไว้ล่วงหน้าสำหรับข้อมูลอักขระที่ส่งเป็น ASCII แทน Unicode
ในการปรับปรุงประสิทธิภาพพารามิเตอร์สตริงสามารถส่งผ่านไปยัง SQL Server ในรูปแบบที่ไม่ใช่ Unicode โดยการตั้งค่าคุณสมบัติการเชื่อมต่อ SendStringParametersAnicode String การตั้งค่าเริ่มต้นของ SendStringParametersasUnicode คือ "จริง" ซึ่งหมายความว่าพารามิเตอร์สตริงจะถูกส่งเป็น Unicode
หาก SendStringParametersasUnicode ถูกตั้งค่าเป็น "เท็จ" พารามิเตอร์สตริงทั้งหมดในการเชื่อมต่อจะถูกส่งไปยังเซิร์ฟเวอร์โดยใช้การเรียงข้อมูลเริ่มต้นฐานข้อมูล
อ้างถึง:
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