2017-11-24 6 views
0

foo%のような単語の後にワイルドカードを使用して検索したいときに、LIKEを使用するときにインデックスを使用するように設定するにはどうすればよいですか?この例では、パラメータバインディングの有無を参照してください。私はパラメータの例でtableScanを防止したい。LIKEを使用したSQLパラメータ?%force use index

私はH2データベースでSpringBootアプリケーションを使用しています。パラメータなし

問合せ:

SELECT * 
FROM (SELECT resource_id FROM SEARCH_TABLE_874 WHERE word LIKE 'su%') 
GROUP BY resource_id ORDER BY COUNT (*) DESC LIMIT 100 

実行計画:パラメータを持つ

SELECT 
    _1.RESOURCE_ID 
FROM (
    SELECT 
     RESOURCE_ID 
    FROM PUBLIC.SEARCH_TABLE_874 
    WHERE WORD LIKE 'su%' 
) _1 
    /* SELECT 
     RESOURCE_ID 
    FROM PUBLIC.SEARCH_TABLE_874 
     /++ PUBLIC.IDX_SEARCH_TABLE_874_WORD: WORD >= 'su' 
      AND WORD < 'sv' 
     ++/ 
    WHERE WORD LIKE 'su%' 
    */ 
GROUP BY RESOURCE_ID 
ORDER BY =COUNT(*) DESC 
LIMIT 100` 

問合せ:

`SELECT * FROM (SELECT resource_id FROM SEARCH_TABLE_874 WHERE word LIKE :param) GROUP BY resource_id ORDER BY COUNT (*) DESC LIMIT 100` 

実行計画:

`SELECT 
    _10.RESOURCE_ID 
FROM (
    SELECT 
     RESOURCE_ID 
    FROM PUBLIC.SEARCH_TABLE_874 
    WHERE WORD LIKE CONCAT(?1, '%') 
) _10 
    /* SELECT 
     RESOURCE_ID 
    FROM PUBLIC.SEARCH_TABLE_874 
     /++ PUBLIC.SEARCH_TABLE_874.tableScan ++/ 
    WHERE WORD LIKE CONCAT(?1, '%') 
    */ 
GROUP BY RESOURCE_ID 
ORDER BY =COUNT(*) DESC 
LIMIT 100 

クエリの発信元詳細:

これは検索エンジン向けです。

クエリ文字列としてコードによってStringに生成され、その後、同様に実行される:iは、クエリの前にEXPLAIN書いた実行計画の

Query query = session.createNativeQuery(queryString); 
query.setParameter("param", "foo%"); 
query.getFirstResult() 

。その構造は、UNIONを使用して多くのサブ選択を行うことができるためです。

+0

どのdbmsを使用していますか? (そのクエリは製品固有です。) – jarlh

+0

私はdbmsを使用しません。質問の最後に私の編集を見てください。 – Christian

答えて

0

解決策は、パラメータなしでクエリの実行計画にあります。私は今LIKE 'foo%の代わりにWORD >= 'foo' AND WORD < 'fop'を使用しています。したがって、データベースは索引を使用できます。

関連する問題