Query Planner hakkında

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--

Browse pgsql-tr-genel by date

  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