|
Yazan
|
Konu: Uzun bir sorgu için optimizasyon yardımı (Okunma Sayısı 1217 defa)
|
Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
Offline
Mesaj Sayısı: 111
|
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
|
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
Mesaj Sayısı: 111
|
" 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
|
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
Mesaj Sayısı: 111
|
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
|
Optimize table ? komutunu kullansak bır yararı olur mu daha acemıyım kusuruma bakmayın yanlış söylüyor olabilirim 
|
|
|
|
|
Logged
|
|
|
|
|
muratmoon
|
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
Mesaj Sayısı: 54
|
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
|
|
|
|
|
 |