Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.
Aktivasyon mailiniz gelmediyse buraya tıklayın.
04, 2008, 11:13:29 pm
42710 Mesaj 9329 Konu Gönderen: 17902 Üye
Son üye: Remark
Turk-Php.Com Forum  |  Yardım Forumları  |  Veritabanı Yardım Forumu  |  Uzun bir sorgu için optimizasyon yardımı « önceki sonraki »
Sayfa: [1] Yazdır
Yazan Konu: Uzun bir sorgu için optimizasyon yardımı  (Okunma Sayısı 1217 defa)
Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
*
Offline Offline

Mesaj Sayısı: 111



Üyelik Bilgileri WWW
Uzun bir sorgu için optimizasyon yardımı
« : 13, 2005, 01:57:21 pm »

Merhabalar,

elimde iki adet 200000 civarında kayıt içeren tablo var.

Birinci tablo: ChargeTableMis

Status  tinyint(2)         
PersonId  smallint(5)   
Date  date
Hours  float
MANo  smallint(4)
TaskNo  smallint(4)
Process  tinyint(2)
Position  tinyint(2)

Index yok!..

İkinci tablo: ChargeTableTekno

Status  tinyint(2)         
PersonId  smallint(5)   
Date  date
Hours  float
MANo  smallint(4)
TaskNo  smallint(4)
Process  tinyint(2)
Position  tinyint(2)

Index yok!..

gördüğünüz gibi iki tablonunda kolon isimleri ve özellikleri tıpa tıp aynı.

Şimdi arkadaşlar, benim yapmak istediğim ise;

Bu iki tabloya bakarak ChargeTableMis.hours > ChargeTableTekno.hours ve status=2 (her iki tabloda da) olan satırları JOIN yaparak basmak. Foreign Key'im ise, bu noktada malesef bir tane degil. Şöyle ki, MANo, Process, TaskNo, Date ve PersonId'ler aynı olacak.

Özetle her iki tabloda da birer satır olduğunu düşünelim.

Birinci tabloda (mis tablosunda);

Status=2
MANo=100
Process=250
TaskNo=23
PersonId=1040
Hours=150

İkinci tabloda da, (tekno tablosunda)

Status=2
MANo=100
Process=250
TaskNo=23
PersonId=1040
Hours=100

olsun. Bu durumda ChargeTableTekno.Hours< ChargeTableMis.Hours olduğundan bu satır bana dönmeli.

Bunu nasıl yapabilirim bu bir? İkincisi de php.ini vesaire ayarlarım nasıl olmalı, şöyle ki maximum exec. time'a takılıyor bu tablolardaki basit querylerim bile.
Logged

while(1) work;
muratmoon
PHP Memuru
***
Offline Offline

Mesaj Sayısı: 552


Üyelik Bilgileri WWW
Ynt: Uzun bir sorgu için optimizasyon yardımı
« Yanıtla #1 : 13, 2005, 03:17:49 pm »

200000 kayıt çok fazla değil aslında.

Önce bi kendi kullandığın sorguyu yazsaydın bi görseydik.
Logged

Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
*
Offline Offline

Mesaj Sayısı: 111



Üyelik Bilgileri WWW
Ynt: Uzun bir sorgu için optimizasyon yardımı
« Yanıtla #2 : 13, 2005, 05:08:08 pm »

"SELECT * FROM ChargeTableMis" mesela, bu sorgu timeout yiyor.

Ayrıca 200.000 kayıt nicelik olarak fazla olmayabilir ama tablolarda primary key ya da index yok. Bir sekilde yapisal anlamda da optimize etmeliyim tablolari.

Fikirleriniz lütfen



200000 kayıt çok fazla değil aslında.

Önce bi kendi kullandığın sorguyu yazsaydın bi görseydik.
Logged

while(1) work;
muratmoon
PHP Memuru
***
Offline Offline

Mesaj Sayısı: 552


Üyelik Bilgileri WWW
Ynt: Uzun bir sorgu için optimizasyon yardımı
« Yanıtla #3 : 13, 2005, 05:59:35 pm »

Tabloların ne amaçla kullanıldığı vb bilgiler gerekiyor.

Primary key ve index olmaması bilerek mi yapılmış? Eğer bilerek yapılmadıysa güncelleme ve silme işlemi olan tüm tablolarda primary key kesinlikle gereklidir.

Kolonları vermeden * ile zaten sorgulama yapmak baştan yanlış.

Son olarak sizin verdiğiniz örnekteki sorgu hiçbir şekilde optimize edilemez. (* yerine kolon vardı vermek hariç.) Çünkü tüm veriyi getirmeye çalışıyor.

Bu yüzden tam olarak kullanmak istediğiniz sorguyu burada belirtmeniz lazım. Optimizasyon ona göre belli olacak.
Logged

Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
*
Offline Offline

Mesaj Sayısı: 111



Üyelik Bilgileri WWW
Ynt: Uzun bir sorgu için optimizasyon yardımı
« Yanıtla #4 : 13, 2005, 06:39:19 pm »

