Использует ли Jet / ACE индексы с запросом LIKE BeginsWith? - PullRequest
0 голосов
/ 15 июля 2011

Я помню, что где-то читал, чтобы избежать оператора LIKE в Jet SQL, потому что он не будет использовать индексы для столбца.Так, давным-давно я начал писать запросы «начинается с», например:

WHERE MyColumn BETWEEN "SomeText" AND "SomeTextZZZ"

Пока в столбце MyColumn есть индекс, BETWEEN будет использовать этот индекс.Я начинаю подвергать сомнению мои пути теперь.Подход BETWEEN никогда не подводил меня, но он кажется неуклюжим.

Я могу понять, почему в запросе "содержимого" нельзя использовать индекс:

WHERE MyColumn LIKE "*SomeText*"

Но похоже, что он используетиндекс по запросу «начинается с»:

WHERE MyColumn LIKE "SomeText*"

является настолько очевидной оптимизацией, что команда Jet / ACE могла бы ее реализовать.

Может ли кто-нибудь предоставить документация или доказательство сравнительного анализа для решения этого вопроса так или иначе?

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Спасибо @cularis за идею JETSHOWPLAN.Я чувствую себя немного глупо, что не думаю об этом сам.Вот результаты в Access 2007:

BETWEEN:
01) Restrict rows of table Vendors
    <i>using index</i> 'FullName'
    for expression "Vendors.FullName Between "S" And "SZZZ""

LIKE (begins with):
01) Restrict rows of table Vendors
    <i>using index</i> 'FullName'
    for expression "Vendors.FullName Like "S*""

LIKE (contains):
01) Restrict rows of table Vendors
    <i>by scanning</i>
    testing expression "Vendors.FullName Like "*S*""

LIKE (ends with):
01) Restrict rows of table Vendors
    <i>by scanning</i>
    testing expression "Vendors.FullName Like "*S""

Как вы можете видеть из выдержек из моего файла showplan.out, оба kludgy BETWEEN и LIKE (начинаются с) оба используют индекс.Это контрастирует с LIKE (содержит) и LIKE (заканчивается), которые фильтруются сканированием таблицы (т. Е. Проверкой каждой строки по одному).

Когда я возвращаюсь кВ понедельник, когда я получу копию Access 2002, я перезапущу тест на реактивном двигателе до ACE (хотя я ожидаю аналогичных результатов, особенно на основании опыта @ Дэвида в его комментарии к моему первоначальному вопросу).

1 голос
/ 15 июля 2011

Вы можете использовать файл 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.

...