From: | Devrim GUNDUZ <devrim(at)gunduz(dot)org> |
---|---|
To: | PostgreSQL Turkiye <pgsql-tr-genel(at)postgresql(dot)org> |
Subject: | Query Planner hakkında |
Date: | 2005-03-17 07:32:51 |
Message-ID: | Pine.LNX.4.61.0503170914400.1890@emo.org.tr |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-tr-genel |
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
--8323328-2074986501-1111044379=:1890
Content-Type: TEXT/PLAIN; CHARSET=iso-8859-9; FORMAT=flowed
Content-Transfer-Encoding: 8BIT
Content-ID: <Pine(dot)LNX(dot)4(dot)61(dot)0503170927001(dot)1890(at)emo(dot)org(dot)tr>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Merhaba,
Row estimation üzerine çalışırken bir sorunum oldu. Önce ortamı tanıtayım:
* PostgreSQL 8.0.1
* Tablo :
#\d dl_list
Table "public.dl_list"
Column | Type | Modifiers
- ----------------+--------------------------+---------------
dl_ip | inet |
file_id | integer | not null
indirme_tarihi | timestamp with time zone | default now()
Indexes:
"dl_ip_idx" btree (dl_ip)
"dl_list_file_id_idx" btree (file_id)
"file_id_idx" btree (file_id)
Triggers:
"RI_ConstraintTrigger_83251" AFTER INSERT OR UPDATE ON dl_list FROM
dl_file_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE
PROCEDURE "RI_FKey_check_ins"('dl_file_list_exists', 'dl_list',
'dl_file_list', 'UNSPECIFIED', 'file_id', 'file_id')
Şimdi, amacım file_id < 20 olduğu zamanki satır hesaplamalarını kontrol
etmek:
# EXPLAIN SELECT * from dl_list WHERE file_id < 20;
QUERY PLAN
- ---------------------------------------------------------------
Seq Scan on dl_list (cost=0.00..1337.78 rows=24180 width=23)
Filter: (file_id < 20)
(2 rows)
Tamam seqscan yapacak... Devam:
# SELECT relpages,reltuples FROM pg_class WHERE relname='dl_list';
relpages | reltuples
- ----------+-----------
496 | 67342
Az önce vacuumladığım için veriler doğru. 67342 kayıt var tabloda.
Şimdi verinin dağılımına bakalım:
# SELECT histogram_bounds FROM pg_stats WHERE tablename='dl_list' AND
attname='file_id';
histogram_bounds
- ------------------------------------
{3,13,21,24,28,41,64,70,79,88,100}
# SELECT attname, n_distinct,most_common_vals FROM pg_stats WHERE
tablename='dl_list' AND attname='file_id';
attname | n_distinct | most_common_vals
- ---------+------------+--------------------------------
file_id | 78 | {18,16,17,19,78,7,81,44,29,27}
Tamam... Şimdi EXPLAIN satırındaki 24180'e yakın bir değer hesaplamam
gerekiyor. < 20 demiştik. histogram_bounds'a bakınca, bunun 13 ve 21
aralığında olduğunu görebiliyoruz. Formül şu:
selectivity = (1+(20-13)/(21-13))/10;
= 0.1875
reltuples 67342 idi.
satır_sayısı = 67342 * 0.1875
= 12626
Ancak EXPLAIN çıktısına bakınca 24180 sayısını veriyor :(
EXPLAIN ANALYZE dersek az biraz sonuç değişiyor ama o kabul edilen
sınırlar içerisinde:
# EXPLAIN ANALYZE SELECT * from dl_list WHERE file_id < 20;
QUERY PLAN
- --------------------------------------------------------------------------------------------------------------
Seq Scan on dl_list (cost=0.00..1337.78 rows=24180 width=23) (actual
time=0.051..80.152 rows=23540 loops=1)
Filter: (file_id < 20)
Total runtime: 106.278 ms
Bu farkın nedeni ne olabilir? 12626 ile 23540 arasinda yari yariya fark
var :(
Saygılar,
- --
Devrim GUNDUZ
devrim~gunduz.org, devrim~PostgreSQL.org, devrim.gunduz~linux.org.tr
http://www.tdmsoft.com http://www.gunduz.org
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
iD8DBQFCOTKqtl86P3SPfQ4RAuHwAKCubkITgun2qSl4iOv+zKnY/G2b3ACbBAo5
jsKc5jyay13IO9r7/9iw3e0=
=RXAK
-----END PGP SIGNATURE-----
--8323328-2074986501-1111044379=:1890--
From | Date | Subject | |
---|---|---|---|
Next Message | AL ELK | 2005-03-17 11:31:20 | Re: Tasarmcya gereksinmemiz var |
Previous Message | Devrim GUNDUZ | 2005-03-15 09:07:46 | Re: TasarımcıyA |