2014-01-21 45 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