นี้เป็นความพยายามที่จะปรับปรุงรอบการทำงานสูงสุดเวอร์นอน ในการแก้ปัญหาของเขาเขาแนะนำให้ใช้ 2 ดัชนีในมุมมองและวัตถุสถิติ
ดัชนีที่ 1 คือคลัสเตอร์ซึ่งจำเป็นจริง ๆ แล้วเนื่องจากไม่เหมือนกับดัชนีที่ไม่ใช่คลัสเตอร์บนตารางข้อผิดพลาดจะถูกสร้างขึ้นหากการสร้างดัชนีที่ไม่ได้คลัสเตอร์บนมุมมองนั้นจะพยายามทำโดยไม่ต้องมีดัชนีคลัสเตอร์แรก
ดัชนีที่ 2 เป็นดัชนีที่ไม่เป็นคลัสเตอร์ซึ่งใช้เป็นดัชนีที่อยู่เบื้องหลังแบบสอบถาม ในส่วนความเห็นของคำตอบของเขาฉันถามว่าจะเกิดอะไรขึ้นถ้ามีการใช้ดัชนีแบบคลัสเตอร์แทนดัชนีแบบไม่รวมกลุ่ม
การวิเคราะห์ต่อไปนี้พยายามตอบคำถามนี้
ฉันใช้รหัสเดียวกันของเขายกเว้นว่าฉันไม่ได้สร้างดัชนีแบบ nonclustered ในมุมมอง
ฉันยังไม่ได้สร้างวัตถุสถิติ หากคุณกำลังติดตามและใช้ SQL Server Management Studio (SSMS) เพื่อป้อนรหัสด้านล่างคุณควรทราบว่าคุณอาจเห็นเส้นสีแดงบาง ๆ ซึ่งดูเหมือนว่ามีข้อผิดพลาด สิ่งเหล่านี้ (อาจ) ไม่ใช่ข้อผิดพลาด แต่เกี่ยวข้องกับปัญหาที่เกิดกับ Intellisense
คุณสามารถปิดใช้งาน Intellisense หรือเพียงแค่ละเว้นข้อผิดพลาดและเรียกใช้คำสั่ง ควรดำเนินการให้เสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด
-- Create the test table that uses a computed column.
USE tempdb;
CREATE TABLE dbo.PersistedViewTest
(
PersistedViewTest_ID INT NOT NULL
CONSTRAINT PK_PersistedViewTest
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, SomeData VARCHAR(2000) NOT NULL
, TestComputedColumn AS (PersistedViewTest_ID - 1) PERSISTED
);
GO
-- Insert some test data into the table.
INSERT INTO dbo.PersistedViewTest (SomeData)
SELECT o.name + o1.name + o2.name
FROM sys.objects o
CROSS JOIN sys.objects o1
CROSS JOIN sys.objects o2;
GO
แผนการดำเนินการต่อไปนี้ (ไม่มีมุมมอง / มุมมองดัชนี) ถูกสร้างขึ้นหลังจากเรียกใช้แบบสอบถามต่อไปนี้กับตาราง:
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest pv
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
สิ่งนี้จะให้พื้นฐานเพื่อเปรียบเทียบกับ โปรดสังเกตว่าหลังจากแบบสอบถามเสร็จสมบูรณ์วัตถุสถิติถูกสร้างขึ้น (_WA_Sys_00000003_1FCDBCEB) อ็อบเจ็กต์สถิติ PK_PersistedViewTest ถูกสร้างขึ้นเมื่อสร้างดัชนีตารางคลัสเตอร์
ถัดไปมุมมองที่กรองและดัชนีคลัสเตอร์ในมุมมองนั้นจะถูกสร้างขึ้น:
-- Create filtered view on the computed column.
CREATE VIEW dbo.PersistedViewTest_View
WITH SCHEMABINDING
AS
SELECT PersistedViewTest_ID, SomeData, TestComputedColumn
FROM dbo.PersistedViewTest
WHERE TestComputedColumn < CONVERT(INT, 27);
GO
-- Create unique clustered index to persist the values, including the computed column.
CREATE UNIQUE CLUSTERED INDEX IX_PersistedViewTest
ON dbo.PersistedViewTest_View(PersistedViewTest_ID);
GO
ตอนนี้ให้ลองเรียกใช้แบบสอบถามอีกครั้ง แต่ครั้งนี้เทียบกับมุมมอง:
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest_View pv
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
แผนการดำเนินการใหม่คือตอนนี้:
หากต้องเชื่อแผนใหม่หลังจากเพิ่มมุมมองและดัชนีคลัสเตอร์ในมุมมองนั้นสถิติจะปรากฏขึ้นเพื่อระบุว่าเวลาที่ต้องใช้ในการเรียกใช้แบบสอบถามได้เพิ่มขึ้นเป็นสองเท่า นอกจากนี้โปรดสังเกตว่าไม่มีการสร้างวัตถุสถิติใหม่เพื่อสนับสนุนดัชนีใหม่หลังจากเรียกใช้แบบสอบถามซึ่งแตกต่างจากแบบสอบถามในตาราง
แผนแบบสอบถามยังแนะนำว่าการสร้างดัชนีที่ไม่ได้เป็นคลัสเตอร์จะค่อนข้างมีประโยชน์ในการปรับปรุงประสิทธิภาพของแบบสอบถาม ดังนั้นนั่นหมายความว่าจะต้องเพิ่มดัชนีที่ไม่ได้เป็นคลัสเตอร์ในมุมมองก่อนที่จะสามารถปรับปรุงประสิทธิภาพที่ต้องการได้ มีสิ่งสุดท้ายที่ต้องลอง ปรับเปลี่ยนแบบสอบถามเพื่อใช้ตัวเลือก "WITH NOEXPAND":
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest_View pv WITH (NOEXPAND)
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
ผลลัพธ์นี้ในแผนแบบสอบถามต่อไปนี้:
แผนการดำเนินการนี้มีลักษณะค่อนข้างคล้ายกับแผนการผลิตที่ไม่ได้จัดกลุ่มไว้ในคำตอบของ Max Vernon แต่อันนี้ทำได้ด้วยดัชนีที่น้อยกว่า (ไม่มีการรวมกลุ่ม) และวัตถุสถิติที่น้อยกว่าหนึ่งรายการ
ปรากฎว่าต้องใช้ตัวเลือก NOEXPAND กับ SQL Server รุ่นด่วนและมาตรฐานเพื่อใช้มุมมองที่จัดทำดัชนีอย่างเหมาะสม Paul White มีบทความที่ยอดเยี่ยมซึ่งจะอธิบายเกี่ยวกับประโยชน์ของการใช้ตัวเลือก NOEXPAND นอกจากนี้เขายังแนะนำให้ใช้ตัวเลือกนี้กับรุ่นองค์กรเพื่อให้มั่นใจถึงการรับประกันที่ไม่ซ้ำกันของดัชนีมุมมองที่ใช้โดยเครื่องมือเพิ่มประสิทธิภาพ
การวิเคราะห์ข้างต้นดำเนินการกับรุ่นด่วนของ SQL Sever 2014 ฉันยังลองใช้กับรุ่นนักพัฒนาของ SQL Server 2016 ตัวเลือก NOEXPAND ดูเหมือนจะไม่จำเป็นต้องใช้กับรุ่นพัฒนาเพื่อให้ได้ประสิทธิภาพ แต่ก็ยังแนะนำ .
น้อยกว่า 5 เดือนที่ผ่านมาไมโครซอฟท์ทำรุ่นนักพัฒนาอิสระ ใบอนุญาต จำกัด การใช้เพื่อการพัฒนาเท่านั้นซึ่งหมายความว่าฐานข้อมูลไม่สามารถใช้ในสภาพแวดล้อมการผลิต ดังนั้นหากคุณต้องการทดสอบตารางที่เพิ่มประสิทธิภาพหน่วยความจำการเข้ารหัส R และอื่น ๆ คุณจะไม่มีข้อแก้ตัวที่ไม่มีใบอนุญาตอีกต่อไป ฉันติดตั้งมันบนคอมพิวเตอร์ของฉันไม่กี่วันที่ผ่านมาพร้อมกับ SQL Server 2014 Express โดยไม่มีปัญหา
WHERE (sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%')
ได้