MySQL만 쓰다가 innodb를 써도 서브쿼리등 기능이 미약한거같아서
postgreSQL로 바꿔서 태스트해보고 있는데요..
몇가지 이상한점이 있어서...
1. postgreSQL에는 tinyint가 없나요? int2부터 있는거같은데..
2. PgSQL user 매뉴얼보면 cost,rows,width에 대해 설명이 되있는데
잘 이해가 안가서..
cost는 데이타가 저장된 disk page fetch하는 개수라고 되있는데
----------------------------------------------------------
Sort (cost=1.23..1.23 rows=9 width=7)
-> Seq Scan on t2 (cost=0.00..1.09 rows=9 width=7)
EXPLAIN
-----------------------------------------------------------
이렇게 나오면 1차로 sort하는데 1.23disk page를 스캔해서 소트한다음
그걸 2차로 스캔하는데 그게 0~1.09disk page가 된다는 얘기인가요?
3. pgsql의 문제인거같은데
인덱스가 없을때 table t2의 실행계획을 보면
rows가 1000이 나옵니다. 분명 9개row만 들어있는데...
order by no하면 69.83이라는 엄청난...
또 인덱스가 있어도 where절 썼는데 인덱스 사용을 안하네요..
(전에 mysql쓸때 인덱스를 양수로 하고 desc쓰면
인덱스 안쓰는 경우가 있어서 음수로 했는데 postgreSQL은 상관없네요)
postgres=# select * from t2;
no | data
-----+------
-1 | a
-2 | b
-3 | d
-4 | p
-5 | q
-6 | 1
-8 | e
-9 | y
-10 | p
(9 rows)
인덱스 없을떄
postgres=# explain select * from t2;
NOTICE: QUERY PLAN:
Seq Scan on t2 (cost=0.00..20.00 rows=1000 width=7)
EXPLAIN
postgres=# explain select * from t2 order by no;
NOTICE: QUERY PLAN:
Sort (cost=69.83..69.83 rows=1000 width=7)
-> Seq Scan on t2 (cost=0.00..20.00 rows=1000 width=7)
EXPLAIN
postgres=# explain select * from t2 where no='-5';
NOTICE: QUERY PLAN:
Seq Scan on t2 (cost=0.00..22.50 rows=5 width=7)
EXPLAIN
인덱스가 있을때
postgres=# explain select * from t2;
NOTICE: QUERY PLAN:
Seq Scan on t2 (cost=0.00..1.09 rows=9 width=7)
EXPLAIN
postgres=# explain select * from t2 order by no;
NOTICE: QUERY PLAN:
Sort (cost=1.23..1.23 rows=9 width=7)
-> Seq Scan on t2 (cost=0.00..1.09 rows=9 width=7)
EXPLAIN
postgres=# explain select * from t2 where no='-5';
NOTICE: QUERY PLAN:
Seq Scan on t2 (cost=0.00..1.11 rows=1 width=7)
EXPLAIN
mysql만 쓰다보니 쉬운거에 넘 익숙해져서...
왠지 모든게 다 어렵게 느껴지는 TT;
|