อะไรคือความแตกต่างระหว่างขั้นตอนการจัดเก็บและมุมมอง?


143

ฉันสับสนเกี่ยวกับบางประเด็น:

  1. อะไรคือความแตกต่างระหว่างขั้นตอนการจัดเก็บและมุมมอง?

  2. ฉันควรใช้กระบวนงานที่เก็บไว้เมื่อใดและฉันควรใช้มุมมองใน SQL Server เมื่อใด

  3. มุมมองอนุญาตให้สร้างแบบสอบถามแบบไดนามิกที่เราสามารถส่งผ่านพารามิเตอร์ได้หรือไม่

  4. อันไหนเร็วที่สุดและอันไหนเร็วกว่ากัน?

  5. มุมมองหรือขั้นตอนที่จัดเก็บจัดสรรหน่วยความจำอย่างถาวรหรือไม่?

  6. หมายความว่าอย่างไรถ้ามีคนบอกว่ามุมมองสร้างตารางเสมือนในขณะที่โพรซีเดอร์สร้างตารางวัสดุ

โปรดแจ้งให้เราทราบเกี่ยวกับคะแนนเพิ่มเติมหากมี

คำตอบ:


149

มุมมองแสดงถึงตารางเสมือน คุณสามารถเข้าร่วมหลายตารางในมุมมองและใช้มุมมองเพื่อนำเสนอข้อมูลราวกับว่าข้อมูลมาจากตารางเดียว

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

การสร้างมุมมองและขั้นตอนที่จัดเก็บ - มีข้อมูลบางส่วนจาก Microsoft เกี่ยวกับเวลาและเหตุผลที่ต้องใช้แต่ละรายการ

สมมติว่าฉันมีสองโต๊ะ:

  • tbl_userกับคอลัมน์: user_id, user_name,user_pw
  • tbl_profileกับคอลัมน์: profile_id, user_id,profile_description

ดังนั้นหากฉันพบว่าตัวเองกำลังค้นหาจากตารางเหล่านั้น A LOT ... แทนที่จะทำการเข้าร่วมใน SQL ทุกชิ้นฉันจะกำหนดมุมมองเช่น:

CREATE VIEW vw_user_profile
AS
  SELECT A.user_id, B.profile_description
  FROM tbl_user A LEFT JOIN tbl_profile B ON A.user_id = b.user_id
GO

ดังนั้นหากผมต้องการที่จะแบบสอบถามprofile_descriptionโดยuser_idในอนาคตสิ่งที่ผมต้องทำคือ:

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

รหัสนั้นสามารถใช้ในขั้นตอนการจัดเก็บเช่น:

CREATE PROCEDURE dbo.getDesc
    @ID int
AS
BEGIN
    SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
END
GO

หลังจากนั้นฉันสามารถโทร:

dbo.getDesc 25

และฉันจะได้รับคำอธิบายสำหรับuser_id25 โดยที่25พารามิเตอร์ของคุณคือ

เห็นได้ชัดว่ามีรายละเอียดมากกว่านี้เป็นเพียงแนวคิดพื้นฐาน


1
แต่ฉันสามารถเข้าร่วมได้สามารถเข้าร่วมหลายตารางในขั้นตอนการจัดเก็บได้เช่นกันโดยที่ฉันไม่ต้องให้พารามิเตอร์
NoviceToDotNet

6
แต่ทำไมคุณถึงทำเช่นนั้น? คุณพยายามทำอะไรให้สำเร็จ? คุณสามารถใช้มุมมองเป็นตาราง ... ขั้นตอนที่จัดเก็บไว้สำหรับการทำสิ่งต่างๆ ... มุมมองมีไว้เพื่อทำให้ชีวิตของคุณง่ายขึ้น
Patrick

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

2
ฉันไม่ได้รับโปรดอธิบายเพิ่มเติมเล็กน้อย
NoviceToDotNet

2
ถูกต้อง แต่เก็บมุมมองของคุณแล้ว ... เพื่อให้คุณสามารถเรียกมันว่าเป็นโต๊ะเดียว ด้วยวิธีนี้คุณสร้างการเข้าร่วมของคุณเพียงครั้งเดียวและในอนาคตจะใช้อ้างอิงมุมมองโดยตรงซึ่งเรียก sql ที่อยู่เบื้องหลังราวกับว่ามันเป็นตาราง
Patrick

111

มีข้อมูลมากมายที่นี่

นี่คือบทสรุปที่ดี:

ขั้นตอนที่จัดเก็บ:

  • ยอมรับพารามิเตอร์
  • สามารถไม่ถูกนำมาใช้กับการสร้างบล็อกในแบบสอบถามที่มีขนาดใหญ่
  • สามารถมีหลายคำสั่งลูป IF ELSE ฯลฯ
  • สามารถปรับเปลี่ยนตารางหนึ่งหรือหลายตาราง
  • ไม่สามารถใช้เป็นเป้าหมายของคำสั่ง INSERT, UPDATE หรือ DELETE

มุมมอง:

  • ไม่ไม่ยอมรับพารามิเตอร์
  • สามารถใช้เป็นแบบเอกสารสำเร็จรูปในแบบสอบถามขนาดใหญ่
  • สามารถมีแบบสอบถาม SELECT เพียงรายการเดียว
  • ไม่สามารถแก้ไขตารางใด ๆ
  • แต่สามารถใช้ (บางครั้ง) เป็นเป้าหมายของคำสั่ง INSERT, UPDATE หรือ DELETE

7
นอกจากนี้จำนวนการดูไม่ควรมีประโยค "เรียงลำดับตาม" หรือ "ยอดนิยม" ด้วย
sksallaj

2
"ไม่สามารถใช้เป็นเป้าหมายของคำสั่ง INSERT, UPDATE หรือ DELETE" หมายความว่าอย่างไร เราไม่สามารถใช้ INSERT, DELETE, UPDATE ใน Stored Procedure ได้หรือไม่?
Arsman Ahmad

"มุมมองไม่ยอมรับพารามิเตอร์" ไม่เป็นความจริง? ตัวอย่างวิดีโอ: youtube.com/watch?v=zK-mWjUxKpw
xayer

มุมมองสามารถปรับเปลี่ยนตารางฐาน / ตาราง: csharp-video-tutorials.blogspot.com/2012/09/…
Khurram

8

ก่อนอื่นคุณต้องเข้าใจก่อนว่าทั้งสองอย่างนั้นแตกต่างกัน Stored Proceduresใช้กับINSERT-UPDATE-DELETEงบได้ดีที่สุด ในขณะViewsที่ใช้สำหรับSELECTงบ คุณควรใช้ทั้งสองอย่าง

ในมุมมองคุณไม่สามารถเปลี่ยนแปลงข้อมูลได้ ฐานข้อมูลบางอย่างมีการปรับปรุงได้ชมที่คุณสามารถใช้ในINSERT-UPDATE-DELETEViews


2
คุณสามารถแก้ไขข้อมูลในตารางพื้นฐานโดยใช้มุมมอง สามารถอัปเดตมุมมองได้
พัฒนา Dot Net

7

SQL View เป็นตารางเสมือนซึ่งอิงตามแบบสอบถาม SQL SELECT มุมมองอ้างอิงตารางฐานข้อมูลที่มีอยู่อย่างน้อยหนึ่งตารางหรือมุมมองอื่น ๆ เป็นสแน็ปช็อตของฐานข้อมูลในขณะที่กระบวนงานที่จัดเก็บคือกลุ่มของคำสั่ง Transact-SQL ที่รวบรวมไว้ในแผนการดำเนินการเดียว

View เป็นการนำเสนอข้อมูลที่จัดเก็บในตารางฐานข้อมูลอย่างง่ายในขณะที่กระบวนงานที่จัดเก็บคือกลุ่มของคำสั่งที่สามารถดำเนินการได้

มุมมองเร็วขึ้นเนื่องจากแสดงข้อมูลจากตารางที่อ้างอิงในขณะที่กระบวนงานร้านค้าเรียกใช้คำสั่ง sql

ตรวจสอบบทความนี้: ดูเทียบกับวิธีการจัดเก็บ สิ่งที่คุณกำลังมองหา


5
  1. VIEW คือแบบสอบถามแบบไดนามิกที่คุณสามารถใช้ "WHERE" -Clause
  2. กระบวนงานที่จัดเก็บคือการเลือกข้อมูลคงที่ซึ่งจะส่งคืนผลลัพธ์ที่กำหนดไว้ล่วงหน้า
  3. ไม่ใช่มุมมองหรือกระบวนงานที่เก็บไว้จัดสรรหน่วยความจำ มีเพียงมุมมองที่เป็นรูปธรรม
  4. ตารางเป็นเพียง ENTITY หนึ่งข้อมูลพร็อพเพอร์ตี้สามารถรวบรวมข้อมูลจาก ENTITIES หรือ TABLES ที่แตกต่างกัน

5

มุมมองเป็นวิธีง่ายๆในการบันทึกคอมเพล็กซ์SELECTในฐานข้อมูล

มีการใช้ขั้นตอนการจัดเก็บเมื่อ SQL ธรรมดาไม่เพียงพอ ขั้นตอนการจัดเก็บประกอบด้วยตัวแปรการวนซ้ำและการเรียกใช้กระบวนงานอื่น มันเป็นภาษาโปรแกรมไม่ใช่ภาษาแบบสอบถาม

  1. การดูเป็นแบบคงที่ คิดว่าเป็นตารางใหม่ที่มีเค้าโครงที่แน่นอนและข้อมูลในตารางเหล่านี้จะถูกสร้างขึ้นทันทีโดยใช้แบบสอบถามที่คุณสร้างขึ้นด้วย เช่นเดียวกับตาราง SQL ใด ๆ คุณสามารถเรียงลำดับและกรองด้วยWHERE, และGROUP BYORDER BY

  2. ขึ้นอยู่กับสิ่งที่คุณทำ

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

    มุมมองที่เป็นรูปธรรมช่วยให้คุณสร้างดัชนีในคอลัมน์ของมุมมอง (โดยเฉพาะในคอลัมน์จากการคำนวณซึ่งไม่มีอยู่ที่ใดในฐานข้อมูล)

  4. ฉันไม่เข้าใจว่าคุณกำลังพูดถึงอะไร


5

นอกเหนือจากความคิดเห็นข้างต้นแล้วฉันต้องการเพิ่มประเด็นเกี่ยวกับมุมมองอีกเล็กน้อย

  1. มุมมองสามารถใช้เพื่อซ่อนความซับซ้อน ลองนึกภาพสถานการณ์ที่มีคน 5 คนกำลังทำงานในโปรเจ็กต์ แต่มีเพียงหนึ่งในนั้นที่ดีเกินไปกับข้อมูลฐานข้อมูลเช่นการรวมที่ซับซ้อน ในสถานการณ์เช่นนี้เขาสามารถสร้างมุมมองซึ่งสมาชิกในทีมคนอื่น ๆ สามารถสอบถามได้อย่างง่ายดายขณะที่พวกเขากำลังค้นหาตารางเดียว
  2. การรักษาความปลอดภัยสามารถดำเนินการได้อย่างง่ายดายโดย Views สมมติว่าเราตารางพนักงานซึ่งมีคอลัมน์ที่สำคัญเช่นเงินเดือน , หมายเลข SSN คอลัมน์เหล่านี้ไม่ควรปรากฏให้ผู้ใช้ที่ไม่ได้รับอนุญาตให้ดู ในกรณีนี้เราสามารถสร้าง View โดยเลือกคอลัมน์ในตารางที่ไม่ต้องมีการอนุญาตใด ๆ เช่นName , Ageเป็นต้นโดยไม่ต้องเปิดเผยคอลัมน์ที่ละเอียดอ่อน (เช่น Salary เป็นต้นที่เรากล่าวถึงก่อนหน้านี้) ตอนนี้เราสามารถลบสิทธิ์ในการสอบถามพนักงานตารางโดยตรงและเก็บสิทธิ์การอ่านไว้ใน View ด้วยวิธีนี้เราสามารถใช้การรักษาความปลอดภัยโดยใช้ Views

4

Mahesh ไม่ถูกต้องนักเมื่อเขาแนะนำว่าคุณไม่สามารถแก้ไขข้อมูลในมุมมองได้ ด้วยมุมมองของแพทริค

CREATE View vw_user_profile AS 
Select A.user_id, B.profile_description
FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id

ฉันสามารถอัปเดตข้อมูล ... เป็นตัวอย่างฉันสามารถทำอย่างใดอย่างหนึ่งต่อไปนี้ ...

Update vw_user_profile Set profile_description='Manager' where user_id=4

หรือ

Update tbl_profile Set profile_description='Manager' where user_id=4

คุณไม่สามารถแทรกข้อมูลในมุมมองนี้ได้เนื่องจากมีบางฟิลด์ในตารางทั้งหมดอยู่ไม่ได้และฉันสมมติว่า PROFILE_ID เป็นคีย์หลักและไม่สามารถเป็น NULL ได้ อย่างไรก็ตามบางครั้งคุณสามารถแทรกเข้าไปในมุมมอง ...

ฉันสร้างมุมมองบนตารางที่มีอยู่โดยใช้ ...

Create View Junk as SELECT * from [TableName]

แล้ว

Insert into junk (Code,name) values 
('glyn','Glyn Roberts'),
('Mary','Maryann Roberts')

และ

DELETE from Junk Where ID>4

ทั้ง INSERT และ DELETE ทำงานในกรณีนี้

เห็นได้ชัดว่าคุณไม่สามารถอัปเดตช่องใด ๆ ที่รวมหรือคำนวณได้ แต่ควรอัปเดตมุมมองใด ๆ ที่เป็นเพียงมุมมองตรง

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


3

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


1

@Patrick ถูกต้องกับสิ่งที่เขาพูด แต่เพื่อตอบคำถามอื่น ๆ ของคุณ View จะสร้างขึ้นเองในหน่วยความจำและขึ้นอยู่กับประเภทของการเข้าร่วมข้อมูลและหากมีการรวบรวมข้อมูลใด ๆ อาจเป็นมุมมองที่ค่อนข้างหิวโหย

โพรซีเดอร์ที่เก็บไว้ทำการประมวลผลทั้งหมดโดยใช้ Temp Hash Table เช่น # tmpTable1 หรือในหน่วยความจำโดยใช้ @ tmpTable1 ขึ้นอยู่กับสิ่งที่คุณต้องการบอกให้ทำ

Stored Procedure เป็นเหมือนฟังก์ชัน แต่เรียกตามชื่อโดยตรง แทนฟังก์ชั่นที่ใช้จริงภายในแบบสอบถาม

เห็นได้ชัดว่าเวลาส่วนใหญ่ตารางหน่วยความจำจะเร็วกว่าหากคุณไม่ได้ดึงข้อมูลจำนวนมาก

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