คำว่า "SARGable" หมายถึงอะไรจริง ๆ ?


23

ผู้ใช้ SQL Server ใช้คำว่า "sargable" ฉันสงสัยว่ามีคำนิยามตลอดกาลที่ไม่เชื่อเรื่องการใช้งานจริงหรือไม่สำหรับ "sargable"

ตัวอย่างเช่นWHERE foo LIKE '%bar%'มีการกล่าวโดยหลาย ๆ คนว่าจะไม่สามารถขายสินค้าได้แต่ RDBMS บางตัวสามารถใช้ดัชนีกับแบบสอบถามดังกล่าวได้ ถ้าเช่นนั้นแล้ว"ไม่ยอมแพ้"หมายถึงอะไร

การอ้างอิงอื่น ๆ


5
คุณอาจต้องการชี้ให้เห็นว่าคำถามของคุณไม่เกี่ยวกับ SQL Server แต่เกี่ยวข้องกับคำว่า " sargable " แทน คำถามของคุณอ้างอิงถึง SQL Server เท่านั้นเนื่องจากไม่สามารถจัดการเพรดิเคตการค้นหา "% wordhere%" ได้ในขณะที่ RDBMS อื่นเห็นได้ชัด
John aka hot2use

คำตอบ:


31

คำว่า "sargable" เปิดตัวครั้งแรกโดย P. Griffiths Selinger และคณะ ในของพวกเขา 1979 กระดาษ "การเข้าถึงการเลือกเส้นทางในฐานข้อมูลเชิงสัมพันธ์ระบบการจัดการ" ตีพิมพ์โดย ACM สำหรับสมาชิกที่ไม่ได้เป็นสมาชิก ACM มีสำเนาของเอกสารนั้นที่http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf

คำที่กำหนดไว้ในวรรคนี้:

ทั้งการสแกนดัชนีและเซ็กเมนต์1อาจเลือกชุดของเพรดิเคตที่เรียกว่าอาร์กิวเมนต์การค้นหา (หรือ SARGS) ซึ่งใช้กับ tuple ก่อนที่จะถูกส่งกลับไปยังผู้โทรRSI 2 หาก tuple ตรงตามเพรดิเคตมันจะถูกส่งคืน มิฉะนั้นการสแกนจะดำเนินต่อไปจนกว่าจะพบ tuple ที่ตรงกับ SARGS หรือทำให้เซกเมนต์หมดหรือช่วงค่าดัชนีที่ระบุ สิ่งนี้จะช่วยลดค่าใช้จ่ายโดยการกำจัดค่าใช้จ่ายในการโทร RSI สำหรับสิ่งอันดับที่สามารถปฏิเสธได้อย่างมีประสิทธิภาพภายใน RSS เพรดิเคตบางตัวเท่านั้นที่อยู่ในรูปแบบที่สามารถกลายเป็น SARGS กริยา sargableเป็นหนึ่งในรูปแบบ (หรือที่สามารถใส่ลงในแบบฟอร์ม) คอลัมน์ "ค่าเปรียบเทียบประกอบการ" SARGS แสดงเป็นนิพจน์บูลีนของเพรดิเคตดังกล่าวในรูปแบบปกติที่ไม่ต่อเนื่อง

กล่าวอีกนัยหนึ่งคำกริยา sargable นั้นสามารถแก้ไขได้โดยเอ็นจิ้นการจัดเก็บ (วิธีการเข้าถึง) โดยการสังเกตตารางหรือเรคคอร์ดดัชนีโดยตรง เพรดิเคตที่ไม่สามารถโต้แย้งได้ในทางกลับกันต้องการระดับสูงขึ้นของ DBMS เพื่อดำเนินการ ตัวอย่างเช่นผลลัพธ์ของWHERE lastname = 'Doe'เครื่องมือจัดเก็บข้อมูลสามารถตัดสินใจได้โดยเพียงแค่ดูเนื้อหาของเขตข้อมูลlastnameของแต่ละระเบียน ในทางกลับกันWHERE UPPER(lastname) = 'DOE'จำเป็นต้องมีการเรียกใช้ฟังก์ชันโดยเอ็นจิน SQL ซึ่งหมายความว่าเอ็นจินการจัดเก็บจะต้องส่งคืนแถวทั้งหมดที่อ่าน (หากตรงกับที่เป็นไปได้อื่น ๆ เพรดิเคตเพรดิเคต) กลับไปยังโปรแกรม SQL สำหรับการประเมินผล .

คุณสามารถดูได้จากคำจำกัดความดั้งเดิมที่เพรดิเคต sargable สามารถนำไปใช้กับการสแกนดัชนี แต่ยังสแกนตาราง (เซ็กเมนต์ในคำศัพท์ระบบ R) ด้วยตราบใดที่ตรงตามเงื่อนไข "คอลัมน์การเปรียบเทียบตัวดำเนินการค่า" จึงเป็นไปได้ ประเมินโดยเอ็นจิ้นการจัดเก็บ นี่เป็นกรณีของ Db2 ซึ่งเป็นทายาทของ System R ในหลาย ๆ ด้าน :

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

