복붙노트

[SQL] 최대 절전 모드 연합 대안

SQL

최대 절전 모드 연합 대안

어떤 대안 나는 최대 절전 모드를 사용하여 통합 쿼리를 구현해야합니까? 내가 최대 절전 순간에 통합 쿼리를 지원하지 않습니다 알고, 바로 지금은 노동 조합을 만들어 볼 수있는 유일한 방법은보기 테이블을 사용하는 것입니다.

다른 옵션은 일반 JDBC를 사용하는 것입니다,하지만 난 내 모든 예 / 기준 쿼리 케이크를 풀어 것이이 방법뿐만 아니라, 최대 절전 모드 매핑 검증이 테이블 / 컬럼에 대한 최대 절전 모드를 수행한다.

해결법

  1. ==============================

    1.사용 VIEW. 당신도 많이 중복이되지 않도록 동일한 클래스는, 엔티티 이름을 사용하여 다른 테이블 / 뷰에 매핑 할 수 있습니다. 그 수행, 거기 확인을 작동합니다.

    사용 VIEW. 당신도 많이 중복이되지 않도록 동일한 클래스는, 엔티티 이름을 사용하여 다른 테이블 / 뷰에 매핑 할 수 있습니다. 그 수행, 거기 확인을 작동합니다.

    일반 JDBC 또 다른 숨겨진 문제가 : 뭔가가 트랜잭션이 끝날 때까지 캐시 및 최대 절전 모드 세션에서 플러시되지있어 그렇다면, 최대 절전 모드 세션 캐시의 인식이다, JDBC 쿼리를 찾을 수 없습니다. 아주 가끔 수수께끼 수 있습니다.

  2. ==============================

    2.당신은에서 (선택 ...에서 ID) 또는 ID에 ID를 사용할 수 있습니다 (에서 ID를 선택 ...)

    당신은에서 (선택 ...에서 ID) 또는 ID에 ID를 사용할 수 있습니다 (에서 ID를 선택 ...)

    예를 들면 대신 비 작업의

    from Person p where p.name="Joe"
    union
    from Person p join p.children c where c.name="Joe"
    

    당신은 할 수

    from Person p 
      where p.id in (select p1.id from Person p1 where p1.name="Joe") 
        or p.id in (select p2.id from Person p2 join p2.children c where c.name="Joe");
    

    MySQL을 사용 적어도, 당신은하지만, 나중에와 성능 문제로 실행됩니다. 그것은의 대신 두 개의 쿼리에 조인 가난한 사람을 때로는 쉽게 :

    // use set for uniqueness
    Set<Person> people = new HashSet<Person>((List<Person>) query1.list());
    people.addAll((List<Person>) query2.list());
    return new ArrayList<Person>(people);
    

    그것은 하나의 복잡한 것보다는 두 가지 간단한 쿼리를 수행하는 것이 좋습니다.

    편집하다:

    예를 들기 위해 여기가 부속 용액으로부터 얻어진 MySQL의 쿼리의 결과를 EXPLAIN이다 :

    mysql> explain 
      select p.* from PERSON p 
        where p.id in (select p1.id from PERSON p1 where p1.name = "Joe") 
          or p.id in (select p2.id from PERSON p2 
            join CHILDREN c on p2.id = c.parent where c.name="Joe") \G
    *************************** 1. row ***************************
               id: 1
      select_type: PRIMARY
            table: a
             type: ALL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 247554
            Extra: Using where
    *************************** 2. row ***************************
               id: 3
      select_type: DEPENDENT SUBQUERY
            table: NULL
             type: NULL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: NULL
            Extra: Impossible WHERE noticed after reading const tables
    *************************** 3. row ***************************
               id: 2
      select_type: DEPENDENT SUBQUERY
            table: a1
             type: unique_subquery
    possible_keys: PRIMARY,name,sortname
              key: PRIMARY
          key_len: 4
              ref: func
             rows: 1
            Extra: Using where
    3 rows in set (0.00 sec)
    

    대부분의 중요한 것은, 1 행은 인덱스를 사용하고 20 만 개 + 행을 고려하지 않습니다. 나쁜! 모두 하위 쿼리는 밀리 초에있는 알의이 쿼리의 실행은 0.7s했다.

  3. ==============================

    3.나는 블라디미르에 동의해야합니다. 나도 HQL에 UNION을 사용하여에 보니 주위에 방법을 찾을 수 없습니다. 이상한 것은 내가 UNION은 UNION에 관한 버그 리포트, '고정'문은 UNION에서 잘립니다, 그리고 사람들의 다른 뉴스 그룹이 작동보고 할 것이라고 말하는 사람들의 뉴스 그룹 표시된 지원되지 않는 것으로 (최대 절전 모드 FAQ를) 찾을 수 있었다 좋아... 그것으로 일 처리의 하루를 보낸 후, 나는 일반 SQL 내 HQL 백 포팅하지만, 좋은 옵션이 될 것 데이터베이스의보기에 그 일을 결국. 내가 대신 코드에서 SQL을 구축했다 그래서 내 경우, 쿼리의 부분은 동적으로 생성되었다.

    나는 블라디미르에 동의해야합니다. 나도 HQL에 UNION을 사용하여에 보니 주위에 방법을 찾을 수 없습니다. 이상한 것은 내가 UNION은 UNION에 관한 버그 리포트, '고정'문은 UNION에서 잘립니다, 그리고 사람들의 다른 뉴스 그룹이 작동보고 할 것이라고 말하는 사람들의 뉴스 그룹 표시된 지원되지 않는 것으로 (최대 절전 모드 FAQ를) 찾을 수 있었다 좋아... 그것으로 일 처리의 하루를 보낸 후, 나는 일반 SQL 내 HQL 백 포팅하지만, 좋은 옵션이 될 것 데이터베이스의보기에 그 일을 결국. 내가 대신 코드에서 SQL을 구축했다 그래서 내 경우, 쿼리의 부분은 동적으로 생성되었다.

  4. ==============================

    4.나는 HQL에서 조합과 (나는 많은 고생하는) 하나 개의 중요한 시나리오에 대한 해결책을 가지고 있습니다.

    나는 HQL에서 조합과 (나는 많은 고생하는) 하나 개의 중요한 시나리오에 대한 해결책을 가지고 있습니다.

    예를 들면 대신 작업하지 : -

    select i , j from A a  , (select i , j from B union select i , j from C) d where a.i = d.i 
    

    또는

    select i , j from A a  JOIN (select i , j from B union select i , j from C) d on a.i = d.i 
    

    당신은 최대 절전 모드 HQL에서 할 수있는 ->

    Query q1 =session.createQuery(select i , j from A a JOIN B b on a.i = b.i)
    List l1 = q1.list();
    
    Query q2 = session.createQuery(select i , j from A a JOIN C b on a.i = b.i)
    List l2 = q2.list();
    

    다음 U는 두 목록을 추가 할 수 있습니다 ->

    l1.addAll(l2);
    
  5. ==============================

    5.뷰는 더 나은 방법이지만 HQL은 일반적으로 목록 또는 설정을 반환하기 때문에 ... 당신은 list_1.addAll (list_2)를 할 수 있습니다. 완전히 노동 조합에 비해 안됐다 만 작동합니다.

    뷰는 더 나은 방법이지만 HQL은 일반적으로 목록 또는 설정을 반환하기 때문에 ... 당신은 list_1.addAll (list_2)를 할 수 있습니다. 완전히 노동 조합에 비해 안됐다 만 작동합니다.

  6. ==============================

    6.아마도 내가 해결하기보다 직선 앞으로 문제가 있었다. 내 '에 대한 예'는 JPA 제공자로 최대 절전 모드와 JPA했다.

    아마도 내가 해결하기보다 직선 앞으로 문제가 있었다. 내 '에 대한 예'는 JPA 제공자로 최대 절전 모드와 JPA했다.

    나는 효과적으로 '모든 노동 조합'교체, 자신을 돌아 다중 선택과 결합 된 컬렉션에 세 가지 선택 (두 번째 경우 두)을 분할합니다.

  7. ==============================

    7.나도이 고통을 겪었 - 쿼리가 동적으로 (예를 들어, 최대 절전 모드 기준)를 생성하는 경우 다음 내가 그것을 할 수있는 실용적인 방법을 찾을 수 없습니다.

    나도이 고통을 겪었 - 쿼리가 동적으로 (예를 들어, 최대 절전 모드 기준)를 생성하는 경우 다음 내가 그것을 할 수있는 실용적인 방법을 찾을 수 없습니다.

    나를 위해 좋은 뉴스는 오라클 데이터베이스에 사용 '또는'때 난 단지 성능 문제를 해결하기 위해 노동 조합을 조사했다이었다.

    (나뿐만 아니라 페이징 결과를하고 싶었다 특히 이후) 추한 나를 위해 충분한 동안 패트릭 게시 해결책은 (프로그래밍 세트를 사용하여 결과를 결합).

  8. ==============================

    8.패트릭의 말처럼, 각각의 선택에 목록을 추가하는 것은 좋은 생각이지만 UNION ALL 같은 역할을 기억합니다. 개체가 이미 최종 컬렉션 여부 첨가하면 이러한 부작용을 피하기 위해, 단지 제어한다. 어떤 경우에는 추가하지 않습니다. 당신이 반복이 당신에 대해 관심을 가져야한다는 뭔가 다른 각 SELECT에 가입 당신은 어떤이있는 경우, 결과는 객체 배열의 목록이 될 것입니다 (목록 ) 그래서 이상 단지 당신이 필요로하는 개체를 유지 . 그것이 작동하는 희망.

    패트릭의 말처럼, 각각의 선택에 목록을 추가하는 것은 좋은 생각이지만 UNION ALL 같은 역할을 기억합니다. 개체가 이미 최종 컬렉션 여부 첨가하면 이러한 부작용을 피하기 위해, 단지 제어한다. 어떤 경우에는 추가하지 않습니다. 당신이 반복이 당신에 대해 관심을 가져야한다는 뭔가 다른 각 SELECT에 가입 당신은 어떤이있는 경우, 결과는 객체 배열의 목록이 될 것입니다 (목록 ) 그래서 이상 단지 당신이 필요로하는 개체를 유지 . 그것이 작동하는 희망.

  9. ==============================

    9.여기에 특별한 경우이지만, 자신의 작업 주위를 만들 수 영감을 수 있습니다. 여기에 목표는 기록이 특정 기준을 충족하는 경우 두 개의 서로 다른 테이블에서 레코드의 총 수를 계산하는 것입니다. 나는이 기술은 당신이 여러 테이블 / 소스에서에서 데이터를 집계해야하는 경우에 작동합니다 생각합니다.

    여기에 특별한 경우이지만, 자신의 작업 주위를 만들 수 영감을 수 있습니다. 여기에 목표는 기록이 특정 기준을 충족하는 경우 두 개의 서로 다른 테이블에서 레코드의 총 수를 계산하는 것입니다. 나는이 기술은 당신이 여러 테이블 / 소스에서에서 데이터를 집계해야하는 경우에 작동합니다 생각합니다.

    명명 된 쿼리를 호출하는 코드가 짧고 달콤한 그래서 나는 특별한 중간 클래스 설정을 가지고,하지만 당신은 당신이 일반적으로 쿼리를 실행하기 위해 명명 된 쿼리와 함께 사용하는 어떤 방법을 사용할 수 있습니다.

    QueryParms parms=new QueryParms();
    parms.put("PROCDATE",PROCDATE);
    
    Long pixelAll = ((SourceCount)Fetch.row("PIXEL_ALL",parms,logger)).getCOUNT();
    

    당신이 여기에서 볼 수 있듯이, 명명 된 쿼리는 노동 조합 문처럼 엄청 많이 찾기 시작합니다 :

    @Entity
    @NamedQueries({
            @NamedQuery(
                name  ="PIXEL_ALL",
                query = "" +
                        "  SELECT new SourceCount(" +
                        "     (select count(a) from PIXEL_LOG_CURR1 a " +
                        "       where to_char(a.TIMESTAMP, 'YYYYMMDD') = :PROCDATE " +
                        "     )," +
                        "     (select count(b) from PIXEL_LOG_CURR2 b" +
                        "       where to_char(b.TIMESTAMP, 'YYYYMMDD') = :PROCDATE " +
                        "     )" +
                        ") from Dual1" +
                        ""
        )
    })
    
    public class SourceCount {
        @Id
        private Long   COUNT;
    
        public SourceCount(Long COUNT1, Long COUNT2) {
            this.COUNT = COUNT1+COUNT2;
        }
    
        public Long getCOUNT() {
            return COUNT;
        }
    
        public void setCOUNT(Long COUNT) {
            this.COUNT = COUNT;
        }
    }
    

    여기에 마법의 일부는 더미 테이블을 만들고 그것으로 하나 개의 레코드를 삽입하는 것입니다. 내 경우, 내 데이터베이스가 오라클이기 때문에이 dual1,하지만 난 당신이 더미 테이블을 부르는 중요한 생각하지 않는다라는 이름의.

    @Entity
    @Table(name="DUAL1")
    public class Dual1 {
        @Id
        Long ID;
    }
    

    당신의 더미 레코드를 삽입하는 것을 잊지 마세요 :

    SQL> insert into dual1 values (1);
    
  10. from https://stackoverflow.com/questions/201023/hibernate-union-alternatives by cc-by-sa and MIT license