개발 Q&A

제목 WHERE IN 구문으로 최대 30개 뽑기, LIMIT 순서?
카테고리 DB
글쓴이 엽토군 작성시각 2020/06/02 17:47:38
댓글 : 1 추천 : 0 스크랩 : 0 조회수 : 8794   RSS

안녕하세요. 지금 이런 MSSQL 쿼리들을 돌리고 있습니다.

-- 쿼리1
SELECT foo_id
FROM FOO
WHERE user_id = ? -- 대충 사용자번호
GROUP BY foo_id
ORDER BY created_at DESC;
-- 쿼리2
SELECT TOP 30 * FROM BAR
JOIN DEE ON ...
LEFT JOIN MEH ON ...
WHERE DEE.foo_id IN ( ? ); -- 쿼리1에서 뽑은 foo_id 목록

FOO 테이블에서 최신순으로 키를 뽑아서 DEE 테이블의 참조값으로 지정해 최대 30개의 BAR 를 뽑는 쿼리입니다.

둘을 붙여쓰지 않고 순서대로 따로 불러서 쓰는데 왜냐하면 FOO 테이블 자체도 (로그성이라서) 무겁거니와 FOO와 BAR가 서로 다른 DB에 있다 보니 붙여쓰면 속도가 보장이 안돼서 그렇습니다.

질문은:

1. 쿼리2의 정렬은 쿼리1의 정렬과 다르게 되나요? (현재 테스트해볼 자료셋이 많지 않아서 직접 돌려보질 못했습니다. 일반적으로 어떤지 궁금합니다.)

2. 쿼리2에서 top30 으로 자르는 대신 쿼리1에서 top30 으로 자르는 건 결과나 동작이나 의미상의 차이가 있을까요?

3. 만약 쿼리2의 BAR가 CTE라면 앞의 두 질문 답은 달라지나요?

4. (번외질문) 속도를 안 늦추고 두 쿼리를 합칠 만한 노하우가 없을까요?

뭔가 성가신 질문을 한꺼번에 많이 올린 거 같은데 궁금해서 질문 올립니다. 답변 주시면 학습에 도움이 될 거 같습니다.

감사합니다.

 다음글 php 출력 (2)
 이전글 코드이그나이터로 웹페이지 만들고 나서 (4)

댓글

kaido / 2020/06/02 18:07:37 / 추천 0
-- 정확한 데이터를 몰라서 답변이 어렵긴 하나 개념만 잡자면...

1번질문은 이 차이를 질문 하고 있는것 같습니다

SELECT TOP 30 * FROM BAR
SELECT TOP 30 * FROM FOO

다른 값이 나올것으로 예상됩니다

2번 질문은  TOP30  뺀것의 차이 입니다

3번은 CTE  원론적인 대답입니다만 잘 사용하면 도움이 되겠지요?
다만 이것도 데이터 형태에 따라서 다르나, 질문 의도로 보면 CTE로 접근하셔도 좋을듯 싶습니다.

4번도 마찬가지로 데이터 형태에 따라서 다릅니다.


쿼리 설계에 왕도는 없습니다
차분하게 생각하셔서 직접 쿼리날려서 속도를 보셔야합니다
언제나 예상치 못한 결과값은 나오기 마련이죠.

차분히 생각하시면 충분히 해결점까지 도달 하실것 같습니다.  화이팅 !