[ steve585 @ 19.05.2007. 11:48 ] @
Napraavio sam aplikaciju koja vrsi pretrazivanje baze podataka. Pretrazujem 9 tabela. Za povezivanje sam koristio ADO. Izmedju ostalog jedna od tabela ima oko 3 000 000 redova sa tendencijom rasta. Iz te tabele potrebna mi je suma kolone i id (select id, sum(vrijednost - korekcija) from tabela where datum between Od and Do group by id).
Vrijednosti Od i Do odredjuje korisnik unosom u tekstualna polja. Izvrsavanje ovog upita traje dobrih 20 minuta.

Postoji li nacin da se izvrsavanje upita ubrza?
[ goranvuc @ 19.05.2007. 11:54 ] @
Nesto si ti tu zabrljao ;) Posalji deo koda kojim otvaras taj rekordset.
[ steve585 @ 19.05.2007. 12:05 ] @
Ono sto nisam napisao, a trebao sam je to da rezultat ovog upita stavljam u Access bazu, koja sluzi kao svojevrsni backup. Access baza nakon izvrsavanja upita ima 2500 do 3000 redova u tabeli.
Code:

Dim adoConn As ADODB.Connection ' konekcija
Dim adoRS   As ADODB.Recordset  ' rekordset u kome ce biti podaci
Dim adoFld  As ADODB.Field      ' polje iz rekordseta, sluzi pri ispisu
Dim sQry    As String           ' SQL upit



VezaS 'Povezivanje na 3000000 redova bazu
VezaT008 'Povezivanje na Access backup bazu
Datumi

With RST
  Do While Not .EOF
    .Delete
    .MoveNext
  Loop
End With

Set adoConn = New ADODB.Connection
    adoConn.Open aa
    
    '-- formiraj upit
    Qry = "select itemnr as Artikl, sum(soldpieces-change) as Prodaja from stat where date between " & Od & " and " & Do & " group by itemnr"
    
    '-- kreiraj i otvori rekordset
    Set adoRS = New ADODB.Recordset
    adoRS.Open Qry, adoConn
    
    
   k = 0
   With adoRS
    '-- prikazi zapise
    Do While Not .EOF
      k = k + 1
        Artikl = !Artikl
        Prodaja = !Prodaja
        
             With RST
              .AddNew
                !Artikl = Artikl
                !Prodaja = Prodaja
                .Update
            End With
            
        '-- pomjeri se na sledeci zapis
        adoRS.MoveNext
    Loop
   End With
Set adoRS = Nothing
Set RST = Nothing
PorukaNula = MsgBox("Prijenos  zavrsen", vbOKOnly, "Poruka")

Pogledao sam ADO tutorijal i radio po uputama i tutorijala.


krcko: dodati CODE tagovi

[Ovu poruku je menjao Aleksandar Ružičić dana 20.05.2007. u 22:56 GMT+1]
[ goranvuc @ 19.05.2007. 12:25 ] @
Da li si pokusao da stavis Break na pocetak i kraj svakog od blokova i da meris koji je od njih dugotrajan?

Npr. break pre procedure brisanja i posle, pre otvaranja agregatnog upita i posle (mislis da on dugo traje) a ovde mislim samo na trajanje Open metode, a ne na trajanje prolaska kroz rekordset, break na pocetak i kraj petlje gde ubacujes podatke. Sustina je da stvarno utvrdis koji od ovih blokova dugo traje, jer ja sumnjam da ti SELECT traje 20 minuta.

Ono sto bi sugurno ubrzalo stvar je da umesto DELETE metode u petlji samo izvrsis komandu "DELETE * FROM TabelaUKojuUbacujesAneZnamKakoSeZove" i to preko konekcije, tj Konekcija.Execute() metodu.
[ steve585 @ 19.05.2007. 12:29 ] @
Nesto otprilike ovako ako sam dobro razumio: Break nisam dosada koristio u VB
Code:

Do While Not .EOF
k = k + 1
Artikl = !Artikl
Prodaja = !Prodaja

With RST
.AddNew
!Artikl = Artikl
!Prodaja = Prodaja
.Update
End With

'-- pomjeri se na sledeci zapis
adoRS.MoveNext

Break

Loop

Ovo sa DELETE cu svakako napraviti.


krcko: dodati CODE tagovi

