Arkadaşlar Selamlar.. Foruma ilk mesajım. Bir göz atabilirseniz sevinirim...
trr adlı bir plan tablom var, zaman aralıkları, mekan, ve kişi bazında bir sorgu yapılıyor.. Sorun şu ki where'e yazdığım -zaman aralığı- koşullarının sayısı biraz arttığında hızlı bir sistemde aşağıdaki sorgu 1 sn sürüyor.. trr tablosu 3-5 bin kayıtlı bir tablo..
Where'i her girdiğim zaman aralığı koşullarının sayısı arttıkça süre uzuyor, 2-3 sn yi buluyor.. ve bunlardan binlerce çalıştırmak gerektiğinde problem oluyor.. Gerekli tüm alanlarda indeks var.
Bu sorgu nun hızlı bir alternatifini bulmak mümkün mü..?
İyi çalışmalar, şimdiden sağolun..
SELECT FIRST 1 TRR_ID, TRR_EDT_ID, TRR_TPV_ID, TRR_ROM_ID, TRR_START_DATETIME, TRR_TOEND_HOUR_SPACE, TRR_HST_ID, rom.rom_name, rom.ROM_PRACTICAL_PERSON_CAPACITY
FROM T_TRR_TIME_ROOM_RESOURCE trr
left join t_rom_room rom on rom_id = TRR_ROM_ID
where trr_tpv_id = 4 and trr_edt_id = 2 and (TRR_TOEND_HOUR_SPACE >= 1) and (TRR_HST_ID = 1) and (ROM_ROT_ID = 1) and
(TRR_START_DATETIME not between '01.01.1900 21:00:00' and '01.01.1900 21:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '01.01.1900 21:00:00' and '01.01.1900 21:59:59') and
(TRR_START_DATETIME not between '02.01.1900 20:00:00' and '02.01.1900 20:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '02.01.1900 20:00:00' and '02.01.1900 20:59:59') and
(TRR_START_DATETIME not between '02.01.1900 21:00:00' and '02.01.1900 21:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '02.01.1900 21:00:00' and '02.01.1900 21:59:59') and
(TRR_START_DATETIME not between '03.01.1900 19:00:00' and '03.01.1900 19:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '03.01.1900 19:00:00' and '03.01.1900 19:59:59') and
(TRR_START_DATETIME not between '03.01.1900 20:00:00' and '03.01.1900 20:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '03.01.1900 20:00:00' and '03.01.1900 20:59:59') and
(TRR_START_DATETIME not between '02.01.1900 10:00:00' and '02.01.1900 10:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '02.01.1900 10:00:00' and '02.01.1900 10:59:59') and
(TRR_START_DATETIME not between '03.01.1900 11:00:00' and '03.01.1900 11:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '03.01.1900 11:00:00' and '03.01.1900 11:59:59') and
(TRR_START_DATETIME not between '03.01.1900 14:00:00' and '03.01.1900 14:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '03.01.1900 14:00:00' and '03.01.1900 14:59:59') and
(TRR_START_DATETIME not between '03.01.1900 20:00:00' and '03.01.1900 20:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '03.01.1900 20:00:00' and '03.01.1900 20:59:59') and
(TRR_START_DATETIME not between '04.01.1900 10:00:00' and '04.01.1900 10:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '04.01.1900 10:00:00' and '04.01.1900 10:59:59') and
(TRR_START_DATETIME not between '05.01.1900 13:00:00' and '05.01.1900 13:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '05.01.1900 13:00:00' and '05.01.1900 13:59:59') and
(TRR_START_DATETIME not between '01.01.1900 16:00:00' and '01.01.1900 16:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '01.01.1900 16:00:00' and '01.01.1900 16:59:59') and
(TRR_START_DATETIME not between '01.01.1900 20:00:00' and '01.01.1900 20:59:59') and
(ADDHOUR(TRR_START_DATETIME, 1) not between '01.01.1900 20:00:00' and '01.01.1900 20:59:59')
order by rom.rom_lyr_id, rom.rom_name DESC
Bu query hızlanır mı?
Re: Bu query hızlanır mı?
Bu sorguyu sen mi yazdın...yazdıysan üşenmedin mi
Aslında tam olarak ne yapmak istediğini yazarsan sorgu üzerine düşünmektense yeni bir sorgu tavsiyesi gelebilir...

- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Re: Bu query hızlanır mı?
ibexpertin ucretli surumunde bir query calistirdiginiz vakit o querynin calisma zamanini ayrintili olarak gosteriyor. sorgunun hazirlik asamasi ne kadar surdu, calistirilmasi ne kadar surdu, hangi tablodan kac kayit okundu, kayitlar okunurken hangi indexler kullanildi vs. vs
yapmaniz gereken ilk once sorguda kullanilabilecek guzel indexler tanimlamak. Sorguda Not Beetwen , DESC gibi ifadeler oldugundan indexin ASC ya da DESC olarak olusturulmasi da sorgu hizini etkileyebilir. bunu test etmek lazim.
TRR_START_DATETIME degerini her where sartinda runtime artirmak degilde bu degeri delphi tarafindan hesaplayip sorguya direkt gondermeyi dene. fb birde ADDHOUR fonksiyonunu cagirip durmasin. bunun hiza cok etki edecegini sanmiyorum ama sen yine de bir dene.
sorgunu baska bir sekilde yazmayi dene. belki aklina icerisinde bu kadar where sarti olmayan daha kisa daha hizli baska bir yol bulabilirsin.
yapmaniz gereken ilk once sorguda kullanilabilecek guzel indexler tanimlamak. Sorguda Not Beetwen , DESC gibi ifadeler oldugundan indexin ASC ya da DESC olarak olusturulmasi da sorgu hizini etkileyebilir. bunu test etmek lazim.
TRR_START_DATETIME degerini her where sartinda runtime artirmak degilde bu degeri delphi tarafindan hesaplayip sorguya direkt gondermeyi dene. fb birde ADDHOUR fonksiyonunu cagirip durmasin. bunun hiza cok etki edecegini sanmiyorum ama sen yine de bir dene.
sorgunu baska bir sekilde yazmayi dene. belki aklina icerisinde bu kadar where sarti olmayan daha kisa daha hizli baska bir yol bulabilirsin.
Re: Bu query hızlanır mı?
EXTRACT fonksiyonunu kullanabilirsin.
NOT IN'den sonra parantez içini kodla doldurmalısın. Her şarttaki saati bir tamsayı olarak ifade ediyorsun. Sonuçta tek bir şarta indirmiş oluyorsun.
Kod: Tümünü seç
EXTRACT(YEAR FROM TRR_START_DATETIME) * 1000000 + EXTRACT(MONTH FROM TRR_START_DATETIME) * 10000 + EXTRACT(DAY FROM TRR_START_DATETIME) * 100 + EXTRACT(HOUR FROM TRR_START_DATETIME) NOT IN (3214, 1234, 12354, 2345, 214534)
Re: Bu query hızlanır mı?
Öncelikle yanıtlar için çok teşekkürler arkadaşlar...
Battosai: Sorgu bir kod tarafından generate ediliyor, kontrol -zaman aralığı- olduğu için başka bir sorguya dönüştüremedim kendi bakış açım yetersiz o noktada.
Sadettinpolat: prepared: 0.01 sn, processed: 0.8 sn, TRR_START_DATETIME, TRR_TPV_ID, TRR_EDT_ID, TRR_TOEND_HOUR_SPACE bunların indexi kullanılmış..
Addhour yerine delphi de hesaplamak mümkün değil çünki sorgunun çalıştığı tablodaki tüm alanları where koşullundaki ifadelere göre search ederken kullanılıyor, yani X bir datetime değeri için Addhour kullanıyorum..
Where deki tüm zaman aralıkları birbirinden bağımsız özel olarak insanlar tarafından girilmiş değerler, yani olması gerekiyor.
Hakan Can: in içinde kullanmayı aklımdan geçirsme de bir zaman aralığı söz konusu koşulda bunu in li yapıya nasıl dönüştürebilriim bulamadım?
Muhabbetle..
- Neşet..
Battosai: Sorgu bir kod tarafından generate ediliyor, kontrol -zaman aralığı- olduğu için başka bir sorguya dönüştüremedim kendi bakış açım yetersiz o noktada.
Sadettinpolat: prepared: 0.01 sn, processed: 0.8 sn, TRR_START_DATETIME, TRR_TPV_ID, TRR_EDT_ID, TRR_TOEND_HOUR_SPACE bunların indexi kullanılmış..
Addhour yerine delphi de hesaplamak mümkün değil çünki sorgunun çalıştığı tablodaki tüm alanları where koşullundaki ifadelere göre search ederken kullanılıyor, yani X bir datetime değeri için Addhour kullanıyorum..
Where deki tüm zaman aralıkları birbirinden bağımsız özel olarak insanlar tarafından girilmiş değerler, yani olması gerekiyor.
Hakan Can: in içinde kullanmayı aklımdan geçirsme de bir zaman aralığı söz konusu koşulda bunu in li yapıya nasıl dönüştürebilriim bulamadım?
Muhabbetle..
- Neşet..