2010-03-11 99 views
7

什麼是更高效 - 在sql中處理case語句或使用if語句在代碼中處理相同的數據。我問,因爲我的同事有一個巨大的查詢,有很多案例陳述。我建議她通過編寫案例陳述來減輕DB的壓力。我發現它更高效......但爲什麼?Case語句與編碼語句

+1

這是模糊的。通常人們會建議你處理數據庫中的數據庫數據查詢,並記住你可能會遇到很多麻煩,試圖維護代碼中的數據庫模式(groups/union/distincts),這是dbs所做的... – 2010-03-11 22:36:27

+2

在我看來,你應該更多地在DB開發人員面前討論這個問題,單個SQL標籤不夠用,你使用了什麼樣的SQL數據庫? – AnthonyWJones 2010-03-11 22:37:46

回答

19

有一個更電線這裏沒有提到的基本問題:這些CASE聲明實際上在做什麼?

忘記表演一分鐘。如果CASE僅用於轉換查詢的最終輸出,並且實際上可以用ASP中的ifselect case替換相同的功能,則可能意味着數據庫查詢/過程正在嘗試執行UI應該負責,如格式化。問題分離問題比任何可能的性能問題都嚴重。

如果你有這樣的查詢:

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

這僅僅是愚蠢的,因爲UI,或任何一層做的數據域映射,應該知道如何將狀態轉換數據庫到其相應的描述。在查詢本身中包含這個邏輯是沒有意義的。

在另一方面,如果CASE結構是查詢的重要組成部分,如:

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 ... 

甚至不要嘗試這樣的邏輯轉移到UI,因爲數據庫是更好。並且CASE在語義上是查詢的一部分(「計算x」的總付費和未付款金額),但它並未接管任何UI功能。

首先擔心邏輯實際所屬的位置是基於它打算完成的。如果您實際注意到顯着的性能問題,則只應對性能問題進行討論。

+0

很好的答案!很有幫助!正是我在找什麼。 – Eric 2010-03-12 15:47:15

2

根據我的經驗,我們的數據庫服務器比我們的應用程序服務器大很多,通常閒置時間低於30%。讓數據庫管理數據,然後讓客戶端遍歷resultSet。讓數據庫只返回你需要的數據是更好的做法(如果你能確定這一點)。

5

CASE語句,因爲首選:

  • SQL:他們是ANSI標準,使得它移植到其他數據庫,而無需改變
  • 他們支持 「短路」
1

你應該查詢(過濾和排序)數據庫中的數據,並將演示文稿留給表示層。這有兩個重要原因:

  • 數據庫由過濾和排序數據
  • 你想拉最少的數據量在從DB必要