คำถามติดแท็ก filtered-index

5
วิธีสร้างดัชนีตามเงื่อนไขใน MySQL
จะสร้างดัชนีเพื่อกรองช่วงหรือเซตย่อยของตารางใน MySQL ได้อย่างไร? AFAIK เป็นไปไม่ได้ที่จะสร้างโดยตรง แต่ฉันคิดว่ามันเป็นไปได้ที่จะจำลองคุณลักษณะนี้ ตัวอย่าง: ฉันต้องการสร้างดัชนีสำหรับNAMEคอลัมน์สำหรับแถวด้วยSTATUS = 'ACTIVE' ฟังก์ชันนี้จะเรียกว่าดัชนีที่กรองแล้วใน SQL Server และดัชนีบางส่วนใน Postgres

5
ไม่สามารถสร้างดัชนีที่กรองแล้วในคอลัมน์จากการคำนวณ
ในคำถามก่อนหน้านี้ของฉันเป็นความคิดที่ดีหรือไม่ที่จะปิดใช้งานการเลื่อนระดับล็อคในขณะที่เพิ่มคอลัมน์จากการคำนวณใหม่ลงในตาราง ฉันกำลังสร้างคอลัมน์จากการคำนวณ: ALTER TABLE dbo.tblBGiftVoucherItem ADD isUsGift AS CAST ( ISNULL( CASE WHEN sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%' THEN 1 ELSE 0 END , 0) AS BIT ) PERSISTED; คอลัมน์จากการคำนวณคือPERSISTEDและตามcomputed_column_definition (Transact-SQL) : ยืนกราน ระบุว่า Database Engine จะจัดเก็บค่าที่คำนวณในร่างกายและอัพเดตค่าเมื่อคอลัมน์อื่น ๆ ที่คอลัมน์ที่คำนวณขึ้นอยู่นั้นถูกอัพเดต การทำเครื่องหมายคอลัมน์ที่คำนวณเป็น PERSISTED อนุญาตให้สร้างดัชนีบนคอลัมน์ที่คำนวณได้ซึ่งกำหนดไว้ แต่ไม่แม่นยำ สำหรับข้อมูลเพิ่มเติมดูดัชนีในคอลัมน์ที่คำนวณ …

2
ทำไมดัชนีที่ถูกกรองในค่า IS NULL ไม่ถูกใช้
สมมติว่าเรามีคำจำกัดความของตารางดังนี้: CREATE TABLE MyTab ( ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY ,GroupByColumn NVARCHAR(10) NOT NULL ,WhereColumn DATETIME NULL ) และดัชนีที่ไม่ได้ทำคลัสเตอร์ที่กรองแล้วเช่นนี้: CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab (GroupByColumn) WHERE (WhereColumn IS NULL) เหตุใดดัชนีนี้จึงไม่ "ครอบคลุม" สำหรับคำค้นหานี้: SELECT GroupByColumn ,COUNT(*) FROM MyTab WHERE WhereColumn IS NULL GROUP BY GroupByColumn ฉันได้รับแผนปฏิบัติการนี้แล้ว: KeyLookup ใช้สำหรับกริยาที่ …

1
เหตุใดผู้ดำเนินการรวมจึงใช้หลังจากการสแกนดัชนีที่ไม่ซ้ำ
ฉันมีตารางที่มีดัชนีที่ไม่ซ้ำซึ่งกรองแล้วสำหรับค่าที่ไม่เป็นโมฆะ ในแผนแบบสอบถามมีการใช้งานที่แตกต่างกัน มีเหตุผลสำหรับสิ่งนี้หรือไม่? USE tempdb CREATE TABLE T1( Id INT NOT NULL IDENTITY PRIMARY KEY ,F1 INT , F2 INT ) go CREATE UNIQUE NONCLUSTERED INDEX UK_T1 ON T1 (F1,F2) WHERE F1 IS NOT NULL AND F2 IS NOT NULL GO INSERT INTO T1(f1,F2) VALUES(1,1),(1,2),(2,1) SELECT DISTINCT F1,F2 FROM T1 …

3
ปรับปรุงประสิทธิภาพของการสืบค้นโดยใช้ IN ()
ฉันมีแบบสอบถาม SQL ต่อไปนี้: SELECT Event.ID, Event.IATA, Device.Name, EventType.Description, Event.Data1, Event.Data2 Event.PLCTimeStamp, Event.EventTypeID FROM Event INNER JOIN EventType ON EventType.ID = Event.EventTypeID INNER JOIN Device ON Device.ID = Event.DeviceID WHERE Event.EventTypeID IN (3, 30, 40, 41, 42, 46, 49, 50) AND Event.PLCTimeStamp BETWEEN '2011-01-28' AND '2011-01-29' AND Event.IATA LIKE '%0005836217%' ORDER …

3
ใช้ฟังก์ชั่น“ LEN” ในข้อ“ WHERE” ใน“ CREATE UNIQUE INDEX”
ฉันมีตารางนี้: CREATE TABLE Table01 (column01 nvarchar(100)); และฉันต้องการสร้างดัชนีที่ไม่ซ้ำในคอลัมน์ 01ด้วยเงื่อนไขนี้LEN (คอลัมน์ 01)> = 5 ฉันเหนื่อย: CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE LEN(column01) >= 5; ฉันได้: ส่วนคำสั่ง WHERE ของดัชนีที่กรองไม่ถูกต้อง 'UIX_01' บนโต๊ะ 'Table01' และ: ALTER TABLE Table01 ADD column01_length AS (LEN(column01)); CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE column01_length >= 5; ผลิต: ไม่สามารถสร้างดัชนีที่กรอง …

3
คอลัมน์ที่รวมกับดัชนีที่กรอง
ขณะนี้เราทำงานกับตารางชื่อtb_tranfers ตารางนี้มี 40 ล้านแถวและมีขนาด ~ 26 GB (ข้อมูล 11 GB, ดัชนี 15 GB) 10 ถึง 15% ของแถวเป็นแถวที่ถูกลบแบบอ่อน ( DeletedDateไม่ใช่ค่าว่าง) แอปพลิเคชันใช้เฉพาะแถวที่DeletedDateเป็นโมฆะ แบบสอบถามทั้งหมดในตารางนี้จะมีส่วนคำสั่งที่มีผล มี 15 ดัชนีในตารางนี้ ดัชนี DMV ที่ขาดหายไปมีคำแนะนำในการสร้างดัชนีด้วยDeletedDateเป็นคอลัมน์ที่รวมอยู่ จะเป็นประโยชน์หรือไม่ที่จะใช้ดัชนีที่กรองแล้วในดัชนีWHERE DeleteDdate IS NULLที่ไม่ได้กล่าวถึงทั้ง 11 ดัชนี หรือมันจะดีกว่าที่จะมีคอลัมน์DeletedDateเป็นคอลัมน์ที่รวมหรือไม่

3
ดัชนีที่กรองจะใช้ก็ต่อเมื่อส่วนที่กรองอยู่ใน JOIN ไม่ใช่ WHERE
ฉันได้สร้างดัชนีที่กรองแล้วด้านล่าง แต่เมื่อฉันเรียกใช้ 2 คิวรีเพิ่มเติมลงดัชนีนี้จะถูกใช้สำหรับการค้นหาในตัวอย่างแรกที่มี END_DTTM ใน JOIN มากกว่าข้อที่ (นั่นคือข้อแตกต่างในแบบสอบถามเท่านั้น) . ใครช่วยอธิบายได้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น การสร้างดัชนี CREATE NONCLUSTERED INDEX [ix_PATIENT_LIST_BESPOKE_LIST_ID_includes] ON [dbo].[PATIENT_LIST_BESPOKE] ( [LIST_ID] ASC, [END_DTTM] ASC ) WHERE ([END_DTTM] IS NULL) แบบสอบถาม DECLARE @LIST_ID INT = 3655 --This one seeks on the index SELECT PATIENT_LISTS.LIST_ID FROM DBO.PATIENT_LISTS LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = …

2
ผลของการแทนที่ดัชนีด้วยดัชนีที่กรองแล้ว (ไม่ใช่ค่า null) คืออะไร?
โครงการของเราดำเนินงานฐานข้อมูลขนาดใหญ่และซับซ้อนมาก ประมาณหนึ่งเดือนที่แล้วเราสังเกตว่าช่องว่างที่ใช้โดยคอลัมน์ที่มีดัชนีซึ่งมีค่า Null มีขนาดใหญ่เกินไป เพื่อตอบสนองต่อสิ่งนั้นฉันเขียนเป็นสคริปต์ที่จะค้นหาดัชนีคอลัมน์เดี่ยวแบบไดนามิกทั้งหมดที่มีค่า Null มากกว่า 1% จากนั้นปล่อยและสร้างดัชนีเหล่านั้นใหม่เป็นดัชนีที่กรองตามเงื่อนไขที่ค่านั้นไม่ใช่ค่า NULL สิ่งนี้จะดรอปและสร้างดัชนีหลายร้อยรายการใหม่ตลอดทั้งฐานข้อมูลและเพิ่มพื้นที่ว่างเกือบ 15% ของฐานข้อมูลทั้งหมดที่ใช้ ตอนนี้ฉันมีคำถามสองข้อเกี่ยวกับเรื่องนี้: A) ข้อเสียของการใช้ดัชนีที่ถูกกรองในแบบนี้คืออะไร? ฉันจะสมมติว่ามันจะปรับปรุงประสิทธิภาพเท่านั้น แต่มีความเสี่ยงด้านประสิทธิภาพหรือไม่? B) เราได้รับข้อผิดพลาด ( 'ไม่สามารถวางดัชนี XYZ ได้เนื่องจากไม่มีอยู่หรือคุณไม่ได้รับอนุญาต' ) ในการทำดัชนีหล่นและสร้างดัชนีใหม่แม้ว่าจะได้รับการตรวจสอบแล้วก็ตามทุกอย่างเป็นไปตามที่คาดไว้ สิ่งนี้จะเกิดขึ้นได้อย่างไร? ขอบคุณสำหรับความช่วยเหลือใด ๆ ! แก้ไข:เพื่อตอบสนองต่อ @Thomas Kejser สวัสดีและขอบคุณ แต่ปรากฎว่านี่เป็นหายนะ ในเวลานั้นเราไม่เข้าใจหลายสิ่งเช่น: ระหว่างการสืบค้น SQLOS จัดทำแผนดัชนีก่อนที่จะพิจารณาว่าไม่สามารถใช้ค่า NULL สำหรับการเข้าร่วมคอลัมน์ตาราง IE คุณจำเป็นต้องมีตัวกรองคำสั่งย่อย WHERE ที่เหมาะสมสำหรับดัชนีแต่ละตัวกรองที่ใช้ในแบบสอบถามมิฉะนั้นดัชนีจะไม่ถูกใช้เลย การวางและสร้างดัชนีและอัปเดตสถิติของพวกเขาซ้ำซ้อนอีกครั้งหลังจากนั้นอาจยังไม่เพียงพอที่จะสร้างแผนที่อัปเดตซึ่งเราคิดว่าพวกเขาจะทำ มันปรากฏขึ้นในบางกรณีเพียงปริมาณงานที่มากพอที่จะบังคับให้ SQL Server ประเมินแผนอีกครั้ง …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.