아래와 같은 2개의 TABLE 이 있습니다.
사용자 TABLE 과 친구 TABLE 입니다.
CREATE TABLE TEST_USER
(
PK SERIAL PRIMARY KEY,
NICK VARCHAR( 255 )
)
CREATE TABLE TEST_FRIEND
(
PK SERIAL PRIMARY KEY,
USER_KEY NUMERIC,
FRIEND_KEY NUMERIC
)
-- 사용자 KEY INDEX
CREATE INDEX IDX_USER_KEY ON TEST_FRIEND( USER_KEY )
2개의 TABLE 을 JOIN 하여, 특정 사용자의 친구 목록과 그 친구의
NICK 을 보여주려고 합니다.
EXPLAIN ANALYZE
SELECT
TEST_USER.NICK,
TEST_FRIEND.PK
FROM
TEST_USER,
TEST_FRIEND
WHERE
FRIEND_KEY = TEST_USER.PK
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
Sort (cost=19.20..19.23 rows=12 width=520) (actual
time=0.491..0.530 rows=12 loops=1)
Sort Key: test_friend.pk
-> Merge Join (cost=17.73..18.99 rows=12 width=520) (actual
time=0.248..0.432 rows=12 loops=1)
Merge Cond: ("outer"."?column3?" =
"inner".friend_key)
-> Sort (cost=16.39..16.74 rows=140 width=520)
(actual time=0.117..0.141 rows=8 loops=1)
Sort Key: (test_user.pk)::numeric
-> Seq Scan on test_user (cost=0.00..11.40
rows=140 width=520) (actual time=0.016..0.057 rows=10
loops=1)
-> Sort (cost=1.34..1.37 rows=12 width=36) (actual
time=0.116..0.156 rows=12 loops=1)
Sort Key: test_friend.friend_key
-> Seq Scan on test_friend (cost=0.00..1.12
rows=12 width=36) (actual time=0.006..0.050 rows=12 loops=1)
Total runtime: 0.645 ms
(11 rows)
사용자 TABLE 에 10 명, 친구 TABLE 에 2명의 사용자에 각각 8명의
친구를 추가하였습니다.
이때 QUERY PLAN 은 위 결과와 같습니다.
사용자와 친구가 많지 않기 때문에 검색 결과는 금방 나오지만,
문제는 INDEX 를 검색하지 않고, 전체를 FULL SCAN 하는데요,
좀더 효과적인 JOIN 방법을 알고 싶습니다.
TEST 를 위해, 사용자 테이블에, 10000 명과, 친구 테이블에 500
사용자 당 30명의 친구를 등록해보았더니,
검색 속도가 현격히 떨어집니다.
어떻게 하면, 좀더 빠른 결과를 얻을 수 있을까요?
추가해야할 INDEX 라던가, 효과적인 JOIN 방법에 대해 질문
드립니다.
감사합니다.
|