Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Joins mellem tabeller på to servere

3 views
Skip to first unread message

Leif Neland

unread,
Apr 13, 2012, 9:07:25 AM4/13/12
to
I et cms-system (cakephp) haves en tabel med varenumre i postgresql.
Der ønskes varebeskrivelser, billedurl etc, der ligger i mssql på en anden
server

cakephp har hentet varenumre til et array, og beskrivelse etc skal tilføjes
til dette array
Array
(
[0] => Array
(
[Prod] => Array
(
[id] => 4f7c470f-c220-4cf3-bc8e-50e92d125235
[varenr] => 2345678
)

)

[1] => Array
(
[Prod] => Array
(
[id] => 4f88131d-adf0-4055-8311-303c2d125235
[varenr] => 123456
)

)

)
Der er nu to muligheder:
1: løb array igennem,. for hver varenummer,. lav et "select ... where
varenr=$varenr" til mssql og tilføj resultatet til array'et.

2: løb array igennem, og byg en kommasepareret streng af varenumre.
lav et "select ... where varenr in ('varenr1','varenr2','varenr3')
2a: Læs hver enkelt række, find den tilsvarende vare i arrayet og tilføj
data
2b: Læs alle data ind i et array og loop over det for at finde varen i det
oprindelige array.
Det er nok en ide at lave et index-array varenr->recordnr, når jeg løber
arrayet igennem første gang, så der ikke skal laves søgning i arrayet for at
finde varen.

Det er vel det mest effektive at hente mange data i et kald til databasen
fremfor at lave flere kald med færre data.

Eller hvad?

Eller måske skal jeg ikke spekulere for meget på det, fordi siderne bliver
cachet af cakephp...

Leif





Troels Arvin

unread,
Apr 13, 2012, 1:23:50 PM4/13/12
to
Leif Neland wrote:
> Der er nu to muligheder:
> 1: løb array igennem,. for hver varenummer,. lav et "select ... where
> varenr=$varenr" til mssql og tilføj resultatet til array'et.
>
> 2: løb array igennem, og byg en kommasepareret streng af varenumre.
> lav et "select ... where varenr in ('varenr1','varenr2','varenr3')
> 2a: Læs hver enkelt række, find den tilsvarende vare i arrayet og
> tilføj
> data
> 2b: Læs alle data ind i et array og loop over det for at finde varen i
> det
> oprindelige array.

Eller: Læg varenumrene ind i en temporær tabel, som du kan join'e mod i
MSSQL-databasen?

Andreas Andersen

unread,
Apr 13, 2012, 3:55:43 PM4/13/12
to
Den 13-04-2012 15:07, Leif Neland skrev:
> I et cms-system (cakephp) haves en tabel med varenumre i postgresql.
> Der ønskes varebeskrivelser, billedurl etc, der ligger i mssql på en anden
> server

mssql har en feature, der hedder linkedserver, hvor man tilføjer et link
til en anden databaseserver, og så kan lave joins på tværs af databaser.
Det skulle også virke med en postgresql-database. Altså så du på
mssql-serveren kan skrive noget i retning af

select * from mssql_table inner join postgresql_table on ...

Måske det er værd at kigge nærmere på.

--
Andreas

Arne Vajhøj

unread,
Apr 13, 2012, 7:17:52 PM4/13/12
to
3) Læs alt (ingen WHERE) fra SQLServer ind i et associativt array
med varenr som key og slå op i det. Det kræver en del memory, men
RAM er billigt idag.

4) Definer PostgreSQL serveren som en linked server i SQLServer og
lav en enkelt SELECT med en JOIN mod SQLServer. Jeg aner ikke
hvordan det vil performe, men du kan jo prøve.

5) Put en kopi af beskrivelses data i PostgreSQL serveren og put nogle
triggers på tabellen i SQLServer som opdaterer PostgreSQL kopien
(enten vie linked server eller via noget CLR kode).

Det er meget svært at sige hvad det virker bedst udfra det vi ved, så
du bør teste lidt.

Skal jeg gætte tror jeg på #5.

Arne


Jonathan Stein

unread,
Apr 16, 2012, 10:02:17 AM4/16/12
to
Den 13-04-2012 15:07, Leif Neland skrev:

> Det er vel det mest effektive at hente mange data i et kald til databasen
> fremfor at lave flere kald med færre data.

Måske... CakePHP kan cache database-opslaget, så de enkelte varenumre (i
hvert fald de mest brugte) vil hurtigt ligge i cachen. Til gengæld er
der (nok) mindre sandsynlighed for, at ét opslag med et tilfældigt
udvalg af varenumre er cachet.

Den bedste strategi afhænger af hvor mange data, du har, hvordan
opslagene er spredt, hvor ofte data opdateres (og krav til samtidighed i
opslagene) og en hel masse andet.

Hvis du ikke har nogen særlig årsag til at gøre det på en bestemt måde,
ville jeg starte med det, jeg fandt simplest, og så optimere efter behov.

M.v.h.

Jonathan

Martin

unread,
Apr 19, 2012, 3:57:32 AM4/19/12
to
Jeg ville nok vælge løsning #2.
DOG så skal du lige, ved rigtig mange produkter tænke på om du rammer
PHP's memory limit.

Det kunne også være en mulighed at lave en temporary (MEMORY) tabel også
lave en select fra dine to baser og smide data ind så du har en stor
tabel med det hele i, som du så selecter fra?


>
> Det er vel det mest effektive at hente mange data i et kald til databasen
> fremfor at lave flere kald med færre data.

Det er hurtigst at løbe et PHP array igennem end det er at løbe en
database igennem 1000 gange fx. - Ram/harddisk.

>
> Eller hvad?
>
> Eller måske skal jeg ikke spekulere for meget på det, fordi siderne bliver
> cachet af cakephp...

Husk lige at smide en profiler op, så du kan se hvad der faktisk caches,
tror ikke dine database kald bliver cachet nemlig - og hvis de gør, så
er det nok ikke meget mere end 5-10 min.

Stig Johansen

unread,
Apr 20, 2012, 1:34:14 AM4/20/12
to
Leif Neland wrote:

> I et cms-system (cakephp) haves en tabel med varenumre i postgresql.
> Der ønskes varebeskrivelser, billedurl etc, der ligger i mssql på en anden
> server

MS SQLServer har mulighed for 'linked servers'.

Prøv at se om din postgresql kan linkes (hint: drivere), og se om ikke du
kan få det til at fungere på denne måde.

--
Med venlig hilsen
Stig Johansen
0 new messages