[Ovu poruku je menjao Aleksandar Ružičić dana 20.05.2007. u 22:55 GMT+1]
[ goranvuc @ 19.05.2007. 12:31 ] @
Ma ne, mislio sam da markiras liniju koda, tj. postavis BreakLine, dakle, kada si u editoru, kliknes pored pocetka linije na okvir sa leve strane i ceo red gde ti je linija treba da se oboji - to ti je postavljanje break linije. Dakle, stavis brejklinije i meris sta ti od blokova dugo traje.
[ Shadowed @ 19.05.2007. 15:19 ] @
Tzv. brakepoint ;)
[ goranvuc @ 19.05.2007. 15:22 ] @
Citat:
Shadowed: Tzv. brakepoint

Naravno I nije tzv. vec se tako zove, a ja sam ga "krstio".
[ steve585 @ 19.05.2007. 16:32 ] @
OK, moje neznanje je ogromno, fakat nikad nisam to koristio! Probati cu, pa se javim sa rezultatima, ali nista prije ponedjejlka.
[ Ero S Ovoga Sveta @ 20.05.2007. 17:58 ] @
I meni se cini da brisanje tu oduzima najvise vremena.
Posto vidim da brises sve recordse iz tabel, zar nebi bilo jednostavnije obrisati tu tabelu
pa posle napraviti istu takvu novu, praznu???
[ goranvuc @ 20.05.2007. 18:41 ] @
Citat:
Ero S Ovoga Sveta:Posto vidim da brises sve recordse iz tabel, zar nebi bilo jednostavnije obrisati tu tabelu
pa posle napraviti istu takvu novu, praznu???

Ne, kao sto sam i naveo, najbrzi nacin je izvrsenje DELETE naredbe preko SQL-a, tj.:
Code:

Konekcija.Execute "DELETE * FROM TvojaTabela"
[ steve585 @ 21.05.2007. 18:12 ] @
Napravio sam sljedece

adoConn.Open aa 'Ovdje sam postavio break (Pozicija 1)


Set adoRS = New ADODB.Recordset 'Ovdje sam postavio break (Pozicija 2)
adoRS.Open Qry, adoConn

k = 0 'Ovdje sam postavio break (Pozicija 3)

Od Pozicije 2 do Pozicije 3 nastaje zagušenje.




[ goranvuc @ 21.05.2007. 18:37 ] @
Na kakvoj se konfiguraciji to izvrsava? Sam agregatni upit si dobro postavio, ne vidim sta se tu moze optimizovati, osim da stavis index na polje po kom grupises, ili da selektujes pojedinacne sume, a da razliku dobijes u kodu kao (S1-S2):
Code:

...
Qry = "SELECT itemnr AS Artikl, SUM(soldpieces) - SUM(change) AS Prodaja FROM stat WHERE date BETWEEN " & Od & " and " & Do & " GROUP BY itemnr"
...
[ Ero S Ovoga Sveta @ 21.05.2007. 19:56 ] @
Po meni upit jeste dosta komplikovan.
Probaj da prvo samo izdvojis podatke iz baze za potrebne datume, a kasnije da rukujes sa
recordsetom jer ce biti mnogo manje podataka.
[ steve585 @ 21.05.2007. 20:00 ] @
Aplikacija je na Windows XP-u. Na bazu se spajam preko Gupte. Ne znam da li si vec radio sa njom. Fakat Ne kontam niti sam. Da stvar bude gora probao sam za tri mjeseca napraviti import samostalno i to je trajalo dobrih 30 minuta, pa sam napravio da se backup radi svaki dan, ali opet mu treba najmanje 20 minuta.
[ goranvuc @ 21.05.2007. 21:04 ] @
Prijatelju, ne znam ti ja sta je Gupta, mislio sam da koristis ADO. Da li si probao ovaj poslednji SQL koji sam ti poslao?
[ Ero S Ovoga Sveta @ 21.05.2007. 22:41 ] @
Mi se ovde ubismo da ti pomognemo a u stvari ne znamo ni o cemu se radi ni sta ti radis ni sta program
treba da radi ni kako radi ni sa cim radi ni ni ni ni......
Ajde nam ti daj ovo pa cemo sigurno naci neko rjesenje.

1. Pravi naziv te tvoje baze.(mada to nije toliko bitno)
2. Jel to access baza?(valjda jeste)
2. Ime te tvoje tabele sa "milijardu" polja.
3. Koliko ta tvoja tabela ima kolona i njihova imena po redu?
4. Sta trebas da izdvojis iz te tabele(koliko sam shvatio odredjene datume)?
5. Podatke iz koje kolone trebas da sabers?
6. Sta jos treba da se razvrstava ili sadira(ako treba)?

7. Sto nam vise informacija das lakse cemo da ti pomognemo.

