2010-01-19 82 views
5

我是一位在T-SQL中完成一些基本數據庫工作的C#開發人員。但是,我需要編寫一個非常複雜的存儲過程,遠高於我的T-SQL知識。SQL Server 2008 CLR與T-SQL:有效率/速度差異嗎?

使用.net CLR作爲SQL Server 2008的一部分在C#中編寫存儲過程是否會導致我的存儲過程效率低於使用T-SQL編寫的過程?差異(如果有的話)是否顯着?爲什麼?

回答

8

CLR需要一些通信開銷(傳遞CLRSQL Server之間的數據)

規則拇指的是:

  • 如果您的邏輯主要包含的大量的數據集,轉換其可以使用set操作執行,然後使用TSQL

  • 如果您的邏輯主要包含相對較少數據量的複雜計算,請使用CLR

隨着設置操作可以做得比看起來更多。如果您在此發佈您的要求,我們可能會提供幫助。

+0

我們談論的通信開銷有多大?我確實有大量的數據,但我也正在做複雜的計算,而不是設置操作。 – 2010-01-19 23:42:56

+0

'@ bytenik':這在很大程度上取決於你打算用數據做什麼。例如,內置的SQL集合函數的工作速度是CLR集合的3倍。如果您打算加入兩個記錄集,則需要開發並將連接硬編碼到'CLR'中,而「SQL Server」有幾個本地算法並選擇最合適的算法,這可能會通過訂單提高性能數量級。另一方面,'SQL Server'缺少運行聚合,'CLR'可以幫助很大。我需要看到你的要求給出更具體的答案。 – Quassnoi 2010-01-19 23:56:31

5

請參閱Performance of CLR Integration

本主題討論一些 設計選擇,加強與微軟.NET框架 公共語言運行庫 (CLR)的Microsoft SQL Server集成 的 性能。

0

「在SQL Server 2008中使用.net CLR將C#中的存儲過程寫入存儲過程是否會導致我的存儲過程效率低於使用T-SQL編寫的過程?實在太寬泛而無法給出有意義的答案。效率變化很大,這取決於你在做什麼類型的操作,而且還有你如何去做這些操作。您可以擁有一個CLR存儲過程,該過程應該超出等效的T-SQL Proc,但實際上由於編碼不佳而變差,反之亦然。

考慮到問題的一般性質,我可以說「一般情況下」可以在T-SQL中完成的事情(沒有太多複雜性)可能應該在T-SQL中完成。一個可能的例外可能是TVF,因爲CLR API有一個非常有趣的選項來回傳結果(我爲SQL Server Central寫了一篇文章 - 免費註冊 - 約STVFs)。但是,如果沒有CLR和T-SQL版本的代碼並且都使用生產級數據進行測試(即使寫得不好的代碼通常在10k行或更少的情況下執行得足夠好),也無法確切知道。

所以這裏的真正的問題歸結爲:

我知道C#比我更瞭解T-SQL。我該怎麼辦?

在這種情況下,最好簡單地問一下如何解決T-SQL中的這個特定任務。這很可能是有不復雜的解決方案,你只是不知道發生着呢,但將能夠在學習的功能/技術/等明白,你仍然可以代碼SQLCLR同等解決方案並比較它們之間的表現。但是如果在T-SQL中處理它沒有令人滿意的答案,那麼在SQLCLR中執行。這就是說,我在3年前就SQLCLR與T-SQL Performance進行了一項研究,並在Simple-Talk上公佈了結果。