SQL 通配符搜索 - 效率?

标签 sql sql-server sql-server-2008 query-optimization processing-efficiency

最近,关于使用 LIKE 和通配符搜索 MS SQL 数据库的最有效方法存在争论。我们正在使用 %abc%%abcabc% 进行比较。有人说过,术语末尾应该始终有通配符 (abc%)。因此,根据他们的说法,如果我们想找到以“abc”结尾的内容,那么使用 `reverse(column) LIKE reverse('%abc') 是最有效的。

我使用 SQL Server 2008 (R2) 设置了一个测试来比较以下每个语句:

select * from CLMASTER where ADDRESS like '%STREET'
select * from CLMASTER where ADDRESS like '%STREET%'   
select * from CLMASTER where ADDRESS like reverse('TEERTS%')  
select * from CLMASTER where reverse(ADDRESS) like reverse('%STREET')

CLMASTER 保存了大约 500,000 条记录,大约有 7,400 个以“Street”结尾的地址,以及大约 8,500 个以“Street”结尾但不一定在结尾的地址。每次测试运行花费 2 秒,除了 %STREET% 之外,它们都返回相同数量的行,它发现了额外的 900 个左右的结果,因为它获取了末尾带有公寓号码的地址。

由于 SQL Server 测试在执行时间上没有显示出任何差异,因此我转向 PHP,其中使用了以下代码,在每个语句中进行切换,以快速运行多个测试:

<?php

    require_once("config.php");
    $connection = odbc_connect( $connection_string, $U, $P );

    for ($i = 0; $i < 500; $i++) {
    $m_time = explode(" ",microtime());
    $m_time = $m_time[0] + $m_time[1];

    $starttime = $m_time;

    $Message=odbc_exec($connection,"select * from CLMASTER where ADDRESS like '%STREET%'");
    $Message=odbc_result($Message,1);

    $m_time = explode(" ",microtime());
    $m_time = $m_time[0] + $m_time[1];

    $endtime = $m_time;

    $totaltime[] = ($endtime - $starttime);

}

odbc_close($connection);

echo "<b>Test took and average of:</b> ".round(array_sum($totaltime)/count($totaltime),8)." seconds per run.<br>";
echo "<b>Test took a total of:</b> ".round(array_sum($totaltime),8)." seconds to run.<br>";

?>

此测试的结果与在 SQL Server 中测试的结果一样不明确。

%STREET 在 166.5823 秒内完成(每次查询平均 0.3331 秒),平均在 0.0228 秒内找到 500 个结果。

%STREET% 在 149.4500 秒内完成(每次查询平均 0.2989 秒),平均在 0.0177 秒内找到 500 个结果。 (每个结果的时间更快,因为它在相似的时间内找到的结果比其他结果更多。)

reverse(ADDRESS) 像reverse('%STREET') 在 134.0115 秒内完成(每个查询平均 0.2680 秒),平均在 0.0183 秒内找到 500 个结果。

reverse('TREETS%') 在 167.6960 秒内完成(每次查询平均 0.3354 秒),平均在 0.0229 秒内找到 500 个结果。

我们预计此测试会显示 %STREET% 整体上最慢,但实际上它运行速度最快,并且返回 500 个结果的平均时间最好。虽然建议的 reverse('%STREET') 整体运行速度最快,但返回 500 个结果的时间稍慢。

额外的乐趣:当我们运行测试时,一位同事在服务器上运行了分析器,发现使用双通配符会显着增加 CPU 使用率,而其他测试之间的差异在 1-2% 以内。

是否有任何 SQL 效率专家可以解释为什么在搜索字符串末尾使用通配符比在开头使用通配符更好,也许为什么在字符串开头和结尾使用通配符搜索比在字符串开头和结尾使用通配符搜索更快通配符就在开头吗?

最佳答案

如果该列已建立索引,则在字符串末尾添加通配符(如 'abc%')将会有所帮助,因为它能够直接查找到以 'abc' 开头并忽略其他所有内容的记录。开头有通配符意味着它必须查看每一行,无论索引如何。

好文章here有更多解释。

关于SQL 通配符搜索 - 效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11795770/

相关文章:

sql - postgres - 比较两个数组

sql - 在动态查询中替换列名

sql - 如何使用 SQL Server 在此查询中按天对结果进行分组?

c# - SQLSERVER 2008 重复执行select语句导致CPU使用率高

sql-server-2008 - 使用 Native Client 10 将 TDateTime 字段插入 SQL 2008 DB

java - 关闭资源命令

java - 如何显示数据库中的一行?

sql - 存储二维稀疏数组(二维稀疏矩阵)的最佳方式是什么?它在 VoltDB 中的大小是多少?

sql - 执行表更改脚本删除 Azure SQL 表

c# - 获取 SQL 数据并将其显示在文本框中?