2014-01-21 46 views
0

我有一個MS SQL 2005/2008數據庫,並試圖比較兩個數據表使用子字符串與%通配符嘗試和查找其他表中的一個字符的一個字符內的數據。MS-SQL JOIN與多個SUBSTRING和LIKE

實施例是:

UPDATE table1 
SET table1.Marker = 1 
FROM table1 
INNER JOIN table2 
ON table1.ForeignKey = table2.ID 
AND tabl1.CharacterColumn LIKE SUBSTRING(table2.CharacterColumn , 1, 5) + '%' + SUBSTRING(table2.CharacterColumn , 7, 8) 

UPDATE table1 
SET table1.Marker = 1 
FROM table1 
INNER JOIN table2 
ON table1.ForeignKey = table2.ID 
AND tabl1.CharacterColumn LIKE SUBSTRING(table2.CharacterColumn , 1, 6) + '%' + SUBSTRING(table2.CharacterColumn , 8, 8) 

目前需要一段時間來運行該程序的列可以包含最多10個字符和數據集是在300萬行一個表1(然而的也許一個數據集300k)和200萬行的表2(100k的數據集)。

我的問題是JOIN語句是在列上執行一個字符搜索的最佳方式嗎?

我不能給出確切的例子作爲數據是受保護的,但是這應該有所幫助:

表2 -

ID | FK | Name 
1 | 100 | Phillips 
2 | 100 | Bloggs 
3 | 100 | Jones 

表1 -

ID | Table2FK | Name 
1 | 100 | Philpips 
2 | 100 | Bloggs 
3 | 100 | Jones 

正如你見表2記錄1在table1記錄1的一個字符內,我想識別它。此外,一個字符可以在字符串中的任意位置

+0

你能張貼的兩張桌子一些相同的數據?可以讓你的問題更清楚 –

+0

當然,我不能給出確切的例子,因爲數據是受保護的,但是這應該有所幫助: 表2 - ID | FK |名稱 1 | 100 |菲利普斯 2 | 100 | Bloggs 3 | 100 | Jones 表1 - ID |表2FK |名稱 1 | 100 | Philpips 2 | 100 | Bloggs 3 | 100 | Jones 正如你所看到的table2記錄1在table1記錄1的一個字符內,我想識別它。此外,一個字符可以在字符串中的任何點。 – Mecster

回答

0

當您在SQL函數中包裝列時,SQL Server不再能夠使用索引。如果您擁有像您所描述的大型表,SQL Server將需要執行許多CPU密集型操作,如索引掃描。你有兩種選擇

  1. 創建帶有該子字符串的列的索引視圖。首次構建它需要更長的時間,但在此之後,您將可以輕鬆加入。

  2. 第二種替代方法是修改您的表以將字符列拆分爲兩個單獨的列,並在這兩列上創建索引。

字符串操作成本很高,最好能夠將字符串拆分成單獨的列而不是實時實現。

索引視圖文檔http://technet.microsoft.com/en-us/library/dd171921(v=sql.100).aspx

+0

感謝您的評論,我遇到的問題是該字符串在table1和table2中的長度是可變的,table1也有300k的數據加入到table2中可能的900萬行(因爲我不能使用字符串作爲連接的一部分,這將顯着減少數據集) – Mecster

+0

在這種情況下,您需要重新考慮您的存儲結構。這聽起來像是有人在沒有理解含義的情況下提出無理要求,並要求你加快速度。 – 2014-01-21 15:44:34