Bu View Yeterince Hızlımı ?

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Bu View Yeterince Hızlımı ?

Mesaj gönderen armadillo »

S.A.
Aşağıdaki verilere bakarak VT nin İleriki durumları için performans yorumu yapmak mümkünmü? Birde bu fetch olayı hakkında bana bilgi verebilirmisiniz.

bu degerler içerisinde 32 kayıt bulunan ve bu kayıtlar ile hesaplama yaparak kendi alanlarını oluşturan bir view dan tarih sıralı olarak 31 kaydın sorgulanma sonucu

Kod: Tümünü seç

Query Time
------------------------------------------------
Prepare       : 15
Execute       : 281
Avg fetch time: 281,00 ms

Memory
------------------------------------------------
Current: 1.261.360
Max    : 1.267.680
Buffers: 2.048

Operations
------------------------------------------------
Read   : 0
Writes : 5
Fetches: 20.197

Plan:
------------------------------------------------
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN (elektrik_tuketimi birim_fiyat INDEX (PK_birim_fiyat))
PLAN (elektrik_tuketimi birim_fiyat INDEX (PK_birim_fiyat))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN (elektrik_tuketimi carpan NATURAL)
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN SORT ((elektrik_tuketimi elektrik INDEX (PK_elektrik)))
PLAN (elektrik_tuketimi T1 INDEX (PK_elektrik))

Enchanced Info:
+--------------------------+-------+-----------+---------+---------+----------+
|        Table Name        | Index | Non-Index | Updated | Deleted | Inserted |
|                          | reads |   reads   |         |         |          |
+--------------------------+-------+-----------+---------+---------+----------+
|                RDB$FIELDS|    12 |         0 |       0 |       0 |        0 |
|       RDB$RELATION_FIELDS|    12 |         0 |       0 |       0 |        0 |
|             RDB$RELATIONS|     2 |         0 |       0 |       0 |        0 |
|               birim_fiyat|    62 |         0 |       0 |       0 |        0 |
|                    carpan|     0 |       372 |       0 |       0 |        0 |
|                  elektrik| 8.959 |         0 |       0 |       0 |        0 |
+--------------------------+-------+-----------+---------+---------+----------+
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Bunun yanında bir de VIEW'in Query'sini de verseydiniz daha iyi olurdu. Tabi hangi tablolar varsa o tabloların yapısıyla birlikte Indexleri de.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

Elektrik_tuketimi View:

Kod: Tümünü seç

CREATE VIEW "elektrik_tuketimi" (
    "Tarih",
    "Ilk Endeks",
    "Son Endeks",
    "Tuketim (kW/s)",
    "Maliyeti (YTL)",
    "Reaktif Ilk Endeks",
    "Reaktif Son Endeks",
    "Reaktif Tuketim",
    "Kapasitif Ilk Endeks",
    "Kapasitif Son Endeks",
    "Kapasitif Tuketim",
    "Cos Fi ( % )",
    "Sin Fi ( % )")
AS
select
Tarih :

Kod: Tümünü seç

T1."tarih",
"Ilk Endeks"

Kod: Tümünü seç

