เพิ่มประสิทธิภาพของแบบสอบถามแบบเต็มใน SQL Server

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 2549443 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

สรุป

บทความนี้อธิบายวิธีการที่จะปรับปรุงประสิทธิภาพของแบบสอบถาม Microsoft SQL Server ที่ใช้เพรดิเคตการค้นหาแบบเต็ม (เช่นมีและCONTAINSTABLE) และที่กรองข้อมูล ตัวอย่าง วิธีการนี้เพิ่มประสิทธิภาพของแบบสอบถามต่อไปนี้:
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
วิธีนี้ช่วยให้คุณสามารถออกแบบแบบสอบถาม schema ของตาราง และข้อความแบบเต็มดัชนีในวิธีที่โปรแกรมค้นหาแบบเต็มหน่วยกรองหาผลลัพธ์ก่อนที่จะส่งไปโปรแกรมที่เกี่ยวข้อง ดังนั้น โปรแกรมเกี่ยวข้องไม่มีการกรองการชุดข้อมูลขนาดใหญ่

ข้อมูลเพิ่มเติม

ถ้าคุณค้นหาแบบเต็ม ปัจจัยหลักว่า ผลกับประสิทธิภาพการทำงานของแบบสอบถามคือ ปริมาณของข้อมูลที่ต้องการประมวลผลโปรแกรมค้นหาแบบเต็มหน่วยก่อนเหลือ คือการส่งข้อมูลไปยังโปรแกรมเกี่ยวข้อง ใน SQL Server คุณสามารถปรับปรุงประสิทธิภาพการทำงานของแบบสอบถาม โดยการกรองแถวก่อนเวลาเพื่อลดจำนวนของแถวที่ต้องประมวลผลในภายหลัง

ในรุ่นของ SQL Server ที่ถูกนำออกใช้ก่อนที่จะ SQL Server 2008 โปรแกรมค้นหาแบบเต็มส่งกลับแถวทั้งหมดที่ตรงกับคำที่ค้นหา และจากนั้น โปรแกรมเชิงการใช้ตัวกรองใด ๆ การปรับปรุงลักษณะการทำงานนี้เกิดขึ้นได้ ใน SQL Server 2008 ใน SQL Server 2008 R2 และ 2012 ของเซิร์ฟเวอร์ SQL อย่างไรก็ตาม จึงยากที่จะใช้การปรับปรุงเหล่านี้ได้เนื่องจากมีการจัดระเบียบดัชนีการค้นหาแบบเต็มมากแตกต่างจากดัชนีของฐานข้อมูล นอกจากนี้ โปรแกรมค้นหาแบบเต็มหน่วยและโปรแกรมเชิงการทำงานแตกต่างกันมาก ดังนั้น วิธีการที่อธิบายในบทความนี้ใช้ฟังก์ชัน Table-Valued (TVF) เพื่อกรองข้อมูลแถวแรกสุด และ เพื่อลดจำนวนของแถวที่ต้องประมวลผลในภายหลัง

ตัวอย่างเช่น แผนการสอบถามต่อไปนี้ส่งกลับแถว 131051 ที่ตรงกับสตริงการค้นหามี นอกจากนี้ การดำเนินการการรวมในแผนการทำกรองเพิ่มเติม โดยใช้การค้นหาค่าของดัชนี
Rows StmtText 
-------------------- -----------------------------------------------------------------------------------------------------------
1167 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate> '08/05/2019' 

