Avatar billede jeppson Nybegynder
20. juli 2007 - 16:54 Der er 5 kommentarer og
1 løsning

Brgrænse data som undersøges

Jeg har en forespørgsel som kontrollere om der er dubletter af fakturaer.

Kontrollen fortages på CVR-nr. og Fakturanr. - altså om vi fra samme leverandør har modtaget en faktura med samme nummer.

Den nuværende SQL gennemløber alle poster hver gang den køres (der er over 200.000 fakturaer og det tager nu omkring 3 timer - hænger sammen med hardware og datamængde (ja er der andre faktorer :-))

Jeg vil gerne at man kan angive et fakturaID (et fortløbende unikt nr. som tildeles i forbindelse med indlæsning af fakturaer) og så kontrolleres kun nyindlæste fakturaer om der er andre (i hele databasen) som er ens = dubletter.

Det burde begrænse eksekveringstiden betydeligt - da der ikke skal gennemgås over 200.000 fakturaer, men kun omkring 2.500 hver gang (får omkring 400 fakturaer om dagen).

Her er SQL'en:
select distinct
    case a.TYPE                  -- recordtype (0+1 = F = faktura    2+3 =
K = Kreditnota
        when 0 then 'F'
        when 1 then 'F'
        when 2 then 'K'
        when 3 then 'K'
        else '?'
    end TYPE,
    a.INVOICE_ID,
    a.CVRNR,
    a.SELLERINVOICENO,
    a.INVOICEDATE,
    a.STATUS,
    case a.STATUS
        when    'A'  then 'A - Afventer artskontering og varemodtagelse'
        when    'B'  then 'B - Afventer artskontering'
        when    'C'  then 'C - Afventer godkendelse og varemodtagelse'
        when    'D'  then 'D - Afventer godkendelse'
        when    'E'  then 'E - Afventer varemodtagelse'
        when    'F'  then 'F - Færdigbehandlet'
        when    'G'  then 'G - Færdigbehandlet. Er overført'
        when    'H'  then 'H - Afventer fejlbehandling og varemodtagelse'
        when    'I'  then 'I - Afventer fejlbehandling'
        when    'Z'  then 'G - Færdigbehandlet. Er overført - ARKIVERET'
        when    'X'  then 'X - Slettemarkeret'
        else a.status
    end STATUS_TEKST,
    a.TOBEPAIDTOTALAMOUNT,
    a.DELAE_ID,
    c.LASTNAME
from
    RIGETA.XINVOICE a,
    RIGETA.ADDRESS c
WHERE
    a.INVOICE_ID IN (SELECT
                                        d.INVOICE_ID
                                    from
                                        RIGETA.XINVOICE d
                                    WHERE
                                        d.status !='X'
                                    )
    AND
        EXISTS (
                            SELECT
                                *
                            from
                                RIGETA.XINVOICE b
                            where
                                b.INVOICE_ID IN (
                                                  SELECT
                                                    c.INVOICE_ID
                                                  from
                                                    RIGETA.XINVOICE c
                                                  WHERE
                                                    c.status !='X'
                                                )
                                AND
                                a.CVRNR = b.CVRNR
                                and
                                a.SELLERINVOICENO = b.SELLERINVOICENO
                                and
                                a.INVOICE_ID <> b.INVOICE_ID
                                and
                                c.MEMBER_ID = a.DELAE_ID
                                and
                                c.STATUS = 'P'
                            )
ORDER BY
    a.CVRNR,
    a.SELLERINVOICENO,
    a.INVOICE_ID

Bare så der ikke er tvivl er det INVOICE_ID som der skal kunne angives en "undersøg fra værdi".

Håber i kan hjælpe!
Avatar billede erikjacobsen Ekspert
20. juli 2007 - 19:13 #1
Med passende indexer skulle dette være realistisk på alle data (skitse):

    select cvr,fakturaid from DINTABEL group by cvr,fakturaid having count(*)>1
Avatar billede jeppson Nybegynder
20. juli 2007 - 20:52 #2
Men hvad hvis der ikke er passende indexer?

Kan det ikke lade sig gøre at tilpasse SQL'en uden disse indexer?

Jeg spørge fordi jeg har adgang til et udtræksværktøj, men ikke management adgang til data/server.
Avatar billede erikjacobsen Ekspert
20. juli 2007 - 21:04 #3
Nu arbejder man jo ikke med databaser uden at håndtere indexer - det svarer til at bygge en 8-sporet motorvej fra Århus over Samsø til Kalundborg, og så vedtage at der kun må køres med hestevogn. Så det du halvvejs siger, det er vel ikke hele sandheden ... ??

Men det vil være li'så hurtigt eller hurtigere at læse alle 200.000 poster igennem een gang lineært, proppe data ind i arrays og hashtabeller i et passende programmeringssprog (Perl, PHP, C#, Java, Pascal ....) og finde de der dobbelte fakturaer derudfra. Det vil tage få minutter på gængse maskiner.
Avatar billede jeppson Nybegynder
30. juli 2007 - 13:48 #4
Det kan godt være at jeg kører hestevogn, men jeg har ikke mulighed for at tilpasse indhold af index'er eller lignende.

Men dit forslag duede alligevel, hvorfor du får pointene :-) POst et svar :-)
Avatar billede erikjacobsen Ekspert
30. juli 2007 - 15:00 #5
;) Jeg samler slet ikke på point, tak.
Avatar billede jeppson Nybegynder
27. marts 2008 - 10:42 #6
Spørgsmål lukket
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester