2016-06-02 5 views
0

와일드 카드로 작성된 일부 이름을 가져 오기 작업을 수행하는 시나리오가 있습니다. 와일드 카드 이름은 75k 이상일 수 있습니다.Teradata를 사용하는 휘발성 테이블의 IN 절 또는 내부 조인의 성능

사례 1 : 나는 IN 절을 시도하고 좋아하지만, 이상 2500 스프링 JDBC를 사용하여 절에 이름을 parametered 허용하지 않습니다. 그래서, 나는 모든 요청과 병행하여 비동기 요청이 2500 와일드 카드 이름

SELECT NAME FROM DB.TABLE_A 
    WHERE NAME LIKE ANY (:wildcarded_names) 


Map<String, Object> paramMap = new HashMap<String, Object>(); 
paramMap.put("wildcarded_names", wildcarded_names); 

SqlRowSet rowSet = getNamedParameterJdbcTemplate().queryForRowSet(query, paramMap); 

Set<String> names = new HashSet<String>(); 

while (rowSet.next()) { 
    names.add(rowSet.getString("NAME"));    
} 

사례 2가 포함되어 사용 : 테라 데이타의 휘발성 테이블을 생성하고, 모든 와일드 카드 이름을 삽입하고 LIKE 절을 innerjoin 사용을

SELECT NAME 
    FROM DB.TABLE tbl 
    INNER JOIN volatile_table vtbl ON vtbl.NAME LIKE tbl.NAME 

어느 것이 더 효율적이며 더 나은 성능을 제공합니까?

+0

측정 ... 데이터 양에 따라 다를 수도 있습니다. 또한'in' 절이 개별 값에 포함 할 수있는 정도는 사용중인 데이터베이스에 따라 다를 수도 있습니다. –

+0

또한 단 하나의 컬럼을 가지고 있다면'queryForList' 메소드를 사용하는 것이 좋습니다. 그것은'SqlRowSet'의 오버 헤드를 줄여줍니다. –

+0

NAME 열만 선택 하시겠습니까? ~ 75k wildcarded_names를 전달하면 db에 몇 개의 레코드가 있습니까? – sura2k

답변

0

최대 75K 개의 값을 가질 수있는 경우 휘발성 테이블이 더 나은 옵션 일 수 있습니다. 옵티마이 저는 IN 목록 성능을 개선하기 위해 TD 13.10을 개선했지만 여전히 한계가 있습니다. 휘발성 테이블의 경우 PI에 대한 통계를 포함해야하며 PI와 다른 경우 열을 조인해야합니다.