2017-11-24 19 views
0

foo %와 같은 단어 뒤에 와일드 카드로 검색하려는 경우 매개 변수 바인딩을 사용하여 LIKE (더 나은 해결책 일까?)를 사용할 때 인덱스를 강제로 사용할 수 있습니까? 매개 변수 바인딩을 사용하거나 사용하지 않는이 예를 참조하십시오. 나는 매개 변수 예제에서 tableScan을 막고 싶습니다.LIKE?가있는 SQL 매개 변수 force 강제 색인 사용

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 
,

검색어가 제공된 세부 정보 :

검색 엔진 용입니다.

쿼리 문자열로 코드 문자열로 생성 한 다음처럼 실행 : 나 쿼리 앞 설명해 둔 실행 플랜

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'을 사용합니다. 따라서 데이터베이스는 색인을 사용할 수 있습니다.