Skip to Content

Indexed Field i Odoo: Praktisk Guide for Udviklere og Konsulenter

Forklaring af, hvordan indeks i Odoos ORM påvirker databasen, hvornår du skal oprette dem, og hvilken betydning de har for ydelsen
6. marts 2026 af
Indexed Field i Odoo: Praktisk Guide for Udviklere og Konsulenter
Dasolo
| Ingen kommentarer endnu

Introduktion


Hvis du nogensinde har kigget på feltdefinitioner i Odoo-kode, har du sandsynligvis set index=True på et felt. Det virker som en lille detalje, næsten usynlig, men den kan have stor betydning for, hvor hurtigt systemet reagerer, når brugere søger, filtrerer eller gennemser store datamængder.


Denne guide forklarer, hvad et indekseret felt betyder i Odoos datamodel, hvordan det påvirker PostgreSQL-databasen, og hvornår det er hensigtsmæssigt at bruge det i dit eget udviklingsarbejde. Uanset om du bygger et nyt modul eller gennemgår en eksisterende løsning, hjælper kendskab til indeksering dig med at træffe bedre beslutninger.

Hvad er et indekseret felt i Odoo


I Odoo ORM markeres et felt som indekseret ved at sætte index=True i feltdefinitionen. Det er en instruktion til Odoo om at bede PostgreSQL om at oprette et indeks på den tilhørende kolonne, når modulet installeres eller opdateres.


Her er et enkelt eksempel på, hvordan et felt kan defineres i en Python-model i Odoo:

class SaleOrder(models.Model):
    _name = 'sale.order'

    reference = fields.Char(string='Reference', index=True)
    state = fields.Selection([...], index=True)
    partner_id = fields.Many2one('res.partner', index=True)

Brugeren kan ikke se, om et felt er indekseret i brugergrænsefladen — indeksering foregår helt under motorhjelmen i databasen. Formularer og listevisninger ændrer sig ikke visuelt af, at et felt har et indeks.


Den praktiske effekt er hastighed. Et indeks gør opslag meget hurtigere på tabeller med tusinder eller millioner af rækker. Uden indeks må databasen gennemløbe alle rækker (en sekventiel scan) for at finde match; med indeks navigerer PostgreSQL i en sorteret datastruktur og henter resultaterne langt mere effektivt.


Hvilke Odoo-felttyper understøtter index=True

De fleste simple (skalare) felttyper i Odoo understøtter index-attributten:

  • Char- og Text-felter
  • Integer- og Float-felter
  • Date- og Datetime-felter
  • Selection-felter
  • Many2one-felter (meget almindeligt indekseret)
  • Boolean-felter

Relationelle felter som One2many og Many2many repræsenteres ikke af en enkelt kolonne på samme måde, så index-attributten er ikke relevant for dem. Computed felter, der ikke er gemt i databasen, kan heller ikke indekseres, da der intet fysisk kolonnefelt er at indeksere.

Hvordan feltet fungerer


Når Odoo initialiserer eller opgraderer et modul, læser systemet feltdefinitionerne og synkroniserer databasens skema. For hvert felt med index=True udfører Odoo en SQL-kommando, der opretter et indeks på den tilsvarende kolonne i PostgreSQL.


Som standard oprettes et B-tree-indeks i PostgreSQL — det er standardtypen og egner sig godt til lighedsoperationer (=), ranges (>, <, BETWEEN) og sortering. Det dækker langt hovedparten af Odoos søge- og filtreringsbehov.


Hvordan det spiller sammen med Odoo ORM'en

ORM'en omsætter Python-domæner til SQL-spørgsmål. Skriv du for eksempel [('state', '=', 'sale')], genereres en WHERE state = 'sale'-sætning. Har feltet state et indeks, bruger PostgreSQL det til at finde rækkerne uden at scanne hele tabellen.


Many2one-felter er et oplagt eksempel. Et felt som partner_id på en salgsordre gemmer en integer-ID. Når du filtrerer ordrer for en bestemt kunde, udfører Odoo en forespørgsel med WHERE partner_id = X. Et indeks på partner_id sikrer, at denne søgning forbliver hurtig, selv når ordrehistorikken er meget stor.


Indeksers effekt på skriveperformance

Indeks er ikke gratis: ved indsættelse, opdatering eller sletning skal PostgreSQL også opdatere alle tabellens indeks. Mange indeks kan gøre skriveoperationer langsommere. For de fleste scenarier i Odoo er kompromiset acceptabelt, men man bør undgå at indeksere alt uden overvejelse.

Muligheden index='trigram'

