จัดทำดัชนีมุมมองใน SQL Server


11

ฉันมีตารางและมุมมองที่จัดทำดัชนีไว้เหมือนกัน

Create table mytable1 (ID int identity(1,1), Name nvarchar(100))

Create table mytable2 (ID int identity(1,1), Name nvarchar(100))

Create view myview 
with schemabinding 
as 
   select a.name, b.name
   from mytable1 a 
   join mytable2 b on a.Id = b.Id

ตอนนี้ถ้าฉันเรียกใช้แบบสอบถามต่อไปนี้

select a.name, b.name
from mytable1 a 
join mytable2 b on a.Id = b.Id

มันไม่ได้ใช้มุมมองที่จัดทำดัชนีของฉัน มีคำใบ้ (หรือวิธีอื่น ๆ ) ในการบังคับให้ SQL Server ใช้มุมมองที่จัดทำดัชนีแทนหรือไม่?

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

ฉันใช้ SQL Server 2014 Enterprise Edition


ฉันมีระบบใหญ่และจำเป็นต้องปรับให้เหมาะสม ฉันไม่สามารถเปลี่ยนสคริปต์ sql ทั้งหมดเพื่อเลือกจากมุมมองแทนที่จะเป็นตาราง ฉันต้องการสร้างมุมมองที่จัดทำดัชนีและบังคับให้เซิร์ฟเวอร์ sql รับข้อมูลจากพวกเขาแทนที่จะเป็นตาราง
Artashes Khachatryan

คำตอบ:


23

ฉันสร้างมุมมองที่จัดทำดัชนีไว้ใน SQL Server ตลอดเวลาเพื่อปรับแต่งผลิตภัณฑ์ที่มีอยู่ เครื่องมือเพิ่มประสิทธิภาพฉลาดพอที่จะใช้ดัชนีถ้าคุณใช้คอลัมน์ที่เหมาะสม

ใช้ตัวอย่างของคุณดูเหมือนว่าคุณสร้างมุมมอง แต่ไม่ได้สร้างดัชนีตามจริง

if object_id(N'mytable1') is not null 
drop table mytable1
if object_id(N'mytable2') is not null 
drop table mytable2
go

Create table mytable1 (ID int identity(1,1), Name1 nvarchar(100))
GO
Create table mytable2 (ID int identity(1,1), Name2 nvarchar(100))
GO

insert into mytable1 values ('steve')
insert into mytable1 values ('jack') 
insert into mytable1 values ('mike') 
insert into mytable1 values ('ralph') 
insert into mytable1 values ('simon')

insert into mytable2 values ('smith')
insert into mytable2 values ('jackson') 
insert into mytable2 values ('mikaelson') 
insert into mytable2 values ('montalvo') 
insert into mytable2 values ('singer')
go

if object_id(N'myview') is not null
drop view myview
go

Create view myview 
with schemabinding 
as 
select a.id, a.name1, b.name2
from dbo.mytable1 a 
join dbo.mytable2 b on a.Id = b.Id
GO

select a.name1, b.name2
from mytable1 a join mytable2 b on a.Id = b.Id
GO

เนื่องจากไม่มีดัชนีในมุมมองนี้เราจึงสแกนบนตารางฐาน: ป้อนคำอธิบายรูปภาพที่นี่

แต่เมื่อเราเพิ่มดัชนีเครื่องมือเพิ่มประสิทธิภาพสามารถใช้งานได้:

CREATE UNIQUE CLUSTERED INDEX [ix_cl_names] ON [myview]
(
    [name1] ASC,
    [name2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

มุมมองนี้ใช้อย่างเหมาะสม: ป้อนคำอธิบายรูปภาพที่นี่

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

ไม่มีคำใบ้หรือวิธีอื่นเพื่อบังคับให้ SQL Server ใช้มุมมองที่มีการจัดทำดัชนีเมื่อไม่มีการอ้างอิงในแบบสอบถาม

ข้อมูลเพิ่มเติม (จากGeoff Patterson )

อีกประเด็นหนึ่งคือในขณะที่เครื่องมือเพิ่มประสิทธิภาพสามารถใช้มุมมองที่จัดทำดัชนีในกรณีนี้ได้เท่านั้นในกรณีนี้อาจทำให้รู้สึกถึงการอ้างอิงมุมมองโดยตรงโดยใช้NOEXPANDคำใบ้หากคุณต้องการแน่ใจว่าดัชนีดูใช้หรือ 100% หากคุณต้องการให้ใช้ใน Standard Edition

ฉันเคยเห็นข้อความค้นหาบ่อยครั้งแม้ใน Enterprise Edition ซึ่งเครื่องมือเพิ่มประสิทธิภาพไม่ได้รับความจริงที่ว่าดัชนีมุมมองสามารถใช้งานได้เว้นแต่NOEXPANDจะใช้ เป็นเรื่องธรรมดามากขึ้นกับการสืบค้นที่ซับซ้อน แต่สามารถเกิดขึ้นได้กับการสืบค้นทั่วไป

Paul White เป็นหนึ่งในบทความที่ดีกว่าที่ฉันได้อ่านจากความแตกต่างของNOEXPAND; นอกเหนือจากการใช้ดัชนีการดูแล้วคำใบ้ยังสามารถส่งผลกระทบต่อสิ่งต่างๆเช่นสถิติที่สร้างขึ้นโดยอัตโนมัติในมุมมองที่จัดทำดัชนีและการประมาณค่าความสำคัญเชิงหัวใจสำหรับแผน

และจากZane : ในฐานะที่เป็นบันทึกด้านโปรดใช้ความระมัดระวังกับมุมมองที่มีการจัดทำดัชนีเช่นเดียวกับดัชนีอื่น ๆ ซึ่งจะเพิ่มในการอัปเดตแทรกและลบเวลาของคุณ


-5

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

create view iv.MyTest 
as 
 select Col1, Col2 from dbo.MyTest 

แน่นอนว่าจะใช้ได้เฉพาะเมื่อคุณไม่ได้ใช้ชื่อสคีมาในรหัสแอปพลิเคชัน

หากคุณมีคุณสามารถลองย้ายวัตถุทั้งหมดไปยังสคีมาใหม่และแนะนำมุมมองในสคีมาเก่าแทน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.