v2.5.2
Giriş yap

Sql Sorgum Çok Yavaş Çalışıyor

zfactor
1,344 defa görüntülendi

Merhabalar, klasik asp ile otel rezervasyon takip sistemi hazırlıyorum, aylık olarak hangi odalarda kim misafir olacak takibini yaptırıyorum.
0,02,03 yazan yerler oda numaralarım.

Alttaki kodu kullandığımda 17-18 saniye'de sorgu sonuçlanıyor.

<%set oda=baglanti.execute("select * from oda order by id asc")
do while not oda.eof
set rezervasyon=baglanti.execute("select id,odaid,adsoyad,giristarihi,cikistarihi from rezervasyon where odaid='"&oda("id")&"' and (giristarihi<='"&gun&"' and cikistarihi>'"&gun&"') limit 1")%>
<%if rezervasyon.eof then%><td>boş</td><%else%><td style="background:#ddd; font-size:12px;"><%=rezervasyon("adsoyad")%></td><%end if%>
<%oda.movenext:loop%>

Bu kodumu çalıştırdığım zaman aşağıdaki gibi istediğim sonucu alıyorum, fakat çok yavaş çalışıyor belirttiğim gibi.

Alttaki kodu çalıştırdığım zaman ise gayet hızlı sonuç alıyorum, fakat şöyle bir sıkıntı var, bu kodda sadece eşleşen veriler geldiği için, eğer kayıt yoksa boş durumda olarak gösteremiyorum ve dolayısıyla tabloda kaymalar oluyor.

<%set rezervasyon=baglanti.execute("select odam.id,rezervasyonum.odaid,rezervasyonum.adsoyad ADOSOYAD,rezervasyonum.giristarihi,rezervasyonum.cikistarihi from rezervasyon as rezervasyonum inner join oda as odam on odam.id=rezervasyonum.odaid where rezervasyonum.giristarihi<='"&gun&"' and rezervasyonum.cikistarihi>'"&gun&"'")
do while not rezervasyon.eof%>
<%if rezervasyon.eof then%><td></td><%else%><td style="background:#ddd; font-size:12px;"><%=rezervasyon("ADOSOYAD")%></td><%end if%>
<%rezervasyon.movenext:loop%>

Tüm sayfadaki kodun tamamını altta belirttim.

<table>
<tr>
<td>Tarih</td>
<%set oda=baglanti.execute("select * from oda order by id asc")
do while not oda.eof%>
<td><b><%=oda("baslik")%></b></td>
<%oda.movenext:loop%>
</tr>
<%AydakiTumGunler="2021-04-01,2021-04-02,2021-04-03,2021-04-04,2021-04-05,2021-04-06,2021-04-07,2021-04-08,2021-04-09,2021-04-10,2021-04-11,2021-04-12"
gunler = split(AydakiTumGunler, ",")
for i=0 to ubound(gunler)
noktaligun=gunler(i)
noktaligun=tarihnoktaliformat(noktaligun)
gun=gunler(i)%> 
<tr>
<td><b><%=noktaligun%></b></td>
<%set rezervasyon=baglanti.execute("select odam.id,rezervasyonum.odaid,rezervasyonum.adsoyad ADIM,rezervasyonum.giristarihi,rezervasyonum.cikistarihi from rezervasyon as rezervasyonum inner join oda as odam on odam.id=rezervasyonum.odaid where rezervasyonum.giristarihi<='"&gun&"' and rezervasyonum.cikistarihi>'"&gun&"'")
do while not rezervasyon.eof%>
<%if rezervasyon.eof then%><td><%bos=bos+1%>x</td><%else%><td style="background:#ddd; font-size:12px;"><%=rezervasyon("ADIM")%><%dolu=dolu+1%></td><%end if%>
<%rezervasyon.movenext:loop%>
</tr>
<%next%>
</table>
Cevap yaz
Cevaplar (8)
aydinkeskin
1361 gün önce

söyle söylim bugun bir hdd ye xampp kurdum normalde jilet gibi çlışan site 15 sn de neymiş dedirdetecek gibi 1 dk bile sürdüğü oluyor
sunucuda 1-2 sn aralığında ise windows hostinglerin sorunu malesef
aldığın hosting çok önemli

basit bir örnek daha vereyim alakasız sen anla

pagespped değeri bi firmada 84 çıkıyor diğer firmada 97 çıkıyor bu mekanik hızla alakası yok tabiki
ama windows hostinglere eski rağmen günümüzde pek yok diye düşünüyorum
php de de olabiliyor localde 0,6 sn de açılan 15 tane veri hostingde 1.21 sn açılıyor başka bir hostingde 0,4 sn de çalışıyor
kodsal olarak yapabileceklerin tabiki var ama
bu sayfanın açılış hızı sadece kodla alakalı değil

