/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
PostgreSQL, indflydelse på hvordan den gem~
Fra : Jesper Krogh


Dato : 05-04-04 12:41

Jeg har en tabel hvor der er et text felt og en blob på 250K i hver
record. Det at der er en blob gør at en LIKE '%sadfdsa%' søgning på
teksten går fra 78 msec til 30 sek på 90.000 records. Er der ikke en
måde at fortælle databasen at den gerne må gemme blobben for sig,
således at den ikke indvirker på en sådan søgning.

sd=> explain analyse select count(*) from tabwithoutblob where data like '%test%';
QUERY PLAN
----------------------------------------------------------------------------------------------------------
Aggregate (cost=22.52..22.52 rows=1 width=0) (actual time=77.83..77.83 rows=1 loops=1)
-> Seq Scan on tabwithoutblob (cost=0.00..22.50 rows=8 width=0) (actual time=0.78..76.64 rows=1560 loops=1)
Filter: (data ~~ '%test%'::text)
Total runtime: 77.90 msec
(4 rows)

sd=>
sd=> explain analyse select count(*) from tabwithblob where data like '%test%';
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------
Aggregate (cost=29831.05..29831.05 rows=1 width=0) (actual time=20883.02..20883.03 rows=1 loops=1)
-> Seq Scan on tabwithblob (cost=0.00..29829.06 rows=796 width=0) (actual time=19230.43..20881.65 rows=1560 loops=1)
Filter: (data ~~ '%test%'::text)
Total runtime: 20883.12 msec
(4 rows)

sd=>
--
../Jesper Krogh, jesper@krogh.cc, Jabber ID: jesper@jabbernet.dk


 
 
Kim Andersen (05-04-2004)
Kommentar
Fra : Kim Andersen


Dato : 05-04-04 13:40

"Jesper Krogh" <jesper@krogh.cc> wrote in message
news:c4rgl0$bjl$1@r2d2.krogh.cc...
> Jeg har en tabel hvor der er et text felt og en blob på 250K i hver
> record. Det at der er en blob gør at en LIKE '%sadfdsa%' søgning på
> teksten går fra 78 msec til 30 sek på 90.000 records. Er der ikke en
> måde at fortælle databasen at den gerne må gemme blobben for sig,
> således at den ikke indvirker på en sådan søgning.

Hvad med at lave to tabeller, men en relation i mellem dem? En tabel som
indeholder tekst til din blob, og en tabel som indeholder et id og en blob
til rå data ?

/Kim



Jesper Krogh (05-04-2004)
Kommentar
Fra : Jesper Krogh


Dato : 05-04-04 13:45

I dk.edb.database, skrev Kim Andersen:
> "Jesper Krogh" <jesper@krogh.cc> wrote in message
> news:c4rgl0$bjl$1@r2d2.krogh.cc...
> > Jeg har en tabel hvor der er et text felt og en blob på 250K i hver
> > record. Det at der er en blob gør at en LIKE '%sadfdsa%' søgning på
> > teksten går fra 78 msec til 30 sek på 90.000 records. Er der ikke en
> > måde at fortælle databasen at den gerne må gemme blobben for sig,
> > således at den ikke indvirker på en sådan søgning.
>
> Hvad med at lave to tabeller, men en relation i mellem dem? En tabel som
> indeholder tekst til din blob, og en tabel som indeholder et id og en blob
> til rå data ?

Det vil selvfølgeligt løse problemet. Men set fra et databasemæssigt
synspunkt, se er der jo ingen grund til at have en 1:1 relation mellem 2
tabeller at skulle opretholde.

Tanken var: "Det må være muligt at fortælle databasen at den skal være
'klogere'"


--
../Jesper Krogh, jesper@krogh.cc, Jabber ID: jesper@jabbernet.dk


Jesper Krogh (05-04-2004)
Kommentar
Fra : Jesper Krogh


Dato : 05-04-04 15:14

I dk.edb.database, skrev Jesper Krogh:
> sd=> explain analyse select count(*) from tabwithoutblob where data like '%test%';
> QUERY PLAN
> ----------------------------------------------------------------------------------------------------------
> Aggregate (cost=22.52..22.52 rows=1 width=0) (actual time=77.83..77.83 rows=1 loops=1)
> -> Seq Scan on tabwithoutblob (cost=0.00..22.50 rows=8 width=0) (actual time=0.78..76.64 rows=1560 loops=1)
> Filter: (data ~~ '%test%'::text)
> Total runtime: 77.90 msec
> (4 rows)
>
> sd=>
> sd=> explain analyse select count(*) from tabwithblob where data like '%test%';
> QUERY PLAN
> ---------------------------------------------------------------------------------------------------------------------
> Aggregate (cost=29831.05..29831.05 rows=1 width=0) (actual time=20883.02..20883.03 rows=1 loops=1)
> -> Seq Scan on tabwithblob (cost=0.00..29829.06 rows=796 width=0) (actual time=19230.43..20881.65 rows=1560 loops=1)
> Filter: (data ~~ '%test%'::text)
> Total runtime: 20883.12 msec
> (4 rows)
> sd=>

Ved at clustre tabellen efter "data" gave det et speedup til 317 msec..
så der var klart noget at hente


sd=> explain analyse select count(*) from traces where tracefilename like '%test%';
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
Aggregate (cost=12784.11..12784.11 rows=1 width=0) (actual time=317.35..317.35 rows=1 loops=1)
-> Seq Scan on tabwithblob (cost=0.00..12781.96 rows=858 width=0) (actual time=242.13..316.18 rows=1560 loops=1)
Filter: (data ~~ '%test%'::text)
Total runtime: 317.42 msec
(4 rows)

sd=>
--
../Jesper Krogh, jesper@krogh.cc, Jabber ID: jesper@jabbernet.dk
Jabber - Det eneste instant messaging system der sikrer DIT privatliv.


Søg
Reklame
Statistik
Spørgsmål : 177472
Tips : 31964
Nyheder : 719565
Indlæg : 6408315
Brugere : 218882

Månedens bedste
Årets bedste
Sidste års bedste