เพรดิเคต sargable ข้อมูลเป็นเพรดิเคตที่ไม่สามารถประเมินได้โดยตัวจัดการดัชนี แต่สามารถประเมินได้โดย Data Management Services (DMS) โดยทั่วไปเพรดิเคตเหล่านี้ต้องการการเข้าถึงของแต่ละแถวจากตารางฐาน หากจำเป็น DMS จะดึงข้อมูลคอลัมน์ที่จำเป็นในการประเมินภาคแสดง

ข้อเท็จจริงที่ว่าใน SQL Server-speak predicates ที่พูดได้ของ SQL Server นั้นเป็นเพียงสิ่งที่สามารถแก้ไขได้โดยใช้การค้นหาดัชนีอาจถูกกำหนดโดยความสามารถของเอ็นจิ้นการจัดเก็บที่ไม่สามารถใช้เพรดิเคตดังกล่าวในระหว่างการสแกนตาราง

เพรดิเคต Sargable และ non-sargable บางครั้งจะอธิบายว่า "เพรดิเคต 1" และ "สเตจ 2" ตามลำดับ (นี่ยังมาจากคำศัพท์ Db2 ) ภาคที่ 1 สามารถประเมินได้ที่ระดับต่ำสุดของการประมวลผลแบบสอบถามในขณะที่อ่านตารางหรือบันทึกดัชนี แถวที่ตรงกับเงื่อนไขระดับ 1 หากมีจะถูกส่งไปยังระดับถัดไประดับ 2 ของการประเมิน


1 - เซกเมนต์ใน System R คือหน่วยเก็บฟิสิคัลของ tuples ของตาราง การสแกนเซ็กเมนต์นั้นค่อนข้างเทียบเท่ากับการสแกนตารางใน DBMS อื่น ๆ

2 - RSI - อินเทอร์เฟซRSS 3ซึ่งเป็นอินเทอร์เฟซการสืบค้นแบบทูเพิล ฟังก์ชั่นอินเทอร์เฟซที่เกี่ยวข้องกับการสนทนานี้คือ NEXT ซึ่งจะส่งกลับเพรดิเคตการจับคู่แถวถัดไปที่แสดง

3 - RSS หรือ Research Storage System ระบบย่อยหน่วยเก็บข้อมูลของ System R


"สังเกตตารางหรือดัชนีบันทึกโดยตรง"หมายความว่าอย่างไร ฉันหมายถึง= UPPER()การเรียกใช้ฟังก์ชัน แต่memcmpโดยตัวมันเอง มันจะค่อนข้างง่ายในการเขียนmemcmpที่ถือว่า ASCII และไม่สนใจกรณี (เพียงดูที่ตอดที่สอง) นั่นทำให้ SARGABLE สำเร็จหรือไม่? ดูตัวอย่างของ @ Ypercube, dba.stackexchange.com/questions/162263/…
Evan Carroll