dışardan çağırdığın css js vb içeriklerde bunu yavaşlatıyor olabilir.

ve sana tavsiyem bırak asp yi artık :) php ye asp bilgin ile 1 haftalık hızlandırılmış kurs ile çok rahat ça geçersin

zfactor
1361 gün önce

aydinkeskin hocam localde 15 saniye civarı sorgum sürüyor, sunucuda 1-2 saniyede sonuçlanıyor. Ama yinede daha hızlı hale getirilebilir diye düşünüyorum.

aydinkeskin
1361 gün önce

php den önce asp ile birçok iş yaptım senin sorunun kodlarla olduğunu hiç zannetmiyorum
milisaniyelik performan kayıpları normaldir fakat 10 sn diyorsun bu tamamen kullandığın hosting ile alakalı
localde vardiyorsan sorun hdd de sorun var o sektörde diyorum ben

kodlarında bir dert yok

  • ile çağırmışsın veya sütünları yazarak çağırmışsın 1 sn oynadı diyelim arada 1 milyon veri olsada tek sayfada yazdırmyorsun 1 milyon veriyi sonuçta,
    öyle yüksek zaman kaybı kodlarında olduğunu pek sanmıyorum

ha söyle bir ihtimal dahilindedir. ki yine uzak sunucudan çektiğin css js dosyaları varsa onlara bağlanmakta sorun yaşıyorsundur

e yinede hosting e bağlanır kısmen bu sorun.

qplot
1362 gün önce

ASP den helekı klasik ASP den nefret ederim
lakın rezerve sıstemı yazacaksan değerleri virgülle ayırarak veri tabanına kaydetmek
sonrada in_array la kontrol etmen gerek asp de nasıldır bilmem

mantık budur

zfactor
1362 gün önce

Merhaba Zafer
İlgin için teşekkkür ederim. Tüm tarihlerdeki tüm odaları tek tek sorgulamam gerektiği için sorgum yavaş çalışıyor, Attığınız kodu denedim fakat istediğim şekilde olmuyor. Konuda belirttiğim gibi <td></td> ler iç içe geliyor, rezervasyon olmayan td leri ekrana boş basamıyorum.

Yani bana sadece veri olan sütunlar değil, olmayan sütunlarda lazım.

zafer
1362 gün önce

Merhaba zfactor,

Birinci sorgu örneğine baktığım zaman basit SELECT ifadeleri görüyorum. Doğrusu tablon çok fazla satır içermiyorsa bu sorguların milisaniye mertebesinde tamamlanması gerekir. Sanırım bahsettiğin geçikmenin ana sebebi döngü içinde tekrar tekrar sorgu oluşturup icra etmenden kaynaklanıyor.

Eğer durum böyle ise döngü içindeki sorguyu döngü dışına çıkarmak belki işini hızlandırabilir. Örneğin döngü içindeki sorguyu döngü dışında yapıp değerleri bir diziye aktardıktan sonra döngü içinde dizi üzerinde arama yaparak istenen sonuçlara ulaşılabilir. Denemek gerekir tabi ki.

İkinci sorgu için evet INNER JOIN kesişim kümesini getireceği için senin aradığın boşlukları kaybedersin ve LEFT JOIN her halükarda birinci kaydı getireceği için yine boşlukları kaybedersin.

Burada gördüğüm kadarıyla aslında rezervasyon tablosunu alıp sorguna birde oda_id eklemek istiyorsun. Bunun için birleştirme JOIN yerine alt sorgular SUBQUERY kullanabilirsin. Örnek sorgu şöyle bir şey olmalı;

SELECT r.odaid, r.adsoyad ADOSOYAD, r.giristarihi, r.cikistarihi, 
    (SELECT id FROM odam WHERE id = r.odaid) AS oda_id
FROM rezervasyon as r
WHERE r.giristarihi <= '01.04.2021' and r.cikistarihi > '03.04.2021"

Tabi bu sana içinde oda_id bilgiside olan bir rezervasyon listesi verecektir. Sen kendi odanı ve rezervasyon bilgilerin bu liste içinde bulmalısın. Umarım yardımcı olur.

zfactor
1363 gün önce

left join ile sistem düzgün çalışmıyor, zaten ben denemiştim left joini

makifgokce
1363 gün önce

INNER JOIN yerine LEFT JOIN kullan