Ovako lupamo gluposti i mi a i ti a ne znamo o cemu se radi.
NAJ BOLJE bi bilo kad bi ti okacio i tu bazu i taj tvoj program da mozemo da skinemo,
pa da vidimo o cemu se radi, naravno sem ako se u toj bazi ne nalazi, mozda, spisak
BIN LADENOVIH pristalica ili sta ti ja vec znam.
[ steve585 @ 22.05.2007. 20:14 ] @
Imam ove podatke:

2) Baza na kojoj se izvodi sporni upit nije Access baza. U pitanju je SQL Gupta Base.
3) Ime tabele je kodu stat
4) kolone nisam brojao, ali ih je oko 10 i bitne su mi ove kolone iz upita itemnr, soldpieces, change, date
5) Ne trebam odredjene datume vec razliku ukupne prodaje umanjene za eventualna storna za pojedine artikle
("SELECT itemnr AS Artikl, SUM(soldpieces) - SUM(change)")
6) Kada se izvrsi ovaj upit sa OpenRecordset uzimam artikle (itemnr as Artikl) i kolicinu prodaje (SUM(soldpieces) - SUM(change)), te ih prebacujem u Access bazu, koju poslije koristim za izradu izvjestaja

Za povezivanje na Gupta bazu koristim ADO.

Danas sam nasao mozda razlog zbog kojeg imam probleme. Naime, prije par dana napravit je restore sporne baze, kopirana je orginalna baza i stavita je u razvojno okruzenje gdje razvijam aplikaciju, te otada se javljaju problemi.

U excel-u sam napravio kod gdje iz orginalne baze uzimam trazene podatke i to prolazi bez vecih problema.

Ako treba jos koja informacija, tu sam.
[ steve585 @ 22.05.2007. 21:41 ] @
Ispravak podresnog navoda

Ime tabele je stat i nalazi se u kodu koji sam ranije postovao.

Gorane probao sam ovu kombinaciju sa dva sum jos prije no sto sam post-ovao problem na forum.
[ Ero S Ovoga Sveta @ 22.05.2007. 22:00 ] @
Ako sam ja dobro shvatio......
Probaj da uradis ovako:
Kada otvoris konekciju onda postavi upit ovako:
Code:

    Qry= "SELECT * FROM stat WHERE datum BETWEEN " & Od & " and " & Do
    Set adoRS = New ADODB.Recordset
    adoRS.Open Qry, adoConn

Znaci sad si izdvojio podatke koji ti trebaju, i u adoRS se nalazi bitno manje podataka nego u
cijeloj tabeli. Sada izvodi operacije na njemu i sabiraj kolone koje ti trebaju i prebacuj ih u Access bazu.
Recimo ovako:
Code:

Dim cSolid As Currency
Dim cCh As Currency
Dim cRezultat As Currency

   Do While Not adoRS.EOF = True
        cSolid = cSolid + adoRS.Fields("soldpieces")
        cCh = cCh + adoRS.Fields("change")
        adoRS.MoveNext
   Loop
   
   cRezultat = cSolid - cCh

Isto tako prebaci potrebne podatke u access bazu.
Po meni ovako bi trebalo mnogo brze da uradi. Probaj pa javi daa vidimo sta dalje ako nije uredu.
Jos nesto, ako ti ne prdstavlja problem umjesto Currency tipa koristi Single jer je
procesoru laksi za obradu pa ce se samim tim kod brze izvrsavati.
[ VlaJan @ 22.05.2007. 22:30 ] @
Mozda da probas sa ADODB.Parameter?
Tj.
...... (Datum BETWEEEN ? And ? ).....
[ goranvuc @ 23.05.2007. 15:11 ] @
@steve585, ja nemam neke vece primedbe na koncept, kao i kod koji si koristio za resavanje problema, verovatno je nesto do samog sistema, posto kazes da ti to iz Excela prolazi bez problema. Verovatno je neka banalnost iz "zone sumraka" kao i obicno, a pristup ti je OK.

Na zalost, nemam kod sebe Gupta SQL Server (vidim na netu da je to komercijalno resenje), tako da ti ne mogu pomoci oko toga.
[ steve585 @ 23.05.2007. 18:30 ] @
Cuj stari, hvala ti i na ovoj pomoci. Vec sam poceo sumnjati u samoga sebe. Kao sto rekoh privremeno sam nasao rjesenje, pa cu se ovih dana posveti razvoju ostalih elemenata aplikacije. Ako koga zanima mogu postaviti nacin spajanja na Guptu sa ADO objektom.

Pozdrav!