我正在编写一个导入实用程序,它将电话号码用作导入中的唯一键。
我需要检查数据库中是否不存在电话号码。问题在于数据库中的电话号码可能包含破折号和括号之类的内容,也可能包含其他内容。我写了一个删除这些东西的函数,问题是它很慢,并且数据库中有成千上万的记录,并且一次要导入成千上万的记录,所以此过程可能会令人难以接受。我已经将电话号码列作为索引。
我尝试使用这篇文章中的脚本:
T-SQL trim   (and other non-alphanumeric characters)
但这并没有加快速度。
有没有删除非数字字符的更快方法?当必须比较10,000到100,000条记录时,可以执行某些操作。
无论做什么都需要快速执行。
更新资料
考虑到人们的回应,我认为在运行导入实用程序之前,我必须清理字段。
为了回答我在其中编写导入实用程序的问题,它是一个C#应用程序。我现在正在将BIGINT与BIGINT进行比较,而无需更改数据库数据,而我仍然会因为很少的一组数据(大约2000条记录)而对性能造成冲击。
将BIGINT与BIGINT进行比较会降低速度吗?
我已尽我所能优化了应用程序的代码侧(删除了正则表达式,删除了不必要的数据库调用)。尽管我无法再将SQL隔离为问题的根源,但我仍然觉得确实如此。
最佳答案
我可能会误会,但您有两组数据要从一组中删除数据库中当前数据的字符串,然后在每次导入时从一组中删除字符串。
对于更新现有记录,我只使用SQL,那只需要发生一次。
但是,SQL并未针对这种操作进行优化,因为您说的是编写导入实用程序,所以我将在导入实用程序本身而不是在SQL中进行这些更新。这将是更好的性能选择。您在用什么编写实用程序?
另外,我可能会完全误解该过程,因此,如果不在基地上,我深表歉意。
编辑:
对于初始更新,如果使用的是SQL Server 2005,则可以尝试CLR函数。这是一个使用正则表达式的快捷方法。不确定性能如何比较,除了快速测试外,我从未使用过它。
using System;
using System.Data;
using System.Text.RegularExpressions;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString StripNonNumeric(SqlString input)
{
Regex regEx = new Regex(@"\D");
return regEx.Replace(input.Value, "");
}
};
部署之后,可以使用以下命令进行更新:
UPDATE table SET phoneNumber = dbo.StripNonNumeric(phoneNumber)