2010-10-06 35 views
8

Khi xây dựng hệ thống giao dịch có DB được chuẩn hóa cao, chạy truy vấn kiểu báo cáo hoặc thậm chí truy vấn để hiển thị dữ liệu trên giao diện người dùng có thể liên quan đến một số kết nối. Tham gia là tốn kém.Cơ sở dữ liệu giao dịch và báo cáo - Làm cách nào?

Thông thường, hướng dẫn là bạn không bao giờ nên chạy các truy vấn này ra khỏi mô hình DB giao dịch của mình, thay vào đó bạn nên sử dụng mô hình phẳng được chuẩn hóa phù hợp cho các giao diện người dùng cụ thể hoặc báo cáo giúp loại bỏ nhu cầu tham gia nhiều. Sao chép dữ liệu không phải là một vấn đề trong kịch bản này.

Khái niệm này có ý nghĩa hoàn hảo, nhưng những gì tôi hiếm khi nhìn thấy khi các chuyên gia đưa ra những tuyên bố này là chính xác CÁCH để thực hiện điều này. Ví dụ, (và thẳng thắn tôi sẽ đánh giá cao một ví dụ sử dụng bất kỳ nền tảng nào) trong một hệ thống cỡ trung bình chạy trên một máy chủ sql back-end bạn có một mô hình giao dịch chuẩn hóa. Bạn cũng có một số báo cáo và trang web yêu cầu truy vấn. Vì vậy, bạn tạo một cơ sở dữ liệu "báo cáo" làm phẳng dữ liệu chuẩn hóa. Làm thế nào để bạn giữ điều này đồng bộ? Giao dịch nhật ký giao dịch? Nếu vậy, làm thế nào để bạn chuyển đổi dữ liệu để phù hợp với mô hình báo cáo?

+0

Mức độ trễ trong dữ liệu của bạn mà bạn có thể cho phép từ việc nhập các giao dịch vào báo cáo là bao nhiêu? – JeffO

+0

Hãy làm hai kịch bản phổ biến: 1. Về cơ bản lên đến phút hoặc càng sớm càng tốt. 2. Hàng ngày – Saraz

+0

Tôi đã đăng câu hỏi con http://stackoverflow.com/questions/3878603/why-is-the-engagement-of-olap-practically-neglected –

Trả lời

3

Trong cửa hàng của chúng tôi, chúng tôi thiết lập một số liên tục transactional replication từ hệ thống OLTP đến một máy chủ DB khác được sử dụng để báo cáo. Bạn sẽ không muốn sử dụng vận chuyển nhật ký cho mục đích này vì nó yêu cầu khóa độc quyền trên cơ sở dữ liệu mỗi lần khôi phục nhật ký, điều này sẽ ngăn người dùng của bạn chạy báo cáo.

Với trình tối ưu hóa trong SQL Server hôm nay, tôi nghĩ khái niệm rằng các phép nối trên một cơ sở dữ liệu chuẩn hóa là "quá đắt" để báo cáo là một chút lỗi thời. Thiết kế của chúng tôi là hình thức hoàn toàn bình thường thứ 3, vài triệu hàng trong bảng chính của chúng tôi và chúng tôi không gặp sự cố khi chạy bất kỳ báo cáo nào của chúng tôi. Có nói rằng, nếu đẩy đến xô, bạn có thể xem xét việc tạo một số indexed views trên máy chủ báo cáo của mình để trợ giúp.

+0

Nhưng sao chép giao dịch không cho phép bạn chuyển đổi dữ liệu, đúng không? Điều đó sẽ phải xảy ra sau khi nó tiến tới DB báo cáo? – Saraz

+0

Tôi cho rằng bạn có thể xem xét tùy chỉnh các procs được lưu trữ mà bản sao sử dụng trên người đăng ký hoặc làm điều gì đó với trình kích hoạt trên bảng người đăng ký. Nhưng như tôi đã đề cập, tôi sẽ bắt đầu đơn giản và thử chạy các báo cáo của lược đồ chuẩn hóa của bạn. Đừng quá phức tạp bằng cách giả định các vấn đề về hiệu năng trước khi bạn có chúng. –

+1

@ Saraz: bạn có thể có một lược đồ được lập trình không chuẩn hóa báo cáo dưới dạng * Extension * cho OLTP chuẩn hóa. Sử dụng các chiến lược lập chỉ mục, như các chỉ số bao quát lớn (rộng) và các khung nhìn được lập chỉ mục đặc biệt. Các chỉ mục này được tự động duy trì bằng cách sao chép, với chi phí chèn/cập nhật chậm hơn. Thường xuyên chụp ảnh cách ly cũng được triển khai để bảo vệ báo cáo từ sự tranh chấp khóa với tác nhân nhân bản áp dụng các thay đổi. Có hai lược đồ hoàn toàn khác biệt (do đó khác biệt sao chép không thể làm việc) thực sự là khó để giữ đồng bộ. –

-1

Câu trả lời ngắn: thử làm việc với indexed views. Có một số hạn chế trên các bảng bên dưới, nhưng bạn nhận được đồng bộ hóa ngoài hộp.

+0

Tôi đã được thông báo trước đây. Tôi sẽ điều tra thêm. Cảm ơn. – Saraz

+0

-1: bạn sẽ giới thiệu rất nhiều tranh chấp khóa và deadlocks. Nhiều khả năng bạn sẽ phải thả chúng hoàn toàn. –

+0

Eh? Chuyện bạn đang nói về chuyện quái quỷ gì?! :-) –

0

Chúng tôi sử dụng bản sao giao dịch cho cơ sở dữ liệu khác.

