2015-02-05 2 views
2

"IN"술어를 사용하여 쿼리해야하지만 jOOQ는 "IN"을 "EXISTS"+ 2x 중첩 된 선택 항목으로 렌더링합니다. 그러나 DB2에서는 "IN"이 훨씬 빠릅니다 (500ms 대 8s). 내 "IN"술어를 DSL API를 통해 설명 할 때와 동일한 방식으로 렌더링하도록 jOOQ를 강제 적용 할 수 있습니까?jOOQ - EXISTS 대신 IN을 렌더링하십시오.

샘플 코드 :

try (Connection connection = DriverManager.getConnection("jdbc:h2:mem:")) { 
    Settings settings = new Settings().withRenderFormatted(true); 
    DSLContext ctx = DSL.using(connection, SQLDialect.SQL99, settings); 
    ctx 
    .createTable("FOOBAR") 
    .column("FOO", SQLDataType.INTEGER) 
    .column("BAR", SQLDataType.INTEGER) 
    .execute(); 
    String sql = ctx 
    .select() 
    .from(DSL.tableByName("FOOBAR")) 
    .where(
     DSL.row(DSL.fieldByName("FOO")).in(ctx 
      .select(DSL.fieldByName("BAR")) 
      .from(DSL.tableByName("FOOBAR")) 
     ) 
    ) 
    .getSQL(); 
    System.out.println(sql); 
} 

결과 :

select * 
from "FOOBAR" 
where exists (
    select "alias_2"."alias_2_0" 
    from (
    select "BAR" 
    from "FOOBAR" 
) "alias_2"("alias_2_0") 
    where ("FOO") = ("alias_2"."alias_2_0") 
) 
+0

왜 DB2 방언을 사용하지 않습니까? –

+0

무료 버전에 포함되지 않는 이유는 무엇입니까? ;) – LoganMzz

+2

우리의 땀과 눈물이 DB2 통합 작업을하기 때문에 보상을 받아야합니다! –

답변

2

SQLDialect.SQL99 방언은 현명 이름이되지 않았습니다. 그것은 모든 데이터베이스에서 실행되어야하는 SQL을 생성 할 것이라고 제안하지만 이는 정확하지 않습니다. 그냥 "기본"SQL을 생성합니다. 이것은 jOOQ 3.6에서 수정 될 것입니다 : #3844

DB2 데이터베이스에서 사용할 SQL 생성을 최적화하려면 대신 SQLDialect.DB2 dialect를 사용해야합니다. 여기에서 만난 문제는 유일한 것이 아닙니다 ...

+0

기본값과 SQL-99는 나와 비슷한 소리입니다 (적어도이 경우). "IN"을 사용할 때 "IN"이 기본값 (SQL 표준)으로 렌더링 될 것으로 예상됩니다. "상업적 코드 정리"로 인해 예기치 않은 행동이되고 (수정 될 예정) 위대한 일에 대해 "보상을 받으려면"원하는 제한입니까? – LoganMzz

+0

@mlogan : "SQL99"또는 "DEFAULT"방언에서 의미있는 결과를 기대해서는 안됩니다. "UNKNOWN"또는 "DONTCARE"라고도 부를 수 있습니다 ... 나는이 경우 IN 대신 아마도 렌더링되어야한다고 동의하지만, "DEFAULT"라면 렌더링에 의존하면 안됩니다. 디버깅 할 때 (그리고 사용 가능한 구체적인 dialect가 없을 때)'toString()'구현에 사용됩니다. –