1167 |--Merge Join(Left Semi Join, MERGE:([FTSdb].[dbo].[fttest].[ID])=(FulltextMatch.[docid]), RESIDUA
5858 |--Sort(ORDER BY:([FTSdb].[dbo].[fttest].[ID] ASC)) 
5858 | |--Clustered Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[clidx1]), SEEK:([FTSdb].[
131051 |--Table-valued function 
อย่างไรก็ตาม ถ้าแบบสอบถามประกอบด้วยคอลัมน์คีย์ดัชนีที่ไม่ซ้ำของข้อความแบบเต็มเป็นเพรดิเคต โปรแกรมค้นหาแบบเต็มสามารถใช้เพรดิเคตที่เพื่อกรองผลลัพธ์ในระดับข้อความเต็ม ในสถานการณ์นี้ TVF ส่งกลับจำนวนเล็กน้อยของข้อมูลก่อนที่การกรองเพิ่มเติมต้องถูกประยุกต์ใช้ ตัวอย่างเช่น แบบสอบถามต่อไปนี้ระบุค่าห้าที่ต้องตรงกับเงื่อนไข c2 และ TVF ส่งกลับเฉพาะผลลัพธ์ที่ตรงกับค่าห้า:
Rows StmtText 

-------- ---------------------------------------------------------------------------------------------------------------------------------
5 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate > '08/05/2019' and ID in ( 654051, 644051, 649106, 465, 105)

5 |--Nested Loops(Left Semi Join, OUTER REFERENCES:([FTSdb].[dbo].[fttest].[ID])) 
5 |--Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[idx1]), SEEK:([FTSdb].[dbo].[fttest].[ID]=(105) OR ...
5 |--Table-valued function
ความสามารถในการโปรแกรมการค้นหาแบบเต็มต้องกดค้างค่าที่ใช้งาน โดยคีย์ดัชนีที่ไม่ซ้ำเป็นข้อมูลพื้นฐานของวิธีการต่อไปนี้

ถ้าเพรดิเคตประกอบด้วยคอลัมน์ชนิดข้อมูล DateTime คุณสามารถใส่ข้อมูลวันที่ในคอลัมน์คีย์ดัชนีที่ไม่ซ้ำกันเพื่อให้มีการส่งออกเฉพาะแถวที่ตรงกับเพรดิเคตนี้ เมื่อต้องการทำเช่นนี้ คุณต้องรวบรวมข้อมูลวันที่ในคอลัมน์คีย์หลักตรรก อย่างไรก็ตาม คุณอาจต้องเปลี่ยนชนิดข้อมูลของคอลัมน์คีย์และโปรแกรมประยุกต์ที่ใช้แบบสอบถาม

เมื่อต้องการใช้วิธีการ ให้เปลี่ยนชนิดข้อมูลของการหาข้อความที่ไม่ซ้ำคีย์ ID เพื่อ BIGINT 4 ไบต์แรกของการจับภาพ ID คีย์ปี เดือน และค่าวันที่จากคอลัมน์วัน และ 4 ไบต์สุดท้ายเหมือนเดิม ตัวอย่างเช่น ไบต์แรกของคีย์ ID ไม่สามารถแสดงถึงปี ไบต์ถัดไปไม่สามารถอ้างอิงไปยังเดือน และเนื้อที่ 2 ไบต์สุดท้ายไม่สามารถแสดงถึงวัน แอพลิเคชันต้องให้เหมาะสมกับการเปลี่ยนแปลงชนิดข้อมูลนี้

เพรดิเคตของช่วงเพื่อเป็นเพรดิเคตในคีย์ที่แปลแล้ว รหัส ตัวอย่างเช่น "x<>< y"="" range="" predicate="" can="" be="" translated="" to="" the="" "(x*2^32="">< id="">< y*2^32)"="" predicate.="" because="" the="" translated="" predicate="" is="" a="" predicate="" on="" the="" full-text="" key,="" the="" predicate="" will="" be="" pushed="" down="" into="" the="" full-text="" streaming="" table-valued="" functions="" (stvf).="" this="" behavior="" effectively="" performs="" searches="" within="" the="" date="">

คุณสมบัติ

หมายเลขบทความ (Article ID): 2549443 - รีวิวครั้งสุดท้าย: 22 มีนาคม 2556 - Revision: 2.0
ใช้กับ
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Enterprise Evaluation
  • Microsoft SQL Server 2008 R2 Datacenter
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 R2 Enterprise
  • Microsoft SQL Server 2008 R2 Standard
  • Microsoft SQL Server 2012 Developer
  • Microsoft SQL Server 2012 Standard
  • Microsoft SQL Server 2012 Web
  • Microsoft SQL Server 2012 Enterprise
Keywords: 
kbmt KB2549443 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:2549443

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com