2012-03-16 61 views
1

我有一系列的我用T-SQL查詢正在運行速度非常慢的。我懷疑引起一些問題的一部分查詢是我必須對它們執行的一系列Cast。SQL鑄造列組高效地協同

這是問題所在。我必須將4列合併爲一個nvarchar/varchar,作爲它們的組合形成另一個表(我知道這個可怕的想法,但我堅持使用它)中的條目的(半) - 唯一鍵。

四列爲: t_orno,t_reno,t_pono,t_srnb:所有沒有索引的INT列。

我一直在這樣做的方式是像這樣:

Cast(t_orno AS nvarchar(10)) + '-' + Cast(t_reno as nvarchar(10)) + 
    '-' + Cast(t_pono as nvarchar(5)) + '-' + Cast(t_srnb as nvarchar(5)) 

不幸的是我堅持與具有這些列合併到一起。有沒有更好的方法來做到這一點?查詢需要更高效,而且必須要比單獨投射全部四種方法更好?

假設:數據庫是完全不可改變的 - 這可悲的是......(不想去那個..)

感謝您的幫助。

編輯:由於每一個請求用於在表的更多信息:

正在從查詢只含有一個指數這兩個表,並且它是在PK柱。再次請注意,這些表上沒有任何內容可以添加/更改。

表被接合包含這四個列的組合: BaanID> nvarchar的,沒有索引。

+0

您可以在問題和查詢的表使用的是加入他們的數據結構(包括索引)? – 2012-03-16 14:25:12

+0

@ MarkBannister嗯,我正在努力改進包含相當複雜的CTE的大約5種不同的查詢。提供它們並解釋發生的事情將非常困難 - 這就是爲什麼我只關注查詢的這一方面。我會嘗試添加更多信息。 – ImGreg 2012-03-16 14:29:18

+0

@MarkBannister不確定要包含哪些其他相關信息。讓我知道是否還有其他感興趣的東西。 – ImGreg 2012-03-16 14:35:53

回答

2

您是否嘗試過反向的,即分裂的「在另一個表中的條目」,「 - 」字符和鑄造各爲int - 可能會產生更好的性能?

+0

有趣。我喜歡你的想法@BarryKaye。你能給出一個分裂和/或一些有用的鏈接的基本例子。 – ImGreg 2012-03-16 14:41:07

+1

@ImGreg:根據條目格式的複雜性,您可能只使用一系列['SUBSTRING()'](http://msdn.microsoft.com/zh-cn/library/ms187748.aspx 「SUBSTRING(Transact-SQL)」)調用固定參數來刪除整數部分,或者您可能需要另外使用['CHARINDEX()'函數](http://msdn.microsoft.com/en-us /library/ms186323.aspx「CHARINDEX(Transact-SQL)」)來查找條目中數字組件的正確位置。 (你可能會搜索字符串中的''-''s並計算它們之間的子字符串的長度)。 – 2012-03-16 18:05:36

1

我會嘗試使用持久視圖並在其上創建索引。這裏有一篇文章可以幫助你:http://technet.microsoft.com/en-us/library/cc917715.aspx

或者你可以計算列含有T_ *列和索引此列的表中添加。

+0

這些索引視圖對於非常大的數據庫@Dan是否可行?包含這些關鍵4列的表格大約有400萬行,並且每天擴展大約50k。 – ImGreg 2012-03-16 14:38:30

+0

我們有一個項目的相似數字,SQL Server 2008 R2 Standard很好地處理了這些查詢。如果我是你,我會使用數據庫的備份來創建測試環境,並檢查插入/更新/刪除/選擇操作的性能。 – Dan 2012-03-16 14:42:54

+0

非常好。我一直在努力改進它們,但是數據庫的糟糕設置使它具有挑戰性。尚未充分了解查詢的性能。 *正在進行中* – ImGreg 2012-03-16 14:46:23

0

我相信這是至關重要的一點:

表被加入包含這四個列的組合:BaanID> nvarchar的,沒有索引

除非你是在處理相對小的表,將兩個表格拼在一起列入未編制索引的列表可能代價很高。