我记得在某处读取以避免Jet SQL中的LIKE运算符,因为它不会利用列上的索引。所以很久以前我开始写这样的“开头”查询:
WHERE MyColumn BETWEEN "SomeText" AND "SomeTextZZZ"
只要MyColumn列上有索引,BETWEEN就会利用该索引。我现在开始质疑我的方式。 BETWEEN的方法从来没有真正让我失望,但感觉很糟糕。
我可以理解为什么“包含”查询不能使用索引:
WHERE MyColumn LIKE "*SomeText*"
但似乎在“开头”查询中使用索引:
WHERE MyColumn LIKE "SomeText*"
是一个明显的优化,Jet / ACE团队会实现它。
任何人都可以提供 文档 或 基准测试 来解决这个问题吗?
答案 0 :(得分:2)
感谢@cularis的JETSHOWPLAN理念。我不觉得自己有点傻。以下是Access 2007中的结果:
BETWEEN: 01) Restrict rows of table Vendors using index 'FullName' for expression "Vendors.FullName Between "S" And "SZZZ"" LIKE (begins with): 01) Restrict rows of table Vendors using index 'FullName' for expression "Vendors.FullName Like "S*"" LIKE (contains): 01) Restrict rows of table Vendors by scanning testing expression "Vendors.FullName Like "*S*"" LIKE (ends with): 01) Restrict rows of table Vendors by scanning testing expression "Vendors.FullName Like "*S""
从我的showplan.out文件的摘录中可以看出,kludgy BETWEEN和LIKE(以...开头)都使用了索引。这与LIKE(包含)和LIKE(以...结尾)形成对比,后者通过扫描表进行过滤(即,一次检查每一行)。
当我在星期一回到我的Access 2002副本时,我将重新运行pre-ACE Jet引擎上的测试(虽然我期望得到类似的结果,特别是基于@David在他对我的评论中的经验原始问题)。
答案 1 :(得分:1)
您可以使用SHOWPLAN.OUT
文件来分析查询的执行计划。我会在能够的时候提交测试。
修改强>
您对Access 2003的查询结果:
BETWEEN:
01) Restrict rows of table Vendors
using index 'FullName'
for expression "FullName Between "S" And "SZZZ""
LIKE (begins with):
01) Restrict rows of table Vendors
using index 'FullName'
for expression "FullName Like "S*""
LIKE (contains):
01) Restrict rows of table Vendors
by scanning
testing expression "FullName Like "*S*""
LIKE (ends with):
01) Restrict rows of table Vendors
by scanning
testing expression "FullName Like "*S""
完全相同的前ACE。