2012-08-16 137 views
0

我已經被問到以下問題,當您想要改進存儲過程性能時,您會看到什麼?存儲過程返回一些值並在其中有三個連接。 除了確保連接寫得很好之外,還可以做些什麼來使其性能更好?這是一個普遍的問題,沒有提供任何代碼。 任何想法?返回存儲過程的SQL性能

回答

0

有很多的事情可以做,優化程序,但它聽起來像是你的SQL語句是非常簡單的。有些事情要注意:

  • 內聯函數。這些可能會導致SQL按行進行逐行評估並減慢速度
  • 連接語句上的數據轉換。這些可以防止索引被使用。
  • 確保列被加入了/在where子句中被索引(對於大型數據集)

您可以檢查出這個網站獲取更多性能的技巧,但我想我介紹你最需要什麼簡單的語句:

SQL Optimizations School

+0

內聯函數與遊標不同吧?遊標也在逐行編譯。感謝您的網站,這是一個很好的來源 – sheidaei 2012-08-17 14:49:37

+0

正確的,遊標是循環數據的一種方式。內聯函數只是在查詢中計算數據的方法。如果您使用函數來計算where子句中的數據,然後將該計算與另一個值進行比較,那麼很可能SQL不會使用索引,並且它可能必須一次一行地執行計算/比較,而不是按質量進行計算/比較。 – 2012-08-17 22:27:05

2

檢查連接中使用的表上的索引。特別是,連接索引中使用了哪些列?

示例 -

SELECT  * 
FROM  SomeTable a 
    JOIN SomeOtherTable b on a.ItemId = b.ItemId 

如果這些表很大,索引ItemId兩個表中通常會有助於性能提升不少。

如果您的查詢有一個,您應該對WHERE子句中使用的任何列執行相同的操作。

WHERE a.ProductId = @SomeVariableYouPassedToTheStoredProc 

索引ProductId可能有助於在這種情況下。

查詢性能是你可以進入兔子洞的東西,但這是一個合理的(快速)開始的地方。

+0

感謝指數,比我通常不能想其他任何事,他們都是查詢具體,如使用TINYINT而不是INT等等,是不是? – sheidaei 2012-08-17 14:52:41

0

事實上,它是一個存儲過程與它沒有多大關係。優化裏面的sql。

至於如何,所有常見的嫌疑犯,包括由那種認爲你可以猜測出什麼問題的eejit寫的。

將proc中的sql複製到一個合適的工具中,並用Explain作爲前綴以查看發生了什麼。

+0

所以它與返回值無關,對吧?你正在談論存儲過程本身的sql。 – sheidaei 2012-08-17 14:53:30

+0

是的,以及它裏面的SQL。實質上,所有的存儲過程都是一個已命名和預編譯的sql塊,其中包含一些用於傳入和傳出值的修飾。 – 2012-08-17 15:40:23

0

我認爲還有其他的選擇。例如: 1.這些連接中的每一個都可以使用類似'and permited_used_name =(從user_list where選擇user_name)'的限制條件。該值可以在過程啓動過程中(我的意思是第一個過程字符串)派生一次,以避免許多類似查詢超載數據庫。 2.從Oracle11開始,您可以使用緩存結果將函數聲明爲函數(即函數計算一次,每次調用時都不重新計算),定義一組更改無效緩存的表。

在任何情況下,這個問題主要是針對數據庫的。

+0

有關Oracle11中的緩存很好的知識,你能否把我推薦給在線的好例子? – sheidaei 2012-08-17 14:51:18

0

運行查詢分析器的SQL語句

+0

謝謝,這可能是個好主意,沒有想到它 – sheidaei 2012-08-17 14:48:43