我需要测试一个字符串(带有完整路径的文件名)是否在 MSSQL 中包含另一个字符串。
我的脚本需要检查我们即将提交的文件是否存在于数据库中的特定列(预挂钩脚本)下。
我无法真正更改列的数据定义,但我们目前使用的是文本TEXT
,文件由换行符分隔。我尝试使用 TSQL 函数CONTAINS
,但整体性能不是很好。
将所有数据加载到 PHP 数组中并在本地进行比较会更好吗?
我不太确定这里最好的方法是什么。
更新:数据库中有大约 194 530 行。
我需要测试一个字符串(带有完整路径的文件名)是否在 MSSQL 中包含另一个字符串。
我的脚本需要检查我们即将提交的文件是否存在于数据库中的特定列(预挂钩脚本)下。
我无法真正更改列的数据定义,但我们目前使用的是文本TEXT
,文件由换行符分隔。我尝试使用 TSQL 函数CONTAINS
,但整体性能不是很好。
将所有数据加载到 PHP 数组中并在本地进行比较会更好吗?
我不太确定这里最好的方法是什么。
更新:数据库中有大约 194 530 行。
使用LIKE
运算符怎么样?你可以做这样的事情
SELECT * FROM TABLE WHERE COLUMN LIKE '%' + @FilePath +'%'
如果这不符合您的需求,那么我同意以编程方式执行此操作可能会更好。问题是 SQL 使用基于集合的逻辑,所以当你开始做一些更程序化的事情(函数)时,它就会崩溃。显然,运行测试,但以编程方式你应该能够更快地做到这一点。您可以使用正则表达式或包含或任何可能在 php 中最好的
我认为这会更快:
SELECT TOP 1 columnname FROM tablename WHERE COLUMN LIKE '%' + @FilePath +'%'
在通过字符串进行搜索时要记住的主要事情是您要限制正在搜索的字符串的长度。现在,您有多个路径+文件名值隐藏在一个行列对中 - 正如我上面提到的,这是很差的规范化(并且是您在查找时遇到问题的部分原因)。
鉴于您无法真正更改遇到问题的表的架构,更好的选择可能是创建一个结构来处理描述存储在特定行中的文件的元数据。
例如,一个选项可能是创建一个包含filename
-rowID
对的表,其中原始表的每一行都链接到该行列中的已解析文件名TEXT
。这使您可以选择通过首先查找较短的字符串 (the filename
) 来限制搜索,然后使用该约束来帮助搜索较少数量的行以满足路径+文件名组合并获得唯一结果。
如果您有大量具有相同名称的文件,则另一种选择可能是使用rowID
原始表中的 s 和该行中每个路径+文件名的哈希值CHECKSUM()
或您可用的任何哈希函数来实现哈希索引。
使用像这样的“索引”表确实会增加开销:您必须在原始表更新时维护元数据,但这也意味着您提前完成繁重的工作并使未来的数据查询速度更快。