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を使用して多くのサブ選択を行うことができるためです。
どのdbmsを使用していますか? (そのクエリは製品固有です。) – jarlh
私はdbmsを使用しません。質問の最後に私の編集を見てください。 – Christian