2010-02-21 2 views
3

이 문제에 대한 많은 게시물을 이미 보았습니다 (하위 쿼리는 sqlite에서 매우 느립니다). 하지만 난 SQL과 정말 잘 아니에요 내가 뭘 할 수 있는지 모르겠어요. 2 (select with subquery는 sqlite에서 약 1 분, SQL Server에서 1 분 미만

SELECT * FROM data d WHERE d.category = 3 AND 
(SELECT COUNT(id) FROM data_tag WHERE data = d.id AND (tag = 2136 OR tag = 8)) >= 2 
ORDER BY id ASC 

내가 3 개 테이블 데이터 태그 data_tag (데이터 및 태그 ㎚) 모든 데이터는 N 개의 태그를 가지고 있고,이 쿼리 나 태그에 의해 datas 검색 :

이런 쿼리가 태그 모두 데이터에 있어야합니다)

나는 SQL Server에서 sqlite로 데이터베이스를 전환하고이 쿼리 외에도 모든 것이 잘 작동합니다. SQL Server에서이 작업을 수행하는 데 1 초 미만이 소요되었으며 sqlite에서는 약 1 분이 소요됩니다. plz 나에게 조언을 해줘.

+0

SQLite에서'data_tag'에 대한 귀하의 색인은 무엇입니까? – Tomalak

답변

3
SELECT d.* FROM data d 
INNER JOIN data_tag ON data_tag.data = d.id AND (tag = 2136 OR tag = 8) 
WHERE d.category = 3 
GROUP BY d.id 
HAVING COUNT(data_tag.id) >= 2 
ORDER BY id ASC 
+0

물론'SELECT *'와'GROUP BY d.id'가 같이 쓰여졌습니까? – Tomalak

+1

sqlite에서 예. – codeholic

+0

그냥 묻습니다. ;) 정확하지 않은 스타일 (IMO)은 아니지만 작동하는 경우. – Tomalak

1

시도 :

SELECT d.* 
    FROM DATA d 
    JOIN (SELECT dt.data, 
       COUNT(id) AS num_tags 
      FROM DATA_TAG dt 
      WHERE dt.tag IN (2136, 8) 
     GROUP BY dt.data 
      HAVING COUNT(id) >= 2) x ON x.data = d.id 
ORDER BY d.id 

이 ORDER BY에 ASC 필요하지 않습니다 - 그 기본입니다.

+0

아무데도 사용하지 않으므로 'COUNT (ID)'를 선택할 필요가 없습니다. 또한 SQLite가 임시 테이블에 인덱스를 투영 할 수 있는지 확실하지 않은 경우 실제 조인이 더 잘 작동 할 수도 있습니다. – Tomalak

+0

@Tomalak : 예, 나중에 행 별칭을 수정했을 때 실현되었습니다. 비록 부정적인 영향을 미치지 않아야합니다. –

+0

그래, 한 줄의 코드 일 뿐이야. 인덱스가 작동하면 훨씬 더 흥미 롭습니다. – Tomalak

관련 문제