簡體   English   中英

當將最新的jdbc驅動程序用於SQL Server 2005/2008時,准備好的語句,視圖和存儲過程如何比較性能?

[英]When using the latest jdbc driver for SQL Server 2005/2008 how do prepared statements, views, and stored procedures compare regarding performance?

在將最新的Microsoft jdbc驅動程序用於SQL Server 2005/2008時,准備好的語句,視圖和存儲過程如何比較性能?

如果我有一個帶有一些動態where子句的普通的select語句,那么我會從從准備好的語句中的直接SQL遷移到視圖甚至存儲過程中受益嗎?

更具體地說,類似這樣的事情:

select foo.name, bar.name, baz.name, belch.burp
from foo 
inner join bar on foo.id=bar.fooID
inner join baz on bar.id=baz.barID
inner join belch on baz.id = belch.bazID
where foo.name like '%<USERINPUT>%' and bar.name like '%<USERINPUT>%'

由於SP的緩存執行計划,您不太可能看到顯着的性能差異,因為執行計划也緩存在SQL Server 2005中,甚至在臨時SQL中也是如此。

如果由於某些參數值的基數估計錯誤而導致參數嗅探會對性能產生不利影響,則可以使用WITH RECOMPILE指示器。

視圖和存儲過程的好處將體現在安全性和維護方面,其中好處可能太多了,無法在此處進行詳盡介紹,但包括以下功能:

限制從SELECT語句中讀取受保護的數據,而不必在基礎表上分配單獨的列權限。

從其他SQL代碼和應用程​​序中的多個位置重復使用參數化的SP。

在不影響或重新部署應用程序代碼的情況下,將應用程序SP作為系統的命名數據庫接口組件進行檢測,記錄,分析和調整。

重構數據庫而不會影響或重新部署應用程序代碼。

提供與數據庫的抽象層和接口協定,以提供對系統所需和提供的數據庫服務的良好可見性,其中可能包括自動生成有關接口的元數據的可能性,可以進行自動測試的單獨層以及也可以用作后端可移植性的分界點。

無論您以何種方式將其表示為帶有通配符的類似語句,您都永遠不會獲得良好的性能,因為第一個字符自動表示索引未用於該字段。 坦率地說,我們一直堅持要求用戶必須至少鍵入第一個字符才能進行搜索。 如果您的數據使他們不知道第一個字符,那么您可能有一個錯誤的設計和一個規范化問題(將多個信息存儲在一個字段中)。 缺少重新設計數據庫的方法沒有很好的解決方法。

取決於sql和您的應用程序。 我不相信有一個全面的答案,而且它可能不取決於駕駛員。

如果您可以在編寫將大量數據帶回到中間層的查詢以執行數據庫可以輕松完成的操作之間進行選擇,則建議您讓數據庫進行計算,然后簡單地返回結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM