2011-07-14 37 views
0

我記得在某處讀取以避免Jet SQL中的LIKE運算符,因爲它不會利用列上的索引。所以很長一段時間前,我開始編寫查詢這樣的「開頭」:Jet/ACE使用帶有LIKE BeginsWith查詢的索引嗎?

WHERE MyColumn BETWEEN "SomeText" AND "SomeTextZZZ" 

只要有對MyColumn列的索引,該BETWEEN將採取指數的優勢。我現在開始質疑我的方式。 BETWEEN方法從來沒有讓我失望,但感覺很糟糕。

我可以理解爲什麼一個「包含」查詢無法使用索引:

WHERE MyColumn LIKE "*SomeText*" 

但好像在使用索引「開始」查詢:

WHERE MyColumn LIKE "SomeText*" 

是這是Jet/ACE團隊實施它的明顯優化。

誰能提供文檔標杆證明解決這個問題的一種方式或其他?

+0

我一直以爲它使用索引。它似乎比「contains」或「ends with」標準更快,所以我一直認爲這意味着它以某種方式使用索引。在Jet 3.5數據庫引擎程序員指南(Jet發佈的唯一有關文檔)中,我找不到任何關於它的信息。 –

+0

更新了我的訪問2003的答案。 – Jacob

回答

1

您可以使用SHOWPLAN.OUT文件來分析查詢的執行計劃。我可以提交測試。

編輯:

結果查詢中獲取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。

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文件的摘錄看到的,缺憾BETWEEN和LIKE(開始)都使用索引。這與LIKE(包含)和LIKE(以...結尾)形成對比,其被掃描表格(即,一次檢查每行一個)。

當我週一回到Access 2002的副本時,我將重新運行ACE之前的Jet引擎的測試(儘管我期待類似的結果,尤其是基於@ David在他的評論中的經驗我原來的問題)。