저는 사용자가 임의로 사실 테이블 집합을 쿼리하고 각 사실 테이블의 여러 차원 테이블을 제약 할 수있는보고 시스템을 개발 중입니다. 필자는 제약 조건 매개 변수를 기반으로 모든 올바른 조인과 하위 쿼리를 자동으로 어셈블하는 쿼리 작성기 클래스를 작성했으며 모든 것이 설계된대로 작동합니다.보고 쿼리 : 여러 가지 사실 테이블을 결합하는 가장 좋은 방법은 무엇입니까?
그러나 나는 가장 효율적인 쿼리를 생성하지 않는다고 생각합니다. 몇 백만 레코드가있는 테이블 집합에서이 쿼리는 실행하는 데 약 10 초가 걸리고, 1 초 미만의 범위에서 쿼리를 내리고 싶습니다. 하위 쿼리를 제거 할 수 있다면 결과가 훨씬 효율적이라는 느낌이 들었습니다.
내 실제 스키마 (훨씬 더 복잡함)를 표시하는 대신, 전체 응용 프로그램 및 데이터 모델을 설명하지 않고도 요점을 설명하는 유사한 예제를 보여 드리겠습니다.
아티스트와 장소가있는 콘서트 정보 데이터베이스가 있다고 가정 해 보겠습니다. 사용자는 임의로 아티스트와 장소에 태그를 지정할 수 있습니다. 따라서 스키마는 다음과 같습니다.
concert
id
artist_id
venue_id
date
artist
id
name
venue
id
name
tag
id
name
artist_tag
artist_id
tag_id
venue_tag
venue_id
tag_id
매우 간단합니다.
이제 'techno'및 'trombone'태그가있는 모든 아티스트의 'cheap-beer'및 'great-mosh'콘서트에서 공연 한 오늘부터 1 개월 이내에 발생한 모든 콘서트에 대한 데이터베이스를 쿼리한다고 가정 해 봅시다. - 구덩이 '꼬리표.
이 같은 모습을 마련 할 수있었습니다 가장 좋은 질의 :
이SELECT
concert.id AS concert_id,
concert.date AS concert_date,
artist.id AS artist_id,
artist.name AS artist_name,
venue.id AS venue_id,
venue.name AS venue_name,
FROM
concert
INNER JOIN (
artist ON artist.id = concert.artist_id
) INNER JOIN (
venue ON venue.id = concert.venue_id
)
WHERE (
artist.id IN (
SELECT artist_id
FROM artist_tag
INNER JOIN tag AS a on (
a.id = artist_tag.tag_id
AND
a.name = 'techno'
) INNER JOIN tag AS b on (
b.id = artist_tag.tag_id
AND
b.name = 'trombone'
)
)
AND
venue.id IN (
SELECT venue_id
FROM venue_tag
INNER JOIN tag AS a on (
a.id = venue_tag.tag_id
AND
a.name = 'cheap-beer'
) INNER JOIN tag AS b on (
b.id = venue_tag.tag_id
AND
b.name = 'great-mosh-pits'
)
)
AND
concert.date BETWEEN NOW() AND (NOW() + INTERVAL 1 MONTH)
)
쿼리가 작동하지만 그 여러 하위 쿼리를 가진 정말 좋아하지 않아 . 순전히 JOIN 논리를 사용하여 동일한 논리를 수행 할 수 있다면 성능이 크게 향상 될 것이라는 느낌이 들게됩니다.
완벽한 세계에서 나는 실제 OLAP 서버를 사용할 것입니다. 그러나 고객은 MySQL이나 MSSQL 또는 Postgres에 배포 할 것이므로 호환성있는 OLAP 엔진을 사용할 수 있다고 보장 할 수는 없습니다. 그래서 별 스키마가있는 일반 RDBMS를 사용하여 막혔습니다.
이 예제의 세부 사항에 너무 익숙해 져서는 안됩니다. (실제 응용 프로그램은 음악과는 관계가 없지만 여기에 나와있는 것과 유사한 관계의 팩트 테이블이 여러 개 있습니다.) 이 모델에서 'artist_tag'및 'venue_tag'테이블은 사실 테이블로 작동하고 그 외 모든 것은 하나의 차원입니다.
사용자가 단일 artist_tag 또는 venue_tag 값에 대해서만 제약 할 수 있도록 허용하는 경우이 예에서 쿼리 작성이 훨씬 간단하다는 점에 유의해야합니다. 쿼리가 AND 로직을 포함하도록 허용 할 때만 많은 어려움을 겪습니다. 여러 개의 별개 태그가 필요합니다.
제 궁금한 점은 여러 팩트 테이블에 대해 효율적인 쿼리를 작성하는 데 가장 좋은 기술은 무엇입니까?
내 기분이 여기에 문제의 핵심이 정말이다 "다중 팩트 테이블"보다는 쿼리의 AND 특성. (비록 서로간에 복합성을 가졌지 만) 아래에 나와있는 대답은 동일한 팩트 테이블에 여러 번 조인 할 필요없이 HAVING 절에서 쿼리의 AND 구성 요소를 수행하여이를 해결합니다. – MatBailie
해결/닫기/...로 표시 할 시간 : –