Hocam bu tablolarda asla ve asla silme ve düzenleme işlemi yapılmıyor, sadece yeni kayıt giriliyor ve zaman zaman MANo, Process, PersonId, Task ve Date baz alınarak raporlar oluşturuluyor.

Bu tablolarda firmanın çalışanlarının performans bilgileri tutuluyor; belli bir tarih diliminde bir proje için harcanan toplam efor, ya da spesifik olarak bir kişinin harcadığı toplam efor raporlanarak işçilik maliyeti çıkarılıyor.

Ben Index koymayı düşündüm ama bu sefer de Hours kolonu hariç tüm kolonlar index adayı... Fazla index olmasının performansa bir etkisi söz konusu olur mu?

Tabloların ne amaçla kullanıldığı vb bilgiler gerekiyor.

Primary key ve index olmaması bilerek mi yapılmış? Eğer bilerek yapılmadıysa güncelleme ve silme işlemi olan tüm tablolarda primary key kesinlikle gereklidir.

Kolonları vermeden * ile zaten sorgulama yapmak baştan yanlış.

Son olarak sizin verdiğiniz örnekteki sorgu hiçbir şekilde optimize edilemez. (* yerine kolon vardı vermek hariç.) Çünkü tüm veriyi getirmeye çalışıyor.

Bu yüzden tam olarak kullanmak istediğiniz sorguyu burada belirtmeniz lazım. Optimizasyon ona göre belli olacak.
Logged

while(1) work;
Witkey
Ziyaretçi


E-Posta
Ynt: Uzun bir sorgu için optimizasyon yardımı
« Yanıtla #5 : 14, 2005, 01:20:51 am »

Optimize table ? komutunu kullansak bır yararı olur mu daha acemıyım kusuruma bakmayın yanlış söylüyor olabilirim Smiley
Logged
muratmoon
PHP Memuru
***
Offline Offline

Mesaj Sayısı: 552


Üyelik Bilgileri WWW
Ynt: Uzun bir sorgu için optimizasyon yardımı
« Yanıtla #6 : 14, 2005, 02:21:18 am »

index sayısı arttıkça yapacağın insert ve update işlemleri yavaşlar. sen update yapmıyorsun ama genel bilgi olarak söyledim ben.

sen ısrarla sorgunu belirtmediğin için bundan sonra yardımcı olamayacağım.

kolay gelsin.
Logged

isinan
PHP Öğrencisi
*
Offline Offline

Mesaj Sayısı: 54


Üyelik Bilgileri
Ynt: Uzun bir sorgu için optimizasyon yardımı
« Yanıtla #7 : 14, 2005, 02:46:57 am »

Merhabalar,

elimde iki adet 200000 civarında kayıt içeren tablo var.

Birinci tablo: ChargeTableMis

Status tinyint(2)
PersonId smallint(5)
Date date
Hours float
MANo smallint(4)
TaskNo smallint(4)
Process tinyint(2)
Position tinyint(2)

Index yok!..

İkinci tablo: ChargeTableTekno

Status tinyint(2)
PersonId smallint(5)
Date date
Hours float
MANo smallint(4)
TaskNo smallint(4)
Process tinyint(2)
Position tinyint(2)

Index yok!..

gördüğünüz gibi iki tablonunda kolon isimleri ve özellikleri tıpa tıp aynı.

Şimdi arkadaşlar, benim yapmak istediğim ise;

Bu iki tabloya bakarak ChargeTableMis.hours > ChargeTableTekno.hours ve status=2 (her iki tabloda da) olan satırları JOIN yaparak basmak. Foreign Key'im ise, bu noktada malesef bir tane degil. Şöyle ki, MANo, Process, TaskNo, Date ve PersonId'ler aynı olacak.

Özetle her iki tabloda da birer satır olduğunu düşünelim.

Birinci tabloda (mis tablosunda);

Status=2
MANo=100
Process=250
TaskNo=23
PersonId=1040
Hours=150

İkinci tabloda da, (tekno tablosunda)

Status=2
MANo=100
Process=250
TaskNo=23
PersonId=1040
Hours=100

olsun. Bu durumda ChargeTableTekno.Hours< ChargeTableMis.Hours olduğundan bu satır bana dönmeli.

Bunu nasıl yapabilirim bu bir? İkincisi de php.ini vesaire ayarlarım nasıl olmalı, şöyle ki maximum exec. time'a takılıyor bu tablolardaki basit querylerim bile.

Join yaparken tablolari istediginiz satirlar uzerinde birlestirebilirsiniz. Yani
inner join on mano=mano and process=process and .....  where hours>hours and status=2
Tabii optimizasyondan odun verirsiniz.
« Son Düzenleme: 14, 2005, 03:25:31 am Gönderen: isinan » Logged
Sayfa: [1] Yazdır 
« önceki sonraki »
Gitmek istediğiniz yer:  


Turk-Php.Com Forum | SMF Forum Software © 2005, Simple Machines LLC. All Rights Reserved.