Avatar billede thorvall Nybegynder
29. juli 2011 - 10:12 Der er 2 kommentarer og
1 løsning

Tilgå data ud fra placering i tabel, Rownumber, repartitionering, eller noget helt tredie

Rownumber, repartitionering, eller noget helt tredie

Er ved af flytte en database fra Oracle til MS-SQL og er i den forbindelse stødt på nogen udfordringer mht til vectorer og funktioner på disse.

Grundlæggende har jeg i Oracle en tabel med følgende række udseende {x1, x2, x3, x4, x5, Y{1:10000}}

Dette er i MS-SQL blevet til et layout med to tabeller {x1, x2, x3, x4, x5, Vector_nummer}
        {Vectornummer, Y{1}}
        {Vectornummer, Y{2}}
        {Vectornummer, Y{3}}
            ......   
      {Vectornummer, Y{10000}}                               
Problemet består i at der for forskellige værdier af x[1..5] er en sammenhæng mellem Y{i} for forskelligt vektor nummer. Og jeg skal helst kunne regne på disse. I Oracle er det nemt grundet at jeg kan refererer vector indgangene.

I databasen bliver Y{i}'erne gemt i ordnet rækkefølge så reelt vil jeg med en funktion ligende (rækkenummer mod 10000) kunne sammenligne rigtigt på tværs af vektorer. Men kan jeg reelt få den rækkefølge de er gemt i frem i et kald når jeg skal bruge ORDER BY ().

Men hvad er det bedste løsning (plads og hastighed er relevante faktorer, da data skal gemmes men normalt kun bruges en gang, er plads forbrug vigtigere end tid)


JOIN med en Where ala:
FROM [dbo].[VECTOR_VIEW] as a, [dbo].[VECTOR_VIEW] as b
AND a.ROW_NUMBER() OVER (ORDER BY a.x1 a.x2, a.x3, a.x4, a.x5 ) AS 'RowNumberA' =
b.ROW_NUMBER() OVER (ORDER BY b.x1, b.x2, b.x3, b.x4, b.x5 ) AS 'RowNumberB

([Vector_View] samler de to tabeller i en.)

Indfør en ny søjle i 'vector' tabellen med nummer
{Vectornummer, Y{1}, 1}...{Vectornummer, Y{i}, i}...{Vectornummer, Y{10000}, 10000}


Ændre layout mere radikalt {[x1..x5] har i alt 216 kombinationer, så lave en ny tabel med 217 rækker:
                                {Vectornummer, Y[1;1], [Y2;1] ..... [y216,1]}
                                {Vectornummer, Y[1;2], [Y2;2] ..... [y216,2]}
                                            ..........
                                {Vectornummer, Y[1;10000], [Y2;10000] ..... [y216,10000]}
                               

Mit umidelbare ide er at 'join' ideen ikke vil fylde mere, men vil en sådan rownumber strategi fungere, og vil den være væsentligt langsommere

Og for udvidelse af vector tabellen er det mest pladsen jeg tænker på da denne tabel vel udgør +90% af databasen. Og udvidelsen vil vil førøge tabellen med omkring 1/3.

Og samling i en ny tabel er vel i mod normaliserings ideen og dermed vil kunne påvirke hastigheden.

JOIN ideen med row_number er den jeg tror mest på, og den enste hvor jeg ikke skal ændre på 'data import processen'
Eller har jeg tænkt helt forkert, og i så tilfælde hvorledes bør jeg så angribe problematikken.
Avatar billede janus_007 Nybegynder
29. juli 2011 - 13:21 #1
Sql Serveren er meget smartere end Oracle, du skal bruge CLR istedet til den slags. User Defined Function CLR og data typer :)
Avatar billede thorvall Nybegynder
29. juli 2011 - 13:58 #2
Tak for responsen

Vil nødigt ud i CLR. Har ikke erfaring med at bruge disse til

Bruger UDF til funktionerne men har ikke lige en idé til hvorledes jeg via eksterne kald (clr) kan etablere den rette rækkefølge.

Som jeg ser det har jeg behov for at gå igennem data i den rækkefølge de er gemt i, og kan ikke helt se hvor lige CLR vil hjælpe specielt der?

Eller er det fordi du mener at jeg bør løse problematikken inden data reelt gemmes i DB?
Avatar billede thorvall Nybegynder
28. januar 2012 - 14:00 #3
lukkes
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