Jet / ACE是否使用带有LIKE BeginsWith查询的索引?

时间:2011-07-14 21:01:51

标签: ms-access jet ms-jet-ace

我记得在某处读取以避免Jet SQL中的LIKE运算符,因为它不会利用列上的索引。所以很久以前我开始写这样的“开头”查询:

WHERE MyColumn BETWEEN "SomeText" AND "SomeTextZZZ"

只要MyColumn列上有索引,BETWEEN就会利用该索引。我现在开始质疑我的方式。 BETWEEN的方法从来没有真正让我失望,但感觉很糟糕。

我可以理解为什么“包含”查询不能使用索引:

WHERE MyColumn LIKE "*SomeText*"

但似乎在“开头”查询中使用索引:

WHERE MyColumn LIKE "SomeText*"

是一个明显的优化,Jet / ACE团队会实现它。

任何人都可以提供 文档 基准测试 来解决这个问题吗?

2 个答案:

答案 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。