COALESCE((SELECT FIRST 1 T2."a_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0),
Son Endeks:

Kod: Tümünü seç

COALESCE(T1."a_s", 0),
Tuketim (kW/s):

Kod: Tümünü seç

(COALESCE(T1."a_s", 0) - COALESCE((SELECT FIRST 1 T2."a_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0))* coalesce((select "carpan"."carpan" from "carpan" where "carpan"."tur_id"=1),1),
Maliyeti (YTL):

Kod: Tümünü seç

((COALESCE(T1."a_s", 0) - COALESCE((SELECT FIRST 1 T2."a_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0))* coalesce((select "carpan"."carpan" from "carpan" where "carpan"."tur_id"=1),1))*coalesce((select "birim_fiyat"."birim_fiyat" from "birim_fiyat" where "birim_fiyat"."turu"='elektrik'),0),
Reaktif Ilk Endeks:

Kod: Tümünü seç

COALESCE((SELECT FIRST 1 T2."r_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0),
Reaktif Son Endeks

Kod: Tümünü seç

COALESCE(T1."r_s", 0),
Reaktif Tuketim

Kod: Tümünü seç

(COALESCE(T1."r_s", 0) - COALESCE((SELECT FIRST 1 T2."r_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0))* coalesce((select "carpan"."carpan" from "carpan" where "carpan"."tur_id"=1),1),
Kapasitif Ilk Endeks

Kod: Tümünü seç

COALESCE((SELECT FIRST 1 T2."k_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0),
Kapasitif Son Endeks

Kod: Tümünü seç

COALESCE(T1."k_s", 0),
Kapasitif Tuketim

Kod: Tümünü seç

(COALESCE(T1."k_s", 0) - COALESCE((SELECT FIRST 1 T2."k_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0))* coalesce((select "carpan"."carpan" from "carpan" where "carpan"."tur_id"=1),1),
Cos Fi ( % )

Kod: Tümünü seç

((COALESCE(T1."r_s", 0) - COALESCE((SELECT FIRST 1 T2."r_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0))* coalesce((select "carpan"."carpan" from "carpan" where "carpan"."tur_id"=1),1))/((COALESCE(T1."a_s", 0) - COALESCE((SELECT FIRST 1 T2."a_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0))* coalesce((select "carpan"."carpan" from "carpan" where "carpan"."tur_id"=1),1))*100,
Sin Fi ( % )

Kod: Tümünü seç

((COALESCE(T1."k_s", 0) - COALESCE((SELECT FIRST 1 T2."k_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0))* coalesce((select "carpan"."carpan" from "carpan" where "carpan"."tur_id"=1),1))/((COALESCE(T1."a_s", 0) - COALESCE((SELECT FIRST 1 T2."a_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC), 0))* coalesce((select "carpan"."carpan" from "carpan" where "carpan"."tur_id"=1),1))*100

Kod: Tümünü seç

FROM "elektrik" T1;
Elektrik Tablosu :

Kod: Tümünü seç

CREATE TABLE "elektrik" (
    "tarih" "tarihler",
    "a_s" "sayaclar" NOT NULL,
    "r_s" "sayaclar" NOT NULL,
    "k_s" "sayaclar" NOT NULL);
/* Primary keys definition */
ALTER TABLE "elektrik" ADD CONSTRAINT "PK_elektrik" PRIMARY KEY ("tarih");
/* Indices definition */
CREATE UNIQUE INDEX "PK_elektrik" ON "elektrik" ("tarih");
Birim_fiyat tablosu:

Kod: Tümünü seç

/* Table: birim_fiyat */

CREATE TABLE "birim_fiyat" (
    "turu" "turler",
    "birim_fiyat" "parabirimi" NOT NULL);

/* Indices definition */

CREATE UNIQUE INDEX "PK_birim_fiyat" ON "birim_fiyat" ("turu");

Carpan tablosu :

Kod: Tümünü seç

CREATE TABLE "carpan" (
    "turu" "turler",
    "carpan" "carpanlar" NOT NULL,
    "tur_id" INTEGER NOT NULL);



/* Primary keys definition */

ALTER TABLE "carpan" ADD CONSTRAINT "PK_carpan" PRIMARY KEY ("turu");


/* Indices definition */

CREATE UNIQUE INDEX "PK_carpan" ON "carpan" ("turu");
Tur_id alanını sonradan ekledim. performansta bir değişiklik olacak mı diye ama gözle görülür bir değişiklik fark edemedim. 1-2 ms. bazende aynı sürede. Bir yerlerde indexlerin rakam içermesi daha performans arttırır. diye duymuştum da o bakımdan ama turu alanını kullanıncada fark olmadı

Kod: Tümünü seç

CREATE DOMAIN "turler" AS 
CHAR(15) CHARACTER SET WIN1254 
NOT NULL 
COLLATE PXW_TURK 

Konu Konuyu açıyor hocam ama ben bu view i bir tablo olarak oluşturmak istiyorum. ama Computed alanlarda sorunlar yaşıyorum. ayrı bir tablo oluşturup. elektrik tablosuna yapılan her girişten sonra yeni yapılan kayıtları view ile aynı alanları içeren tabloya kaydetmek teknik açıdan yanlışmı olur. Buna ihtiyaç duymamın sebebide Birim_fiyat tablosunda değişiklik olduğunda view bu yeni rakamdan hesaplama yapacağı için eski kayıtların viewde yeni fiyattan hesaplanması yanlış veri üretilmiş oluyor. Bu konuda ne tavsiye edersiniz. Söylediğim gibi yukarıda viewdan değerleri alıp tabloya yazmak kirli bir programcılık olacak kanısındayım.
Triggerlerde tam hakim değillim. Asıl derdim ilk endeks alanını hesaplamak oluyor.

Computed alanlar ilgili başka bir sıkıntımda şöyle
başka bir tabloda

Kod: Tümünü seç

CREATE TABLE "tuz" (
    "tarih" "tarihler",
    "tuketim (Cuval)" SMALLINT NOT NULL,
    "tuketim (Kg.)" COMPUTED BY ((select (select "tuz"."tuketim (Cuval)" from "tuz")*(coalesce((select "carpan"."carpan" from "carpan" where "carpan"."tur_id"=5),1)) from "tuz")),
    "maliyeti (YTL.)" COMPUTED BY ((select (select "tuz"."tuketim (Kg.)" from "tuz")*(coalesce((select "birim_fiyat"."birim_fiyat" from "birim_fiyat" where "birim_fiyat"."turu"='tuz'),0))from "tuz")));
Burada tuketim kg alanı (tuketim (Cuval)*50) 50= --> carpan tablosundan seçiliyor.

ilk kaydı giridiğimde sorun yok örneğin

Kod: Tümünü seç

     Tarih         tuketim (Cuval)        tuketim Kg  .................
01.01.2006               3                        150
ama 2. bir kayıt eklediğimde bir önceki alan değeride değişiyor.

Kod: Tümünü seç

     Tarih         tuketim (Cuval)        tuketim Kg  .................
01.01.2006               3                        50
02.01.2006               1                        50
bunu anlayamadım bir tür :?

Cevap yazdığınıza umarım pişman etmemiştirim. Keza Tasarımı bana yaptırsaydın dediğinizi duyar gibiyim.

İlginiz için teşekkürler
Saygı ve Sevgilerle
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Öncelikle bu kadar ayrıntılı yazmışsınız teşekkürler.

SELECT FIRST 1 T2."k_s" FROM "elektrik" T2 WHERE T2."tarih" < T1."tarih" ORDER BY T2."tarih" DESC

Index oluşturmuşsunuz, ancak oradaki Unique index gereksiz (elektrik tablosu için) zira zaten siz PK olarak Tarihi vermişsiniz, ayrıca index oluşturmanıza gerek yok, çünkü PK hem indextir hem de unique'tir. Oradaki ek index tanımlamanız anlamsız oluyor.

Şimdi bir öneri,

2 Tane view yapın,
1. View'de sadece endeksleri alın,
2. View'de ise işlemlerinizi yapın. Zira, 1. View'de elde ettiğiniz kolonları tekrarlayarak Select ediyorsunuz, bu performansı düşürür.

Şöyle anlatmaya çalışayım. Oluşturacağınız 1. view'de (bu sizin ham datalarınızın olduğu view) sadece endeksleri bulun.

2. View'de ise bu endeks rakamlarınızı maliyet ve tüketim hesaplamalarınızda kullanın, böylelikle aynı kolon için Server'a 1'den fazla yüklenmeniz olmaz.

Bilmem izah edebildim mi?

Sorunuz olursa yardımcı olmaya çalışırız.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla