PDA

View Full Version : View có tác động như thế nào đến Database?



curison
27-04-2010, 09:13
Chào cả nhà! Hiện nay do Database(DB) của mình quá nhiều record trên các Table chính, và yêu cầu hiện tại phát sinh nhiều Report phải xử lí phức tạp. Do đó mình muốn sử dụng View hổ trợ tạo Report.

+ TH1: View của mình tạo ra khi chay Report, sau khi xuất dữ liệu ra Report xong thì xóa View vừa tạo đi.
+ TH2: View được tạo một lần đầu và giữ nguyên không bị xóa đi để sử dụng bất cứ khi nào cần.

Câu hỏi mình đặt ra là:
-- Nếu tạo quá nhiều View trong từng TH1 và TH2 thì có bị ảnh hưởng lớn đến tốc độ Insert,Update của DB không?
-- Vậy trong TH1 và TH2 thì trường hợp nào ưu việt hơn.
Mong anh/chị giúp đỡ!

vqt
27-04-2010, 09:55
Theo tôi thì view cũng là một thành phần liên quan đến cấu trúc của db. Do vậy ko nên tạo ra rồi lại xóa đi liên tục lúc run-time. Nếu hệ thống của bạn thực sự lớn thì bạn nên phân tách ra 2 hệ thống riêng biệt là OLTP và OLAP.

xbacala
27-04-2010, 10:00
Mình góp cho bạn 1 vài ý:
- Nếu bạn không dùng index view thì tạo view 0 ảnnh hưởng gì tới INSERT, UPDATE, DELETE
- TH2 sẽ nhanh hơn TH1 1 tí gì mỗi lần chạy, SQL Sever sẽ 0 phải thực hiện qua 1 số bước như recompile, plan optimization. Tuy nhiên, những view nào chỉ dùng 1 lần hay ít khi dùng thì có thể delete đi để đỡ mất công maintenence và khỏi ... "ngứa mắt" :)

curison
27-04-2010, 13:34
Theo như mình biết View chỉ là một bảng ảo, không thể nào tạo Index trên view được.

VD: khi chạy
CREATE UNIQUE CLUSTERED INDEX i_IndexV_STOCKS
ON V_STOCKS(OR21005,OR23005)
thì báo lỗi:
Msg 1939, Level 16, State 1, Line 1
Cannot create index on view 'V_STOCKS' because the view is not schema bound.

Nhưng bạn xbacala nói : "Nếu bạn không dùng index view thì tạo view 0 ảnnh hưởng gì tới INSERT, UPDATE, DELETE" là không đúng. Vậy bạn có thể nói rõ hơn cho mình hiểu không?

dq_ninh
27-04-2010, 14:16
Indexed view không thể dùng CREATE INDEX được, mà dùng WITH SCHEMABINDING với CREATE VIEW.

curison
27-04-2010, 15:16
Mình làm như bạn nói:
create view V_SC01
with schemabinding
as
select SC01001,SC01002,SC01003,SC01010 FROM SC010100
with check option

Nó vẫn báo lỗi là sao?

Msg 4512, Level 16, State 3, Procedure V_SC01, Line 4
Cannot schema bind view 'V_SC01' because name 'SC010100' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.

[=========> Bổ sung bài viết <=========]

Merci, mình làm được rồi vì phải thêm dbo. trước các table "dbo.SC010100".
Thanks các bạn!

vuht2000
04-05-2010, 06:49
Nhưng bạn xbacala nói : "Nếu bạn không dùng index view thì tạo view 0 ảnnh hưởng gì tới INSERT, UPDATE, DELETE" là không đúng. Vậy bạn có thể nói rõ hơn cho mình hiểu không?

Tôi không rõ xbacala nói trong ngữ cảnh nào, theo tôi biết thì view bình thường (không phải indexed view) không ảnh hưởng gì tới các lệnh INSERT, UPDATE, DELETE thực hiện trên base tables (những table mà từ đó view được tạo ra).

[=========> Bổ sung bài viết <=========]



Merci, mình làm được rồi vì phải thêm dbo. trước các table "dbo.SC010100".
Thanks các bạn!
để tạo indexed view thì bắt buộc phải có WITH SCHEMABINDING, nhưng như thế không có nghĩa là view đã có index ngay. Bạn phải tạo 1 index trên view, cú pháp cũng giống như tạo index thông thường, ví dụ tạo trên cột SC01001:
CREATE UNIQUE CLUSTERED INDEX Idx_V_SC01_SC01001 ON dbo.V_SC01(SC01001)

Sau đó bạn có thể kiểm tra lại bằng cách query sysindexes hoặc dùng SSMS để browse database/view/index.
Index đầu tiên luôn luôn phải là CLUSTERED và UNIQUE, các index sau thì không bắt buộc.

phatnq2003
05-05-2010, 16:43
INDEX cho view cũng là một điều hay, tuy nhiên không nhất thiết.
Theo cá nhân, tôi sử dụng view để dùng làm source cho những truy vấn hoặc làm source cho các report nên nếu cần, tôi thường sử dụng ORDER BY.