php - 在 MSSQL 中测试一个字符串是否包含另一个字符串的最有效方法是什么?

标签 php performance svn sql-server-2000 pre-commit-hook

我需要测试一个字符串(文件名及其完整路径)是否包含 MSSQL 中的另一个字符串。

我的脚本需要检查我们要提交的文件是否存在于数据库中的特定列(预 Hook 脚本)下。

我无法真正更改列的数据定义,但我们当前使用文本 TEXT 并且文件由换行符分隔。我尝试使用TSQL函数CONTAINS,但整体性能不太好。

将所有数据加载到 PHP 数组中并在本地进行比较是一个更好的主意吗?

我不太确定这里最好的方法是什么。

更新:数据库中约有 194 530 行。

最佳答案

在字符串中进行搜索时要记住的主要事情是您要限制正在搜索的字符串的长度。现在,您有多个路径+文件名值塞入单个行列对中 - 正如我上面提到的,这是标准化得很差的(并且是您在查找时遇到困难的部分原因)。

鉴于您无法真正更改遇到问题的表的架构,更好的替代方案可能是创建一个结构来处理描述存储在特定行中的文件的元数据。

例如,一个选项可能是创建一个包含 filename-rowID 对的表,其中原始表的每一行都链接到解析出的文件名在该行的 TEXT 列中。这使您可以选择通过首先查找较短的字符串(文件名)来限制搜索,然后使用该约束来帮助搜索较少的行数以满足路径+文件名组合并取得独特的成果。

如果您有大量具有相同名称的文件,另一个选择可能是使用原始表中的 rowID 以及该行中每个路径+文件名的哈希来实现哈希索引使用 CHECKSUM() 或任何可用的哈希函数。

使用像这样的“索引”表确实会增加开销:您必须在原始表更新时维护元数据,但这也意味着您要提前完成繁重的工作并在将来查询数据快得多。

关于php - 在 MSSQL 中测试一个字符串是否包含另一个字符串的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9876659/

相关文章:

php - 计算总数

php - Laravel 迁移自引用外键问题

python - 有没有办法绕过 Python list.append() 随着列表的增长而在循环中逐渐变慢?

带有 LDAP 的 svnserve

java - 可在已编译的 GWT 包中访问 SVN 修订号

php - 从字符串 php 正则表达式中提取大于 4 位的数字

php - 替换文本中的单词忽略 url

performance - Apache Benchmark - 随机查询字符串?

sql - 做性能测试时如何避免出现SQL Server的 "rebuild statistics"?

git - 将 Subversion 存储库迁移到 Git 并永久删除其中的一部分