Chúng tôi lọc dữ liệu vì vậy chúng tôi chỉ nhận được dữ liệu chúng tôi cần trong cơ sở dữ liệu sao chép của chúng tôi

Chúng tôi cũng chỉ chọn các cột chúng ta muốn, vì vậy các bảng là 'nhỏ'.

Sau đó, chúng tôi kết hợp dữ liệu trong cơ sở dữ liệu sao chép qua lượt xem hoặc chúng tôi tạo trình kích hoạt để thêm dữ liệu từ bảng này sang bảng khác.

0

Canned answer:

Trong tất cả các-quá-nhiều trường hợp một cái nhìn được lập chỉ mục có thể giải quyết mục tiêu hiệu suất ngắn hạn của bạn, nhưng tại một số thời gian sau đó trở thành phản tác dụng. Vì vậy, nếu bạn chọn sử dụng chế độ xem được lập chỉ mục, bạn có thể cần một chiến lược thoát. Hãy để tôi mô tả một vài vấn đề thường gặp với các khung nhìn được lập chỉ mục.

Chế độ xem được lập chỉ mục có thể làm tăng tranh chấp khóa.

Rất dễ dàng để chứng minh.Tạo bảng sau:

CREATE TABLE dbo.ChildTable(ChildID INT NOT NULL 
    CONSTRAINT PK_ChildTable PRIMARY KEY, 
    ParentID INT NOT NULL, 
    Amount INT NOT NULL); 
GO 

Từ một tab trong SSMS, chạy kịch bản này:

BEGIN TRAN; 
INSERT INTO dbo.ChildTable(ChildID, ParentID, Amount) 
    VALUES(1,1,1); 

Từ tab khác, chạy một tương tự một:

BEGIN TRAN; 
INSERT INTO dbo.ChildTable(ChildID, ParentID, Amount) 
    VALUES(2,1,1); 
ROLLBACK; 

Lưu ý rằng cả hai chèn hoàn chỉnh , họ không chặn nhau. Tua lại ở cả hai tab và tạo chế độ xem được lập chỉ mục:

CREATE VIEW dbo.ChildTableTotals WITH SCHEMABINDING 
AS 
SELECT ParentID, 
    COUNT_BIG(*) AS ChildRowsPerParent, 
    SUM(Amount) AS SumAmount 
FROM dbo.ChildTable 
GROUP BY ParentID; 
GO 
CREATE UNIQUE CLUSTERED INDEX ChildTableTotals_CI 
    ON dbo.ChildTableTotals(ParentID); 

Chạy lại hai lần chèn. Lưu ý rằng điều thứ hai không hoàn thành; nó bị chặn. Lý do rất đơn giản: chèn đầu tiên sửa đổi mục nhập tương ứng trong khung nhìn được lập chỉ mục, do đó, chèn sẽ lấy và giữ một khóa trên đó.

Cũng dễ dàng chứng minh rằng khi bạn tạo chế độ xem được lập chỉ mục, các khóa chết có thể trở nên có nhiều khả năng xảy ra hơn.

Lưu ý: đây không phải là vấn đề với cách xem được lập chỉ mục. Nếu bạn triển khai bảng tóm tắt của riêng mình và phát triển các trình kích hoạt trực tiếp sửa đổi nó để luôn cập nhật, bạn sẽ gặp phải vấn đề tương tự. Chỉ khi bạn không duy trì bảng tóm tắt của bạn tất cả các thời gian, bạn có thể nhận được xung quanh vấn đề này khóa, nhưng một cuộc thảo luận chi tiết hơn về điều này là vượt ra ngoài phạm vi của bài đăng này.

Chỉnh sửa: ví dụ có thể trông giống với bạn, nhưng vấn đề mà nó thể hiện là rất thực tế và rất phổ biến. Chế độ xem được lập chỉ mục trong môi trường OLTP bị hạn chế sử dụng, bởi vì chúng làm tăng nghiêm trọng tranh chấp khóa và gây ra nhiều sự tắc nghẽn. Nó là khá phổ biến mà ai đó tạo ra chúng trong OLTP, nhưng cuối cùng giảm, bởi vì họ giới thiệu nhiều vấn đề hơn họ giải quyết.

Có hai cách phổ biến để chứng minh các sự cố gây ra bởi đồng thời - chúng tôi viết vòng và chạy chúng từ nhiều kết nối hoặc bắt đầu giao dịch rõ ràng trong hai hoặc nhiều kết nối. Tôi khuyến khích mọi người nghĩ ra một cách đơn giản hơn để chứng minh vấn đề này.

+0

Bất kỳ (ẩn từ tôi) nhập vào "NOT NULL" + Ràng buộc CHÍNH CHÍNH trên cùng một trường (trong "CREATE TABLE dbo.ChildTable (ChildID INT NOT NULL ĐĂNG KÝ PK_ChildTable PRIMARY KEY,")? –

+0

và kết quả là (Ví dụ, bạn muốn loại bỏ hoàn toàn các lợi ích của các khung nhìn được lập chỉ mục?) Tại sao bạn muốn một tran bắt đầu trên một chèn đơn giản?) –

+0

@noel Abrahams: ví dụ có thể trông giống bạn, nhưng vấn đề nó thể hiện là rất thực tế và rất phổ biến Tôi khuyến khích bạn tìm ra một cách đơn giản hơn để chứng minh vấn đề này. –

0

Lập chỉ mục thích hợp, bao gồm các chỉ mục và truy vấn định dạng lại có thể giúp bạn có nhiều điều tốt. Tuy nhiên, nếu bạn đã làm điều đó, thì bạn có thể phản chiếu cơ sở dữ liệu của bạn, sao chép chúng, hoặc tạo một gói etl và tạo một khối dịch vụ phân tích/s.

Các vấn đề liên quan