0

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

WHERE MyColumn BETWEEN "SomeText" AND "SomeTextZZZ"

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

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

WHERE MyColumn LIKE "*SomeText*"

但似乎在“开始于”查询上使用索引:

WHERE MyColumn LIKE "SomeText*"

是一个如此明显的优化,以至于 Jet/ACE 团队会实施它。

任何人都可以提供文档基准测试证明以一种或另一种方式解决这个问题吗?

4

2 回答 2

2

感谢 @cularis 提出 JETSHOWPLAN 的想法。我自己没有想到它,我觉得有点傻。以下是 Access 2007 中的结果:

之间:
01) 限制表Vendors的行
    使用索引“全名”
    用于表达式“Vendors.FullName between "S" And "SZZZ"”

喜欢(开头):
01) 限制表Vendors的行
    使用索引“全名”
    对于表达式“Vendors.FullName Like “S*””

喜欢(包含):
01) 限制表Vendors的行
    通过扫描
    测试表达式 "Vendors.FullName Like "*S*""

LIKE(以结尾):
01) 限制表Vendors的行
    通过扫描
    测试表达式 "Vendors.FullName Like "*S""

从我的 showplan.out 文件的摘录中可以看出,kludgy BETWEEN 和 LIKE(开头)都使用了索引。这与通过扫描表(即一次检查每一行)过滤的 LIKE(包含)和 LIKE(结束于)形成对比。

当我周一回到我的 Access 2002 副本时,我将在 ACE Jet 之前的引擎上重新运行测试(尽管我希望得到类似的结果,尤其是基于 @David 在他对我最初问题的评论中的经验) .

于 2011-07-16T03:09:31.080 回答
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""

所以完全一样的pre-ACE。

于 2011-07-15T09:05:20.557 回答