การใช้ CONTAINS บนมุมมองใน SQL Server 2008 R2

ฉันได้กำหนดดัชนีข้อความแบบเต็มไว้ในตารางแล้ว ดังนั้นแบบสอบถามต่อไปนี้จึงใช้งานได้ดี:

SELECT Field FROM MyTable WHERE CONTAINS(Field, 'text') 

นอกจากนี้ยังมีมุมมอง ดั้งเดิม เหนือตารางดังต่อไปนี้:

CREATE VIEW MyView AS SELECT * FROM MyTable

เป็นไปได้ไหมที่จะเรียกใช้แบบสอบถามกับมุมมองโดยไม่สร้างใหม่ตามที่ได้รับการจัดทำดัชนี?

SELECT Field FROM MyView WHERE CONTAINS(Field, 'text') 

ฉันได้รับ Cannot use a CONTAINS or FREETEXT predicate on table or indexed view 'MyView' because it is not full-text indexed ซึ่งดูแปลกสำหรับฉัน เนื่องจากสิ่งนี้เอาชนะวัตถุประสงค์ของมุมมองในการสืบค้นนามธรรม และไม่ใช่วิธีการทำงานของดัชนีปกติเช่นกัน


person Herman Kan    schedule 27.04.2017    source แหล่งที่มา


คำตอบ (2)


สร้างดัชนีข้อความแบบเต็มบนตารางหรือมุมมองที่จัดทำดัชนีในฐานข้อมูลใน SQL Server อนุญาตให้ใช้ดัชนีข้อความแบบเต็มเพียงรายการเดียวต่อตารางหรือมุมมองที่จัดทำดัชนี และดัชนีข้อความแบบเต็มแต่ละรายการจะนำไปใช้กับตารางเดียวหรือมุมมองที่จัดทำดัชนีไว้

ลิงค์ด้านล่างจะเป็นประโยชน์ https://docs.microsoft.com/en-us/sql/t-sql/statements/create-fulltext-index-transact-sql

person Vivek    schedule 27.04.2017
comment
คุณพลาดประเด็น ฉันสร้าง FTI ไว้บนโต๊ะแล้ว แต่ปัญหาคือใช้ไม่ได้เมื่อฉันสืบค้นมุมมองบนตารางนั้น - person Herman Kan; 27.04.2017

CREATE VIEW MyView AS SELECT * FROM MyTable

SELECT Field FROM MyView WHERE CONTAINS(Field, 'text') 

วิธี :

SELECT Field FROM (SELECT * FROM MyTable) WHERE CONTAINS(Field, 'text') 

"SELECT * FROM MyTable" จะถูกประเมินก่อน และใช้โดยไม่มีดัชนีใดๆ ที่มีคำขอหลัก... ไม่สามารถทำงาน "ตามที่เป็น"

คุณควรพิจารณาใช้ขั้นตอนการจัดเก็บที่ส่งคืนชุดบันทึกที่ต้องการ (ส่งผ่านตัวกรองเป็นอาร์กิวเมนต์)

หมายเหตุ : มุมมองสามารถเรียกขั้นตอนการจัดเก็บได้โดยใช้คำสั่ง openquery หรือ openrowset

person Stéphane CLEMENT    schedule 27.04.2017
comment
ใช่ ผู้ต้องสงสัยหลักของฉันคือมุมมองที่ได้รับการแก้ไขเป็นแบบสอบถามย่อย อย่างไรก็ตาม ขึ้นอยู่กับ ตัวอย่าง ฉันจะบอกว่ามันแค่ขยายมุมมองแบบอินไลน์: SELECT Field FROM MyTable... - person Herman Kan; 28.04.2017