biri şimdilik 25000 diğeri 30000 satırdan oluşan iki tablom var. Sorguların çalışması uzun sürüyor, özellikle de genel bir arama yaparsam (anahtar kelimeyi boş geçersem 20sn birkaç harf-sayı yazarsam 5-6sn). Sorun QT den kaynaklanıyor sanmıştım ancak sorgu yalın halleriyle de çok zaman alıyor. Aşağıda tabloları ve C++\Qt4 arama kodlarını veriyorum.
tablolar ÅŸu ÅŸekilde:
CREATE TABLE stok
(
stokid serial NOT NULL,
stokisim character varying,
birim character varying,
grup integer,
kod integer,
kullanim integer,
model integer,
ozel integer,
tip integer,
agirlik_birim integer DEFAULT 1,
agirlik_brt numeric(12,3),
agirlik_net numeric(12,3),
boyut_birim integer DEFAULT 1,
boyut_en numeric(12,3),
boyut_boy numeric(12,3),
boyut_yukseklik numeric(12,3),
hacim_birim integer DEFAULT 1,
hacim_brt numeric(12,3),
hacim_net numeric(12,3),
stok_not text,
stok_kdv_orani numeric(4,2),
CONSTRAINT stok_pkey PRIMARY KEY (stokid)
)
WITHOUT OIDS;
ALTER TABLE stok OWNER TO postgres;
GRANT ALL ON TABLE stok TO postgres;
GRANT ALL ON TABLE stok TO public;
CREATE INDEX stok_stokid_index
ON stok
USING btree
(stokid);
ve
CREATE TABLE stokindex
(
parcano character varying NOT NULL,
stokid bigint NOT NULL,
stokxnot text,
sorulma bigint DEFAULT 0,
CONSTRAINT stokindex_pkey PRIMARY KEY (parcano),
CONSTRAINT stokindex_stokid_fkey FOREIGN KEY (stokid)
REFERENCES stok (stokid) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
)
WITHOUT OIDS;
ALTER TABLE stokindex OWNER TO postgres;
CREATE INDEX stokindex_stokid_index
ON stokindex
USING btree
(stokid);
CREATE INDEX stokindex_pno_index
ON stokindex
USING btree
(parcano);
Nasıl indexlemem gerektiğini anlamış değilim, b-tree, r-tree, hash... Anladığım kadarıyla tamsayı = <> gibi işlemlerde b-tree daha doğru. Bir de AND kollandığım sorgular için farklı indexler mı oluşturmalıyım? indexler normal SELECT komutlarımızla işlerlik kazanır mı yoksa onlardan faydalanmak için sorguları farklı şekilde mi düzenlemeliyiz?
1) hangi tip index kullanmalıyım (=, ~* için)?
2) index oluşturmak çalışmaları için yeterli mi?
3) AND, OR, LEFT JOIN kullandığım sorgular için birden fazla column mı indexlemeliyim?
not:kodları yazışımdaki sebep "benim yerime yazın" kolaycılığı değil yanlış anlamayın, yalnızca çalışma sistemini göstermek istedim.
...
QString arananStokNo = lineStokParcaAra->text();
QString arananAciklama = lineStokAcikAra->text();
QString arananMakina = comboMakina->currentText();
query = "SELECT stokid, stokisim FROM stok WHERE stokid IN (SELECT stokid FROM stokindex WHERE parcano~*'" + arananStokNo + "') AND stokisim~*'" + arananAciklama + "'";
if (radioMakina->isChecked())
{ // bu şart genelde kapalı durumdadır
query += " AND stokid IN
(SELECT makinaindex.stokid FROM makinaindex, makina WHERE
makinaindex.makinaid=makina.makinaid AND makina.makina_isim ~*'" + arananMakina + "')";
}
anas.exec(query);
while(anas.next())
{
QSqlQuery parnox;
parnox.exec("SELECT parcano FROM stokindex WHERE stokid=" + stokno + " ORDER BY sorulma DESC");
int iR=1;
while(parnox.next())
{
// i->setText(0, parnox.value(0).toString());
}
...
Uygar UZUNHASAN
uygaruzunhasan@yahoo.com
____________________________________________________________________________________
Never miss a thing. Make Yahoo your home page.
http://www.yahoo.com/r/hs
_______________________________________________
Linux-programlama mailing list
Linux-programlama_at_liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama
Received on Tue 08 Jan 2008 - 16:32:40 EET