Avatar billede nesredep Nybegynder
23. marts 2005 - 16:28 Der er 5 kommentarer

Optimering af databasekald.

PostgreSQL optimering!..

jeg har g.user_id at gå ud fra, og jeg ønsker at hente u.id og u.username ud samt g.approved

tabel g
-----------------
group_id, user_id, approved

tabel n
-----------------
user_id, buddylist_groupid

tabel u
-----------------
id, username

FACTS:
-------
g.group_id=n.buddylist_groupid
n.user_id=u.userid
g.approved=0

min løsning
----------
g.user_id -> g.group_id -> n.buddylist_groupid -> n.user_id -> u.*


SELECT u.*, g.approved FROM group_namespace_buddylist g, users u, user_namespace_spil n WHERE n.user_id = u.id AND g.user_id = ? AND g.group_id = n.buddylist_groupid AND g.approved = 0;

KAN DEN OPTIMERES? :)

komplet beskrivelse af tabellerne.
--------

buddylist g
----------------------------------------
    Column    |  Type  |  Modifiers
--------------+---------+---------------
group_id    | integer | not null
user_id      | integer | not null
approved    | boolean | default false



name_spil n
-----------------------------------------------------
        Column          |    Type      | Modifiers
-------------------------+---------------+-----------
user_id                | integer      | not null
buddylist_groupid      | integer      |


users
-----------------------------------------------------------------------------------
  Column  |        Type          |                  Modifiers
----------+-----------------------+------------------------------------------------
id      | integer              | not null default nextval('users_id_seq'::text)
username | character varying(64) | not null
status  | integer              | not null
Avatar billede nesredep Nybegynder
23. marts 2005 - 16:28 #1
yikes det så knap så pænt ud.. - nå, håber i kan se jer ud af det.
Avatar billede arne_v Ekspert
23. marts 2005 - 16:32 #2
Næppe.

Mne der skal være INDEX på alle felter i WHERE betingelserne som ikke
er primær nøgler.
Avatar billede nesredep Nybegynder
23. marts 2005 - 16:35 #3
Der er indexes på, de felter som der skal være.

hm :/
Avatar billede dsj Nybegynder
23. marts 2005 - 18:03 #4
Hvis du har oprette ét index på hver af kolonnerne i dine where-betingelser, kan det optimere med mere præcise indekseringer på flere kolonner. Følgende burde være bedre end ét index på hver enkelt kolonne:

CREATE INDEX "IX_buddylist" ON buddylist USING btree (group_id, user_id, approved);

Vær dog opmærksom på, at PostgreSQL ignorerer indekseringer på tabeller med mindre end 1000-1500 _estimerede_ rækker. PostgreSQL går ud fra de estimerede metadata, når den skal beslutte hvorledes et SQL-statement skal afvikles, hvorfor det er vigtigt, at du ofte afvikler en VACUUM på dine tabeller, f.eks. som et CRON-job en gang om natten eller en gang om ugen, afhængigt af, hvor meget antallet af tabellernes tupler ændres.
Avatar billede dsj Nybegynder
23. marts 2005 - 18:04 #5
Med ovennævnte index, bør du i øvrigt stadig have et enkelt index på hver af kolonnerne:

n.user_id
u.id
n.buddylist_groupid
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