2010-09-30 47 views
10

這是一個基於性能的問題,而不是「I don't understand」或「best practice」的問題。SQLServer的子串與左右組合的相對性能

我有一個SQLServer數據庫中的varchar字段,保證長度超過7個字符。 我需要提取由varchar中第2,3,4和5個字符組成的char(4)字段。

例如,如果varchar的值爲1234567890我會查找2345部分。

在左右組合上使用子串是否有性能優勢?

SELECT SUBSTRING(account,2,4) FROM payment 

SELECT RIGHT(LEFT(account,5),4) FROM payment 

我以注意到輕微優勢右左表上有1760335條記錄,但我不知道這是由於緩存查詢或喜歡。

UPDATE 我已經做了更多的功課。看來在這種情況下,右側最終是作爲右側子字符串執行的。這是一個規則嗎?或者它只是SQLServer決定爲這個特定的貓皮膚的方式? alt text

+0

只有在你的情況下才能確定基準... – 2010-09-30 06:48:05

回答

2

+1對於一個有趣的問題。您對SQL Server可能通過優化顯着更改每條語句的評估可能是準確的;與您的評估相同,在這樣一個大集合中,SQL Server可能能夠比另一個更好地緩存一個查詢。其他

兩件事情浮現在腦海中,可能是(依稀)相關:

  • 內存消耗;我會很好奇,如果左/右組合消耗略多內存。理論上,第一個函數的返回值需要被存儲,以便它可以被傳遞到第二個函數中,儘管同一個寄存器可能被反覆使用。

  • 界限檢查。 varchar基本上是一個指向char []的開始的指針,帶有2個額外的字節用於指示長度。這表明,通過查看包含在這兩個字節中的值來確保它不在範圍之外時,需要通過索引訪問值時執行某種邊界檢查。使得既字符的字符串的限制之外請求時和VARCHAR處理

SQL Server也是非常寬容的。下面的代碼將運行沒有任何錯誤。

DECLARE @Test varchar(50); 
SET @Test = 'Hello World'; 
SELECT substring(@Test, 2, 4); 
SELECT substring(@Test, 2000, 5000); 

所以會:

SELECT right(left(@test, 500), 400); 

我的猜測是,對於回答你的問題的解釋在於相關的東西;不幸的是,我不知道知道您的問題的答案。

如果你使用更長的字符串或char和varchar獲得相同的性能結果,我會好奇的。這些測試可以產生對SQL Server內部的更多見解。