วิธีสร้างมุมมองที่เป็นรูปธรรมใน SQL Server


101

ฉันกำลังจะออกแบบ DW และฉันได้ยินเกี่ยวกับมุมมองที่เป็นรูปธรรม อันที่จริงฉันต้องการสร้างมุมมองและควรอัปเดตโดยอัตโนมัติเมื่อมีการเปลี่ยนแปลงตารางพื้นฐาน ใครช่วยอธิบายด้วยตัวอย่างแบบสอบถาม ..

คำตอบ:


144

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

โดยพื้นฐานแล้วสิ่งที่คุณต้องทำคือ:

  • สร้างมุมมองปกติ
  • สร้างดัชนีคลัสเตอร์บนมุมมองนั้น

และเสร็จแล้ว!

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

แหล่งข้อมูลเพิ่มเติม:


ขอบคุณสำหรับการตอบกลับของคุณ. ฉันมีสิ่งที่ฉันต้องการ .. ฉันอยากรู้เกี่ยวกับดัชนีด้วย ฉันต้องการทราบว่ามีวิธีใดในการสร้างแผนภาพสคีมาแบบดาวในเซิร์ฟเวอร์ SQL เมื่อฉันมีโครงสร้างตารางทั้งหมดพร้อมหรือไม่ ถ้าใช่ฉันจะสร้างตารางข้อเท็จจริงได้อย่างไร
Deepak

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

2
ดังที่ได้กล่าวไว้ในคำถามที่เกี่ยวข้องบทความบล็อก MSDN blogs.msdn.microsoft.com/ssma/2011/06/20/…เน้นความแตกต่างที่สำคัญบางประการระหว่างมุมมองที่เป็นรูปธรรมและมุมมองที่จัดทำดัชนี IMHO ที่เป็นปัญหามากที่สุดคือไม่สามารถระบุทริกเกอร์การรีเฟรชได้: มุมมองที่จัดทำดัชนีจะอัปเดตเมื่อใดก็ตามที่มีการอัปเดตตารางพื้นฐานซึ่งจะทำลายประโยชน์ด้านประสิทธิภาพส่วนใหญ่ของการใช้มุมมองที่เป็นรูปธรรม ข้อห้ามในการรวมการรวมฟังก์ชันการสร้างหน้าต่างและการสืบค้นย่อยทำให้มุมมองที่จัดทำดัชนีเกือบจะไม่มีจุดหมายเว้นแต่ข้อมูลจะไม่เปลี่ยนแปลงบ่อย
Suncat2000

43

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

หากคุณมีการรวมภายนอกในมุมมองจะไม่สามารถใช้งานได้ นอกจากนี้ไม่อนุญาตให้ใช้นิพจน์ตารางทั่วไป ... ในความเป็นจริงหากคุณมีลำดับใด ๆ ในการเลือกย่อยหรือตารางที่ได้รับ (เช่นมีพาร์ติชันตามข้อ) คุณก็โชคไม่ดีเช่นกัน

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

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


อันที่จริงฉันใช้ Indexed Views (เพียงครั้งเดียว) เพื่อแบ่งพาร์ติชันดัชนี Full Text Search ดัชนี FTS ไม่สามารถแบ่งพาร์ติชันได้ แต่สามารถสร้างดัชนีแยกจากกันได้ในหลายมุมมองจากตารางเดียวกัน แม้ว่ามันจะเป็นทางเลือกสุดท้าย
areyesram

4
คุณต้องอย่าลืมเพิ่ม(NOEXPAND)คำใบ้ให้กับแบบสอบถามที่ใช้มุมมองที่จัดทำดัชนี แล้วคุณจะสังเกตเห็นความแตกต่าง ข้อดีของการใช้มุมมองที่จัดทำดัชนีเทียบกับ "การจัดทำดัชนีตารางอย่างถูกต้อง" คือการ จำกัด การเลือกระเบียนมิฉะนั้นคุณจะถูกต้องก็จะเหมือนกัน
ajeh

ใช่สิ่งที่ NOEXPAND ไม่สามารถพูดได้!
Simon_Weaver

18

คุณอาจต้องการพื้นหลังเพิ่มเติมเล็กน้อยเกี่ยวกับมุมมองที่เป็นรูปธรรม ใน Oracle สิ่งเหล่านี้คือออบเจ็กต์ที่ประกอบด้วยองค์ประกอบจำนวนมากเมื่อคุณพยายามสร้างขึ้นที่อื่น

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

ใน SQL Server ฉันจะใช้สิ่งต่อไปนี้เพื่อสร้าง MVIEW พื้นฐานเพื่อ (เสร็จสมบูรณ์) รีเฟรชเป็นประจำ

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

อย่างอื่นคือการทดลอง


5
ความคิดเห็นของคุณเกี่ยวกับ SQL Server ไม่ถูกต้อง - มุมมองที่เป็นรูปธรรมเป็นสิ่งที่แตกต่างกันมากใน Oracle และ SQL Server ใน SQL Server มุมมองที่มีดัชนีคลัสเตอร์ที่ไม่ซ้ำกัน (หรือที่เรียกว่า "มุมมองที่เป็นรูปธรรม") จะไม่มีและไม่สามารถอัปเดตโดยผู้ใช้และไม่ได้ถูกเก็บไว้ในตารางที่ผู้ใช้สร้างขึ้นแยกต่างหาก - จะอัปเดตโดย เครื่องยนต์ในระหว่างการอัปเดตและจะไม่ซิงค์กัน ไม่จำเป็นต้องมีงานในการจัดเก็บสแนปชอตของข้อมูล
ErikE

10
สิ่งที่ OP ขอมีให้อย่างง่ายดายโดยมุมมองที่จัดทำดัชนี นั่นคือสิ่งที่ใกล้เคียงที่สุดที่ SQL Server มอบให้กับมุมมองที่เป็นรูปธรรมของ Oracle อย่างไรก็ตามหากคุณต้องการ / จำเป็นต้องทำซ้ำวิธีการทำงานของ Oracle MVIEW Jason ก็ถูกต้อง วิธีการของ Jason ยังช่วยในสถานการณ์เดียวกันที่ Oracle MVIEWs สามารถทำได้เช่นการรีเฟรชตารางการรายงานเป็นเวลาหลายชั่วโมงซึ่งคุณสนใจเกี่ยวกับการโหลดฐานข้อมูลมากกว่าการดูข้อมูลล่าสุด (เช่นรายงานเฉพาะตัวเลขเมื่อวาน ... )

4

เมื่อมุมมองที่จัดทำดัชนีไม่ใช่ตัวเลือกและไม่จำเป็นต้องมีการอัปเดตด่วนคุณสามารถสร้างตารางแฮ็คแคช:

select * into cachetablename from myviewname
alter table cachetablename add primary key (columns)
-- OR alter table cachetablename add rid bigint identity primary key
create index...

จากนั้น sp_rename view / table หรือเปลี่ยนเคียวรีหรือมุมมองอื่น ๆ ที่อ้างอิงให้ชี้ไปที่ตารางแคช

กำหนดเวลาทุกวัน / ทุกคืน / รายสัปดาห์ / ไม่รีเฟรชเช่น

begin transaction
truncate table cachetablename
insert into cachetablename select * from viewname
commit transaction

หมายเหตุ: สิ่งนี้จะกินพื้นที่เช่นกันในบันทึก tx ของคุณ เหมาะที่สุดสำหรับชุดข้อมูลขนาดเล็กที่ประมวลผลช้า บางที refactor เพื่อกำจัดคอลัมน์ "ง่าย แต่มีขนาดใหญ่" ในมุมมองด้านนอกก่อน


1

สำหรับ MS T-SQL Server ฉันขอแนะนำให้สร้างดัชนีด้วยคำสั่ง "include" ไม่จำเป็นต้องมีความเป็นเอกลักษณ์และไม่มีการเรียงลำดับข้อมูลทางกายภาพที่เกี่ยวข้องกับดัชนีคลัสเตอร์ "ดัชนี ... รวม ()" สร้างที่จัดเก็บข้อมูลทางกายภาพแยกต่างหากที่ดูแลโดยระบบโดยอัตโนมัติ มีแนวคิดคล้ายกับ Oracle Materialized View มาก

https://msdn.microsoft.com/en-us/library/ms190806.aspx

https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx

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