Fra Odoo 16 kan index-attributten også være strengen 'trigram'. Det beder PostgreSQL om at oprette et GIN-trigram-indeks via pg_trgm-udvidelsen, som er effektiv til mønstersøgning med ILIKE. Det er nyttigt for felter, hvor brugerne søger på delvise tekststykker, fx varenavne eller kundenavne.


name = fields.Char(string='Product Name', index='trigram')

Denne mulighed bruges i nogle standardmoduler til felter, som ofte bliver søgt med delvise tekstudtryk.

Forretningsmæssige anvendelser


Indekserede felter gør en forskel i mange konkrete Odoo-arbejdsgange. Nedenfor er fem praktiske eksempler, hvor indeksering mærkbart forbedrer ydeevnen.


1. CRM: Filtrering af leads efter ansvarlig sælger

I CRM filtrerer ledere ofte pipeline på ansvarlig bruger. Feltet user_idcrm.lead er typisk indekseret, hvilket holder filtrering hurtig, selv med tusindvis af leads. Tilsvarende gælder, hvis du tilføjer et custom Many2one-felt til bruger eller team — indeks er relevant.


2. Salg: Søgning efter ordrer efter status

Feltet statesale.order er indekseret, hvilket gør det hurtigt at hente bekræftede ordrer eller filtrere ordrer, der venter på levering. Selection-felter, der bruges ofte som filterkriterier, er gode kandidater til indeks.


3. Lager: Sporing af bevægelser pr. produkt

Stock moves kan vokse voldsomt for distributører og producenter. product_idstock.move er indekseret, så forespørgsler om bevægelser for et bestemt produkt er effektive. Uden indeks ville sporingsrapporter blive meget langsommere i travle lagre.


4. Regnskab: Filtrering af posteringer efter partner

Bogholderiet åbner ofte hovedbogen for en bestemt kunde eller leverandør. partner_idaccount.move.line er indekseret for at holde disse opslag hurtige. På virksomheder med mange års historik er det ofte netop dette indeks, der forhindrer timeout i ældre debitorrapporter.


5. Custom-moduler: Referencefelter for sporbarhed

I skræddersyede moduler tilføjer man ofte referencefelter — fx et projektkode eller eksternt dokumentnummer. Hvis brugerne søger eller filtrerer regelmæssigt på den reference, er index=True en enkel måde at sikre, at søgninger forbliver hurtige, efterhånden som datamængden vokser.


Oprettelse eller tilpasning af et indekseret felt


I Python (udvikling af custom-modul)

Det er enkelt at tilføje index=True i en Python-feltdefinition: medtag det blot som et keyword-argument, når feltet deklareres.


from odoo import models, fields

class ProjectTask(models.Model):
    _inherit = 'project.task'

    x_external_ref = fields.Char(
        string='External Reference',
        index=True,
        help='Reference number from the external system'
    )

Efter du har opdateret modulet, kør odoo-bin -u dit_modul_navn eller opgrader via Apps-menuen. Odoo registrerer det nye felt og opretter det tilhørende indeks i databasen.


Du kan også indeksere et eksisterende felt ved at arve modellen og overskrive definitionen, men det kræver omtanke for ikke at ændre feltets adfærd utilsigtet.


I Odoo Studio

Odoo Studio lader ikke-tekniske brugere oprette felter via UI, men Studio viser ikke en indstilling til at slå indeks til eller fra. Felter oprettet gennem Studio er gemt som manuelle felter og får ikke automatisk index=True.


Hvis en Studio-oprettet felt skal indekseres af performancegrunde, er den bedste fremgangsmåde at flytte ændringen til et rigtigt Python-modul og sætte index=True dér — typisk noget en udvikler håndterer.


Oprettelse af indeks direkte i PostgreSQL

I visse tilfælde, fx optimering af en produktionsdatabase uden modulopgradering, kan en DBA oprette et indeks direkte med SQL:

CREATE INDEX CONCURRENTLY idx_sale_order_partner_id
ON sale_order (partner_id);

At bruge CONCURRENTLY undgår låsning under opbygning af indekset, hvilket er vigtigt i drift. Samtidig bør denne ændring koordineres med Odoo-modulets definition, så kode og database ikke kommer i uoverensstemmelse ved senere opgraderinger.


Bedste praksis


Indeksering af felter, der bruges i søgedomæner

Hvis et felt ofte indgår i domænefiltre — i listefiltre, automatiske handlinger, planlagte jobs eller afhængigheder i beregnede felter — er det et godt indekskandidat. Typisk gælder det Many2one-felter, statusfelter og referencefelter.


Følg Odoos egne valg

