[SQL] 최대 절전 모드 연합 대안
SQL최대 절전 모드 연합 대안
어떤 대안 나는 최대 절전 모드를 사용하여 통합 쿼리를 구현해야합니까? 내가 최대 절전 순간에 통합 쿼리를 지원하지 않습니다 알고, 바로 지금은 노동 조합을 만들어 볼 수있는 유일한 방법은보기 테이블을 사용하는 것입니다.
다른 옵션은 일반 JDBC를 사용하는 것입니다,하지만 난 내 모든 예 / 기준 쿼리 케이크를 풀어 것이이 방법뿐만 아니라, 최대 절전 모드 매핑 검증이 테이블 / 컬럼에 대한 최대 절전 모드를 수행한다.
해결법
-
==============================
1.사용 VIEW. 당신도 많이 중복이되지 않도록 동일한 클래스는, 엔티티 이름을 사용하여 다른 테이블 / 뷰에 매핑 할 수 있습니다. 그 수행, 거기 확인을 작동합니다.
사용 VIEW. 당신도 많이 중복이되지 않도록 동일한 클래스는, 엔티티 이름을 사용하여 다른 테이블 / 뷰에 매핑 할 수 있습니다. 그 수행, 거기 확인을 작동합니다.
일반 JDBC 또 다른 숨겨진 문제가 : 뭔가가 트랜잭션이 끝날 때까지 캐시 및 최대 절전 모드 세션에서 플러시되지있어 그렇다면, 최대 절전 모드 세션 캐시의 인식이다, JDBC 쿼리를 찾을 수 없습니다. 아주 가끔 수수께끼 수 있습니다.
-
==============================
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.나는 블라디미르에 동의해야합니다. 나도 HQL에 UNION을 사용하여에 보니 주위에 방법을 찾을 수 없습니다. 이상한 것은 내가 UNION은 UNION에 관한 버그 리포트, '고정'문은 UNION에서 잘립니다, 그리고 사람들의 다른 뉴스 그룹이 작동보고 할 것이라고 말하는 사람들의 뉴스 그룹 표시된 지원되지 않는 것으로 (최대 절전 모드 FAQ를) 찾을 수 있었다 좋아... 그것으로 일 처리의 하루를 보낸 후, 나는 일반 SQL 내 HQL 백 포팅하지만, 좋은 옵션이 될 것 데이터베이스의보기에 그 일을 결국. 내가 대신 코드에서 SQL을 구축했다 그래서 내 경우, 쿼리의 부분은 동적으로 생성되었다.
나는 블라디미르에 동의해야합니다. 나도 HQL에 UNION을 사용하여에 보니 주위에 방법을 찾을 수 없습니다. 이상한 것은 내가 UNION은 UNION에 관한 버그 리포트, '고정'문은 UNION에서 잘립니다, 그리고 사람들의 다른 뉴스 그룹이 작동보고 할 것이라고 말하는 사람들의 뉴스 그룹 표시된 지원되지 않는 것으로 (최대 절전 모드 FAQ를) 찾을 수 있었다 좋아... 그것으로 일 처리의 하루를 보낸 후, 나는 일반 SQL 내 HQL 백 포팅하지만, 좋은 옵션이 될 것 데이터베이스의보기에 그 일을 결국. 내가 대신 코드에서 SQL을 구축했다 그래서 내 경우, 쿼리의 부분은 동적으로 생성되었다.
-
==============================
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.뷰는 더 나은 방법이지만 HQL은 일반적으로 목록 또는 설정을 반환하기 때문에 ... 당신은 list_1.addAll (list_2)를 할 수 있습니다. 완전히 노동 조합에 비해 안됐다 만 작동합니다.
뷰는 더 나은 방법이지만 HQL은 일반적으로 목록 또는 설정을 반환하기 때문에 ... 당신은 list_1.addAll (list_2)를 할 수 있습니다. 완전히 노동 조합에 비해 안됐다 만 작동합니다.
-
==============================
6.아마도 내가 해결하기보다 직선 앞으로 문제가 있었다. 내 '에 대한 예'는 JPA 제공자로 최대 절전 모드와 JPA했다.
아마도 내가 해결하기보다 직선 앞으로 문제가 있었다. 내 '에 대한 예'는 JPA 제공자로 최대 절전 모드와 JPA했다.
나는 효과적으로 '모든 노동 조합'교체, 자신을 돌아 다중 선택과 결합 된 컬렉션에 세 가지 선택 (두 번째 경우 두)을 분할합니다.
-
==============================
7.나도이 고통을 겪었 - 쿼리가 동적으로 (예를 들어, 최대 절전 모드 기준)를 생성하는 경우 다음 내가 그것을 할 수있는 실용적인 방법을 찾을 수 없습니다.
나도이 고통을 겪었 - 쿼리가 동적으로 (예를 들어, 최대 절전 모드 기준)를 생성하는 경우 다음 내가 그것을 할 수있는 실용적인 방법을 찾을 수 없습니다.
나를 위해 좋은 뉴스는 오라클 데이터베이스에 사용 '또는'때 난 단지 성능 문제를 해결하기 위해 노동 조합을 조사했다이었다.
(나뿐만 아니라 페이징 결과를하고 싶었다 특히 이후) 추한 나를 위해 충분한 동안 패트릭 게시 해결책은 (프로그래밍 세트를 사용하여 결과를 결합).
-
==============================
8.패트릭의 말처럼, 각각의 선택에 목록을 추가하는 것은 좋은 생각이지만 UNION ALL 같은 역할을 기억합니다. 개체가 이미 최종 컬렉션 여부 첨가하면 이러한 부작용을 피하기 위해, 단지 제어한다. 어떤 경우에는 추가하지 않습니다. 당신이 반복이 당신에 대해 관심을 가져야한다는 뭔가 다른 각 SELECT에 가입 당신은 어떤이있는 경우, 결과는 객체 배열의 목록이 될 것입니다 (목록
) 그래서 이상 단지 당신이 필요로하는 개체를 유지 . 그것이 작동하는 희망. 패트릭의 말처럼, 각각의 선택에 목록을 추가하는 것은 좋은 생각이지만 UNION ALL 같은 역할을 기억합니다. 개체가 이미 최종 컬렉션 여부 첨가하면 이러한 부작용을 피하기 위해, 단지 제어한다. 어떤 경우에는 추가하지 않습니다. 당신이 반복이 당신에 대해 관심을 가져야한다는 뭔가 다른 각 SELECT에 가입 당신은 어떤이있는 경우, 결과는 객체 배열의 목록이 될 것입니다 (목록
) 그래서 이상 단지 당신이 필요로하는 개체를 유지 . 그것이 작동하는 희망. -
==============================
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);
from https://stackoverflow.com/questions/201023/hibernate-union-alternatives by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server 인덱스 - 오름차순 또는 내림차순, 어떤 차이가 확인합니까? (0) | 2020.03.27 |
---|---|
[SQL] 어떻게 Laravel 쿼리 빌더를 사용하여 하위 쿼리에서 선택? (0) | 2020.03.27 |
[SQL] 어떻게 테이블에서 가장 큰 ID가 전체 행을 선택합니까? (0) | 2020.03.26 |
[SQL] 어떻게 오라클 SQL Developer에서 변수를 사용합니까? (0) | 2020.03.26 |
[SQL] 최대 절전 모드 기준 API에서 SQL을 얻는 방법 (*하지 * 로깅) (0) | 2020.03.26 |