2010-03-11 28 views
7

Điều gì là hiệu quả hơn - xử lý các câu lệnh case trong sql hoặc xử lý cùng một dữ liệu bằng cách sử dụng các câu lệnh trong mã. Tôi hỏi vì đồng nghiệp của tôi có một truy vấn rất lớn có nhiều báo cáo trường hợp. Tôi khuyên cô ấy nên cởi stress của DB bằng cách viết mã các câu lệnh. Tôi thấy rằng nó hiệu quả hơn ... nhưng tại sao?Báo cáo trường hợp so với mã hóa nếu các câu lệnh

+1

Điều này là mơ hồ. Thông thường mọi người sẽ khuyên bạn xử lý các truy vấn dữ liệu DB trong cơ sở dữ liệu, và hãy nhớ rằng bạn có thể đi vào rất nhiều khó khăn khi cố gắng duy trì các mẫu db trong mã (nhóm/đoàn thể/phân biệt), đó là những gì dbs được tạo ra cho ... –

+2

Dường như với tôi bạn nên nhắm mục tiêu câu hỏi này nhiều hơn tại các nhà phát triển DB, thẻ sql đơn lẻ không thực sự đủ, bạn đang sử dụng hương vị nào của cơ sở dữ liệu SQL? – AnthonyWJones

Trả lời

19

Có một nhiều câu hỏi cơ bản không được hỏi ở đây: Các câu lệnh CASE này thực sự đang làm gì?

Quên hiệu suất trong một phút. Nếu CASE chỉ được sử dụng để chuyển đổi kết quả cuối cùng của truy vấn và thực tế có thể thay thế cùng chức năng với if hoặc select case trong ASP, thì điều đó có thể có nghĩa là truy vấn/thủ tục cơ sở dữ liệu đang cố gắng thực hiện phải chịu trách nhiệm, chẳng hạn như định dạng. Vấn đề phân tách mối quan tâm là nghiêm trọng hơn bất kỳ vấn đề hiệu suất nào có thể xảy ra.

Nếu bạn có một truy vấn như thế này:

SELECT InvoiceID, InvoiceDate, 
    CASE WHEN PaidStatus = 0 THEN 'Unpaid' ELSE 'Paid' END 
FROM ... 

Đây chỉ là ngớ ngẩn, bởi vì giao diện người dùng, hoặc bất cứ lớp nào ánh xạ dữ liệu-to-miền, nên biết làm thế nào để chuyển đổi một trạng thái trong cơ sở dữ liệu với mô tả tương ứng của nó. Nó không có ý nghĩa để bao gồm logic này trong chính truy vấn.

Mặt khác, nếu CASE xây dựng là một phần thiết yếu của truy vấn, như:

SELECT 
    SUM(CASE WHEN PaidStatus = 0 THEN Amount ELSE 0 END) AS TotalUnpaid, 
    SUM(CASE WHEN PaidStatus = 1 THEN Amount ELSE 0 END) AS TotalPaid 
FROM ... 

Đừng bao giờ cố gắng để di chuyển loại logic này đến giao diện người dùng, bởi vì cơ sở dữ liệu là nhiều tốt hơn ở đó. Và CASE là ngữ nghĩa là một phần của truy vấn ("tính toán tổng số tiền chưa thanh toán và chưa thanh toán cho x"), nó không tiếp quản bất kỳ chức năng giao diện người dùng nào.

Lo lắng trước về vị trí thực sự của logic dựa trên những gì nó dự định thực hiện. Mối quan tâm về hiệu suất chỉ nên tham gia vào cuộc thảo luận nếu bạn thực sự nhận thấy hiệu suất đáng kể sự cố.

+0

Câu trả lời hay! Rất hữu ích! Chính xác những gì tôi đang tìm kiếm. – Eric

2

Theo kinh nghiệm của tôi, các máy chủ cơ sở dữ liệu của chúng tôi lớn hơn nhiều so với các máy chủ ứng dụng của chúng tôi và thường dưới 30% không tải. Có cơ sở dữ liệu quản lý dữ liệu, sau đó có khách hàng lặp qua resultsSet. Nó là thực hành tốt hơn để có cơ sở dữ liệu chỉ trả lại dữ liệu bạn cần (nếu bạn có thể xác định điều này lên phía trước).

5

CASE báo cáo được ưa chuộng hơn vì:

  • SQL: Họ là tiêu chuẩn ANSI, làm cho nó di động tới cơ sở dữ liệu khác mà không cần phải thay đổi
  • họ hỗ trợ "ngắn mạch"
1

Bạn nên truy vấn (lọc và sắp xếp) dữ liệu trong cơ sở dữ liệu và để lại bản trình bày cho tầng trình bày. Đây là vì hai lý do chính:

  • Cơ sở dữ liệu được thực hiện để lọc và sắp xếp dữ liệu
  • Bạn muốn kéo số tiền ít nhất của dữ liệu qua dây từ DB khi cần thiết
0

Như tôi đã đọc, ở đây câu hỏi cơ bản là nếu CASE tốt hơn IF trong SQL. Câu trả lời cũng phụ thuộc vào độ sâu của các điều kiện của bạn. Tìm thấy một bài viết hay ở đây. Có thể hữu ích cho ai đó. http://www.4guysfromrolla.com/webtech/102704-1.shtml

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