Et solidt pejlemærke er Odoos egne standardmoduler. Se hvilke felter der er indekseret i sale.order, account.move eller stock.move. De valg er baseret på reelle brugsmønstre og performance-data fra mange produktionsmiljøer.


Indekser altid Many2one-felter på højvolumen-modeller

På modeller, der akkumulerer mange rækker over tid (fx journal entries, stock moves, sales order lines), bør Many2one-felter, som bruges til filtrering, altid indekseres. Omkostningen ved et ekstra indeks på en skriveintensiv tabel er som regel opvejet af den forbedrede læseperformance.


Overvej trigram-indeks til tekstsøgning

På Odoo 16+ bør du overveje index='trigram' for Char-felter, hvor brugerne ofte søger på delvise ord eller stavevarianter — fx vare- eller kundenavne. Trigram er specielt designet til denne type ILIKE-søgninger.


Sørg for, at indeks faktisk bruges

Efter oprettelse af et indeks kan du kontrollere, om PostgreSQL bruger det, ved at køre EXPLAIN ANALYZE på den relevante forespørgsel. Hvis planlæggeren stadig vælger sekventiel scan, kan tabellen være for lille, eller forespørgslens mønster passer ikke til indeks-typen.


Dokumentér dine indeksvalg

Når du udvikler custom-moduler, så efterlad en kort kommentar om, hvorfor et felt er indekseret. Det hjælper senere udviklere og konsulenter med at forstå hensigten og undgå ved et uheld at fjerne indekset under refaktorering.

Almindelige faldgruber


Indeksering af alle felter som standard

En udbredt fejl er at sætte index=True på alle felter 'for en sikkerheds skyld'. Det er kontraproduktivt: hvert indeks bruger plads og gør skriverier langsommere. På meget skriveintensive tabeller kan for mange unødvendige indeks tydeligt forringe ydelsen.


Indeksering på små tabeller

På tabeller med få hundrede rækker vil PostgreSQL ofte foretrække sekventiel scan frem for indeksbrug. Indeks begynder først at betale sig, når tabellen vokser til tusinder af rækker. Indekser på små opslags- eller sjældent fyldte modeller giver sjældent nogen praktisk gevinst.


Glemme at opgradere modulet efter at have tilføjet index=True

At tilføje index=True i Python skaber ikke indeks automatisk uden en modulopgradering. Du skal køre -u module_name eller opgradere via backend. At springe dette trin over er en almindelig årsag til forvirring i udvikling og kan medføre, at performanceændringer ikke træder i kraft.


Forventninger om indeks på ILIKE-søgninger

Et almindeligt B-tree-indeks hjælper ikke på ILIKE '%søgeord%'-forespørgsler med førende wildcard. PostgreSQL kan ikke bruge B-tree til mønstersøgning med førende wildcard. Behøves hurtig deltekst-søgning, brug index='trigram' (Odoo 16+) eller overvej fuldtekst-søgning.


Overset gemte beregnede felter

Gemme beregnede felter (store=True) oprettes som rigtige kolonner og kan indekseres. Man glemmer nogle gange dette og går glip af en chance for at optimere filtre, der bygger på afledte værdier. Hvis et gemt felt er hyppigt brugt i domæner, er indeks ofte en god idé.

Konklusion


At sætte index=True er en lille kodeændring med reel betydning for ydeevnen, efterhånden som datamængden vokser. Bruget rigtigt holder søgninger og rapporter hurtige; brugt uden omtanke skaber det unødig overhead.


Hovedbudskabet er enkelt: indekser felter, der ofte indgår i domænefiltret — især Many2one-felter på højvolumen-modeller. Følg Odoos egne valg, undgå over-indeksering af små eller sjældent filtrerede felter, og på Odoo 16+ overvej index='trigram' til tekstsøgning med delvise strenge.


Det er langt nemmere at få indekseringsstrategien rigtig fra starten af et udviklingsprojekt end at jagte langsomme forespørgsler i produktion bagefter.

Arbejder I med en Odoo-implementering?


Hos Dasolo hjælper vi virksomheder med implementering, tilpasning og optimering af Odoo. Uanset om I bygger egne moduler, forbedrer performance i et eksisterende miljø eller planlægger et nyt projekt, leverer vi praktisk teknisk ekspertise.


Oplever I langsomme forespørgsler, komplekse tilpasninger eller behov for vejledning i Odoo-udvikling, står vi klar til at hjælpe. Kontakt Dasolo-teamet og fortæl os, hvad I arbejder på.

Indexed Field i Odoo: Praktisk Guide for Udviklere og Konsulenter
Dasolo 6. marts 2026
Del dette indlæg
Log ind for at skrive en kommentar