我有一个MS SQL 2005/2008数据库,并尝试使用带有%wildcard的子字符串比较两个数据表,以尝试查找其他表中列的一个字符内的数据。
示例是:
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个字符,数据集位于3亿个行的表1(但数据集可能为300k)和2个行的表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
如您所见,table2记录1在table1记录1的一个字符内,我想识别它。此外,一个字符可以出现在字符串中的任何位置
答案 0 :(得分:0)
在SQL函数中包装列时,SQL Server不再能够使用索引。如果您有像您所描述的大型表,SQL Server将需要执行许多CPU密集型操作,如索引扫描。你有2个选择
使用该子字符串的列创建索引视图。第一次构建它需要更长的时间,但之后您将能够轻松加入。
第二种方法是修改表以将字符列拆分为两个单独的列,并在这两列上创建索引。
字符串操作非常昂贵,最好能够将字符串拆分为单独的列,而不是实时执行。
索引视图文档http://technet.microsoft.com/en-us/library/dd171921(v=sql.100).aspx