什麼是更高效 - 在sql中處理case語句或使用if語句在代碼中處理相同的數據。我問,因爲我的同事有一個巨大的查詢,有很多案例陳述。我建議她通過編寫案例陳述來減輕DB的壓力。我發現它更高效......但爲什麼?Case語句與編碼語句
回答
有一個更電線這裏沒有提到的基本問題:這些CASE
聲明實際上在做什麼?
忘記表演一分鐘。如果CASE
僅用於轉換查詢的最終輸出,並且實際上可以用ASP中的if
或select 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功能。
首先擔心邏輯實際所屬的位置是基於它打算完成的。如果您實際注意到顯着的性能問題,則只應對性能問題進行討論。
很好的答案!很有幫助!正是我在找什麼。 – Eric 2010-03-12 15:47:15
根據我的經驗,我們的數據庫服務器比我們的應用程序服務器大很多,通常閒置時間低於30%。讓數據庫管理數據,然後讓客戶端遍歷resultSet。讓數據庫只返回你需要的數據是更好的做法(如果你能確定這一點)。
CASE
語句,因爲首選:
- SQL:他們是ANSI標準,使得它移植到其他數據庫,而無需改變
- 他們支持 「短路」
你應該查詢(過濾和排序)數據庫中的數據,並將演示文稿留給表示層。這有兩個重要原因:
- 數據庫由過濾和排序數據
- 你想拉最少的數據量在從DB必要
當我閱讀時,這裏的基本要求是如果CASE在SQL中優於IF。答案也取決於你的條件的深度。在這裏找到一篇好文章。可能對某人有用。 http://www.4guysfromrolla.com/webtech/102704-1.shtml
- 1. 與case語句SELECT語句
- 2. 與Case語句
- 3. 在case語句後編寫JOIN語句
- 4. 子與case語句
- 5. Case語句與extglob
- 6. CASE語句SQL
- 7. SQL CASE語句
- 8. Case語句
- 9. SQL CASE語句
- 10. 用case語句
- 11. Case語句值
- 12. 在CASE語句
- 13. CASE語句
- 14. case語句
- 15. CASE語句
- 16. Case語句
- 17. case語句
- 18. case語句
- 19. SQL case語句
- 20. CASE語句Postgres
- 21. SQL&CASE語句
- 22. TSQL Case語句
- 23. MDX Case語句
- 24. SQL CASE語句
- 25. Case語句
- 26. LINQ case語句
- 27. 在case語句
- 28. Case語句
- 29. Case語句
- 30. SQL代碼SUM CASE語句
這是模糊的。通常人們會建議你處理數據庫中的數據庫數據查詢,並記住你可能會遇到很多麻煩,試圖維護代碼中的數據庫模式(groups/union/distincts),這是dbs所做的... – 2010-03-11 22:36:27
在我看來,你應該更多地在DB開發人員面前討論這個問題,單個SQL標籤不夠用,你使用了什麼樣的SQL數據庫? – AnthonyWJones 2010-03-11 22:37:46