4
@EvanCarroll หมายถึงการดูตารางหรือเรคคอร์ดดัชนีโดยตรงโดยไม่ต้องขอความช่วยเหลือไปยังฟังก์ชั่นฐานข้อมูลที่นำไปใช้นอกเอ็นจิ้นการจัดเก็บ (เช่นภายในเคียวรีตัวประมวลผล / เอ็นจินการประมวลผล ในตัวอย่างของ ypercube เคียวรีจะถูกประมวลผลล่วงหน้าโดยตัววางแผน / เครื่องมือเพิ่มประสิทธิภาพเพื่อให้การค้นหาที่ไม่ใช่ SARGable แสดงอยู่ในคำ SARGable
พอลไวท์พูดว่า GoFundMonica

อะไร"มองที่โต๊ะหรือดัชนีบันทึกโดยตรง"หมายความว่าอย่างไร ฉันไม่แน่ใจว่าวิธีการอธิบายว่า"การสังเกตตารางหรือดัชนีบันทึกโดยตรง" คือx=0SARGable? สิ่งที่เกี่ยวกับ-0 = +0, ' ' = ''หรือความเสมอภาคเชิงพื้นที่? อะไรจะเป็นตัวอย่างของบางสิ่งที่ SARGable แน่นอน? เมื่อคุณพูดว่า"ไม่มีการขอความช่วยเหลือไปยังฟังก์ชั่นฐานข้อมูลที่นำไปใช้นอกเครื่องมือจัดเก็บข้อมูล"คุณจะรวมอยู่ในตัวอย่างของ Ypercube DATE()ซึ่งรวมอยู่ในเอ็นจิ้นการจัดเก็บ ทำไม SARGable นั้นถึงไม่ได้ทำด้วยตัวเอง?
Evan Carroll

2
@EvanCarroll ใช้เวลาสักครู่เพื่ออ่านเอกสารอ้างอิงและอาจทำตามคำตอบนี้อีกครั้งหลังจากนั้น หากคุณยังมีคำถามที่น่าสนใจในหัวข้อนี้คุณสามารถถามพวกเขาได้ หมายเหตุในการส่งผ่านที่DATE()ไม่ใช่ฟังก์ชันจริง (SQL Server) แต่ (ฉันสันนิษฐานว่า) ชวเลขย่อของ Mr. Cube สำหรับการแปลงชนิด นอกจากนี้เรายังสามารถพูดคุยเรื่องนี้ในการแชทหากคุณต้องการ
พอลไวท์พูดว่า GoFundMonica

18

สำหรับฉัน SARGable หมายความว่า SQL Server สามารถทำดัชนีการค้นหาโดยใช้ภาคการค้นหาของคุณ

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


ฉันจะขยายไปสู่การกำจัดพาร์ทิชันเช่นกัน
ดาวิดדודו Markovitz

9

ตามPro SQL Server Internalsโดย Dmitri Korotkevitch :

กริยาการค้นหา ARLEGLE ABLE เป็นสิ่งที่ SQL Server สามารถใช้การดำเนินการค้นหาดัชนีได้หากมีดัชนีอยู่

เพรดิเคต SARGable เป็นหนึ่งที่เซิร์ฟเวอร์ SQL สามารถแยกค่าเดียวหรือช่วงของค่าคีย์ดัชนีในการประมวลผล

ภาค SARGable รวมถึงผู้ประกอบการดังต่อไปนี้: =, >, >=, <, <=, IN, BETWEENและLIKE( ในกรณีของการจับคู่คำนำหน้า )

ผู้ประกอบการที่ไม่ใช่ SARGable รวมถึง: NOT, NOT IN, <>และLIKE( ไม่ตรงกับคำนำหน้า ) เช่นเดียวกับการใช้ฟังก์ชั่นหรือการคำนวณกับตารางและแปลงชนิดที่ประเภทข้อมูลไม่ปฏิบัติตามดัชนีที่สร้างขึ้น

ตัวอย่าง :

WHERE name like 'SARGable%'
WHERE name like '%non-SARGable%'

ตัวอย่าง :

DROP TABLE dbo.Testing;
GO

CREATE TABLE Testing (
    WeirdDatatype   int NOT NULL,
    SomethingElse   char(200)
);

CREATE NONCLUSTERED INDEX IDX_ALWAYS_SARGable
    ON dbo.Testing( SomethingElse);

CREATE NONCLUSTERED INDEX IDX_NOT_ALWAYS_SARGable
    ON dbo.Testing(SomethingElse);

INSERT INTO dbo.Testing
        ( WeirdDatatype, SomethingElse )
SELECT TOP 1000 m.message_id, CONVERT(char(200), m.text)
FROM sys.messages AS m;

ตอนนี้เรารัน:

SELECT *
FROM dbo.Testing AS t
WHERE  t.WeirdDatatype = 1001;
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE 'Line%'
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE '%Line%'
     AND t.WeirdDatatype = 1001;

ผลลัพธ์ที่ได้คือ:

[1]

ลองดูคุณสมบัติของแบบสอบถาม SARGable (ดัชนีค้นหา)

ป้อนคำอธิบายรูปภาพที่นี่

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

ตอนนี้แบบสอบถามที่ไม่ใช่ SARGable:

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถเห็นการเริ่มต้นของเพรดิเคต '% non .. %' ไม่อนุญาตให้เคียวรีเครื่องมือเพิ่มประสิทธิภาพ DEFINE เริ่มต้นและสิ้นสุดหรือช่วงในดัชนี ตอนนี้จะต้องค้นหาทั้งตาราง (สแกน)


ดังนั้นอีกครั้งหากมีการสร้างดัชนีในภายหลังซึ่งรองรับสิ่งWHERE name like '%non-SARGable%'นั้นจะทำให้เงื่อนไขสามารถระบุได้หรือไม่? และถ้าเป็นเช่นนั้นเราไม่ได้พูดถึงข้อเสียเปรียบการใช้งานเฉพาะ? IE, เราไม่ควรพูดว่า "ไม่สามารถขายได้เร็วเท่า SQL Server 2016"
Evan Carroll

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

2
แน่นอนมันใช้งานเฉพาะ WHERE DATE(datetime_column) = '2001-01-01'ตัวอย่างเช่น "sargable" (จะค้นหาดัชนี) ใน SQL Server เวอร์ชั่นใหม่กว่า (2008+ ฉันคิดว่า) แต่ไม่ใช่ในรุ่นเก่ากว่า
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.