คำตอบของ sp_BlitzErik นั้นได้คะแนนมาก แต่ฉันไม่คิดว่านั่นเป็นสาเหตุที่คุณไม่ควรใช้การค้นหาข้อความแบบเต็ม การค้นหาข้อความแบบเต็มไม่ได้ทำในสิ่งที่คุณคิด มันไม่ได้อยู่ที่นั่นเพื่อค้นหาหลายช่อง มันมีการทำให้เนื้อหาของคำเป็น vectorize และใช้ประโยชน์จากพจนานุกรม, stubbing, lexers, gazetteers, การกำจัดคำแบบหยุดและเทคนิคอื่น ๆ หรือยังไม่ได้แสดงให้เห็นว่ามีผลบังคับใช้
ฉันไม่เห็นด้วยกับวิธีแก้ปัญหาเช่นกัน แต่ฉันไม่แน่ใจว่าจะทำสิ่งนี้ได้ดีขึ้นใน SQL Server มาสร้างข้อมูลของเขาสำหรับ PostgreSQL กันเถอะ - มันก็ดีกว่าที่สร้างใน PostgreSQL ด้วย
CREATE TABLE fulltextindexesarestupid
AS
SELECT
id,
CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END AS StopAbusingFeatures
FROM generate_series(1,1000000) AS id;
ตอนนี้สิ่งที่คุณต้องการคือประเภท enum
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
ตอนนี้คุณได้ยุบสตริงเป็นตัวแทนจำนวนเต็ม แต่ยิ่งดีกว่าคุณสามารถสอบถามพวกเขาเหมือนก่อน
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
สิ่งนี้มีผลกระทบ
- ปกปิดความจริงที่ว่าคุณเป็นประเภทที่ระบุ ความซับซ้อนนั้นถูกห่อหุ้มในประเภทและซ่อนจากผู้ใช้
- มันยังทำการบำรุงรักษาในประเภทเหล่านั้นในประเภท
- มันเป็นมาตรฐาน
- มันไม่ได้ขยายขนาดแถว
คุณจะพยายามเพิ่มประสิทธิภาพการเปรียบเทียบสตริง แต่อนิจจาฉันไม่แน่ใจด้วยซ้ำว่า sp_BlitzErik จะได้รับคำตอบที่ได้รับจากรหัสในข้อเสนอแนะอย่างไร
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
คุณสามารถยุบโทเค็นลงไปเป็นจำนวนเต็มโดยใช้ enum หรือวิธีการหมุนด้วยมือที่แนะนำโดย sp_BlitzErik แต่ถ้าคุณสามารถทำการยุบได้เพราะเหตุใดคุณถึงทำเช่นเดียวกัน คือถ้าคุณรู้ว่า '% pasta%' เป็นโทเค็น 'พาสต้า' ทำไมคุณถึงมี%
ทั้งสองด้าน หากไม่มี '%' นี่เป็นการตรวจสอบความเท่าเทียมกันและควรจะรวดเร็วเหมือนข้อความ