2017-02-28 168 views
0

我有一個SSRS報告,將一串縣傳遞給存儲過程。由於我不得不構建報告,我需要爲縣附加36個字符的GUID。我然後使用子串函數剝離GUID在存儲過程:Substring函數有更快的替代嗎?

and county IN(Select substring(item, 1, LEN(item)-36) from fnsplit(@County, ',') 

報告運行在約8秒,這是在REPLACE函數的巨大改進。但我仍然希望讓這個跑得更快。有誰知道更好的方法來做到這一點?我不允許在表格中包含索引,所以這不是一個選項。

+0

看看這裏http://stackoverflow.com/questions/3828374/relative-performance-in-sqlserver-of-substring-vs-a-right-left-combo。 –

+0

如果子字符串確實是問題,聽起來很奇怪。你確定這不是fnsplit導致你的問題?你應該真的包含整個語句,查詢計劃,因爲這是一個函數,所以最好還要查看計劃緩存中的性能統計信息。 –

+0

fnsplit在三個不同的變量上運行,但運行速度非常快。只有當我添加了substring()時,它才放慢了速度。當我查看函數的執行計劃時,它只顯示兩個表格插入的成本爲50%。有沒有一種好的方法來查看變量的統計信息?我只能在運行執行計劃時插入一條記錄來代替變量。 – jackstraw22

回答

0

如果你先將它加載到一個表變量中,那麼內連接,你可能會最大化你的速度。

DECLARE @COUNTYLIST TABLE ([County] varchar(36) PRIMARY KEY); 
INSERT INTO @COUNTYLIST ([County]) 
    Select substring(item, 1, LEN(item)-36) from fnsplit(@County, ',') 

SELECT ... 
FROM ... INNER JOIN @COUNTYLIST as [CountyList] 
    ON ...[County] = [CountyList].[County] 
+1

由於最可能估計包含1行,因此您可能還想嘗試'option(recompile)'發生的情況 - 假設您的報告不經常執行,重新編譯就成爲問題。 –

+0

不幸的是,這不起作用,因爲我需要將@county參數傳遞迴SSRS,並且表變量不以這種方式工作。也許創建另一個臨時表而不是表變量會起作用。我必須在早上嘗試。 – jackstraw22

+0

我又壞了。它確實有效。 – jackstraw22