Skip to Content

Indekseret Felt i Odoo: En Praktisk Guide til Udviklere og Konsulenter

Hvordan index-attributten fungerer i Odoo ORM, hvornår man skal bruge den, og hvad den betyder for din databasepræstation
6. marts 2026 af
Indekseret Felt i Odoo: En Praktisk Guide til Udviklere og Konsulenter
Dasolo
| Ingen kommentarer endnu

Introduktion


Hvis du har brugt tid på at skrive eller gennemgå Odoo-feltddefinitioner, er du sandsynligvis stødt på noget som index=True på et felt. Det ser lille ud, næsten som en eftertanke. Men den enkelte attribut kan gøre en betydelig forskel i, hvor hurtigt din Odoo-instans reagerer, når brugere søger, filtrerer eller navigerer i store datasæt.


Denne guide gennemgår, hvad et indekseret felt faktisk er i konteksten af Odoo-datamodellen, hvordan det påvirker din database, og hvornår det giver mening at bruge det i dit eget Odoo-udviklingsarbejde. Uanset om du bygger et tilpasset modul eller gennemgår en eksisterende implementering, vil forståelsen af dette koncept hjælpe dig med at træffe bedre beslutninger.

Hvad er et indekseret felt i Odoo


I Odoo ORM erklæres et felt som indekseret, når dets definition inkluderer index=True. Dette fortæller Odoo at bede PostgreSQL om at oprette et B-tree-indeks på den tilsvarende databasekolonne, når modulet installeres eller opdateres.


Her er et simpelt eksempel fra en Odoo-feltddefinition i Python:

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)

Fra et brugergrænsefladeperspektiv er der ikke noget synligt om indekserede felter. En bruger, der udfylder en formular eller gennemser en listevisning, har ingen måde at vide, om et felt er indekseret eller ej. Indekseringen er helt og holdent et database-niveau problem.


Hvad det påvirker, er hastigheden. Når et felt er indekseret, kan PostgreSQL finde matchende poster meget hurtigere, især på tabeller med tusinder eller millioner af rækker. Uden et indeks skal databasen scanne hver række i tabellen for at finde dem, der matcher dine søgekriterier. Med et indeks navigerer den i en sorteret struktur og finder resultaterne direkte.


Hvilke Odoo-felttyper understøtter index=True

De fleste skalarfelttyper i Odoo ORM understøtter index-attributten:

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

Relationelle felter som One2many og Many2many har ikke en direkte kolonne at indeksere på på samme måde, så index-attributten er ikke relevant for dem. Beregnede felter, der ikke er gemt, kan heller ikke indekseres, da de ikke har en databasekolonne.

Hvordan feltet fungerer


Når Odoo initialiserer eller opgraderer et modul, læser det alle feltddefinitioner og synkroniserer databaseskemaet. For ethvert felt med index=True udfører Odoo en SQL-forespørgsel for at oprette et indeks på den kolonne i PostgreSQL.


Som standard opretter PostgreSQL et B-træindeks, som er den standard indeks type og fungerer godt til lighedssammenligninger (=), rækkeforespørgsler (>, <, BETWEEN) og sortering. Dette dækker langt størstedelen af, hvad Odoo gør, når det filtrerer poster i listevisninger eller beregner domænebaserede søgninger.


Hvordan det interagerer med Odoo ORM

Odoo ORM oversætter Python domænsfiltre til SQL-forespørgsler. Når du skriver et domæne som [('state', '=', 'sale')], genererer ORM noget som WHERE state = 'sale'. Hvis state-feltet har et indeks, bruger PostgreSQL det til effektivt at løse den betingelse uden at scanne hele tabellen.


Many2one-felter er en meget almindelig brugssag. I Odoos datamodel gemmer et felt som partner_id på en salgsordre den heltal ID for den relaterede partner. Når du åbner listen over ordrer filtreret efter kunde, kører Odoo en forespørgsel med en WHERE partner_id = X betingelse. Med et indeks på partner_id er den opslag hurtig, selv med hundrede tusinde ordrer i databasen.


Indekser og skrivepræstation

Indekser er ikke gratis. Hver gang en post oprettes, opdateres eller slettes, skal PostgreSQL opdatere alle indekser på den tabel også. På tabeller med mange indekser tager skriveoperationer lidt længere tid. For de fleste Odoo-brugssager er denne afvejning det værd, men det er værd at forstå, at indeksering af alt ikke altid er den rigtige løsning.

Indeks='trigram' muligheden

I Odoo 16 og senere versioner accepterer index-attributten ikke kun True, men også strengen 'trigram'. Dette opretter et GIN trigram indeks ved hjælp af pg_trgm PostgreSQL-udvidelsen, som understøtter hurtig mønstergenkendelse med ILIKE-forespørgsler. Dette er særligt nyttigt til tekstsøgning på felter som produktnavne eller partnernavne, hvor brugere ofte indtaster delvise strenge i søgefeltet.


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

Dette er en mere avanceret mulighed, der bruges i Odoos egne standardmoduler til felter, der ofte søges efter delvis tekst.

Forretningsanvendelser


Indekserede felter vises i mange reelle Odoo-arbejdsgange. Her er fem praktiske eksempler, hvor indeksering af et felt gør en mærkbar forskel.


1. CRM: Filtrering af Leads efter Salgsrepræsentant

I CRM filtrerer salgsledere regelmæssigt pipeline efter salgsrepræsentant. Feltet user_idcrm.lead er indekseret som standard i Odoo, hvilket gør filtrering efter salgsrepræsentant hurtigt, selv med tusindvis af leads. Hvis du tilføjer et brugerdefineret Many2one-felt, der peger på en bruger eller et team, følger indeksering det samme logik.


2. Salg: Søgning efter Ordrer efter Status

Feltet statesale.order er indekseret. Dette er, hvad der gør indlæsning af listen over bekræftede ordrer, eller filtrering efter ordrer, der venter på levering, hurtigt for virksomheder, der behandler store mængder. Valgfelter, der ofte bruges som filterkriterier, er gode kandidater til indeksering.


3. Lager: Sporing af Bevægelser efter Produkt

Lagerbevægelser i Odoo kan vokse til meget store mængder, især i distributions- eller fremstillingsvirksomheder. Feltet product_idstock.move er indekseret, hvilket gør det effektivt at forespørge alle bevægelser for et specifikt produkt. Uden dette indeks ville produktsporingsrapporter blive smertefuldt langsomme i travle lagre.


4. Regnskab: Filtrering af Journalposter efter Partner

Revisorer åbner ofte hovedbogen for en specifik kunde eller leverandør. Feltet partner_idaccount.move.line er indekseret for at gøre disse opslag effektive. I virksomheder med mange års regnskabshistorik er dette indeks, hvad der holder rapporten over forfaldne tilgodehavender fra at timeout.


5. Brugerdefinerede Moduler: Referencefelter til Sporbarhed

Når du bygger brugerdefinerede moduler, er det almindeligt at tilføje referencefelter, der linker poster på tværs af modeller, for eksempel en brugerdefineret projektkode eller et eksternt dokumentnummer. Hvis brugerne regelmæssigt vil søge eller filtrere efter dette referencefelt, er det en ligetil måde at holde disse søgninger hurtige, efterhånden som data vokser, at tilføje index=True.


Oprettelse eller tilpasning af et indekseret felt


I Python (Udvikling af Brugerdefinerede Moduler)

At tilføje index=True til en feltdefinition i et Python-modul er ligetil. Du inkluderer det simpelthen som et nøgleordargument, når du erklærer feltet:


from odoo import models, fields

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

    x_external_ref = fields.Char(
        string='Ekstern Reference',
        index=True,
        help='Reference nummer fra det eksterne system'
    )

Efter at have tilføjet dette felt til dit modul, skal du køre odoo-bin -u your_module_name eller opgradere modulet gennem Apps-menuen. Odoo vil registrere det nye felt og oprette det tilsvarende indeks i databasen.


Du kan også tilføje et indeks til et eksisterende felt ved at arve det og overskrive definitionen, selvom denne tilgang kræver omhu for at undgå utilsigtede bivirkninger på den originale felts adfærd.


I Odoo Studio

Odoo Studio giver ikke-tekniske brugere mulighed for at oprette felter gennem grænsefladen. Dog tilbyder Studio i øjeblikket ikke en mulighed for at tænde eller slukke for indeksering, når felter oprettes. Felter oprettet gennem Studio gemmes i databasen som manuelle felter og har ikke index=True indstillet som standard.


Hvis du har brug for, at et Studio-oprettet felt skal indekseres af hensyn til ydeevnen, er den reneste vej at konvertere Studio-tilpasningen til et ordentligt Python-modul og tilføje index=True i koden. Dette falder ind under teknisk tilpasning og håndteres typisk af en Odoo-udvikler snarere end en Studio-bruger.


Tilføjelse af et indeks direkte i PostgreSQL

I nogle situationer, såsom når man optimerer en eksisterende produktionsdatabase uden en modulopgradering, kan en databaseadministrator tilføje et indeks direkte ved hjælp af SQL:

CREATE INDEX CONCURRENTLY idx_sale_order_partner_id
ON sale_order (partner_id);

Brug af CONCURRENTLY undgår at låse tabellen under indeksoprettelsen, hvilket er vigtigt i produktionsmiljøer. Det skal dog bemærkes, at denne tilgang bør koordineres med Odoo-moduldefinitionen for at holde Python-koden og databasen synkroniseret. Hvis modulet senere opgraderes, kan Odoo muligvis eller måske ikke håndtere indekset afhængigt af, hvad der er i feltdefinitionen.


Bedste praksis


Indeksfelter, der vises i søgedomæner

Hvis et felt regelmæssigt bruges i domænefiltre, enten i listevisningsfiltre, automatiserede handlinger, planlagte job eller beregnede feltafhængigheder, er det en god kandidat til indeksering. De mest almindelige eksempler er Many2one-relationelle felter, statusfelter og reference- eller kodefelter.


Følg Odoo's egne konventioner

Den bedste reference for, hvornår man skal bruge index=True, er Odoo's egen kildekode. Se på de standard feltdefinitioner i sale.order, account.move eller stock.move for at se, hvilke felter Odoo's egne udviklere har valgt at indeksere. Disse valg er baseret på reelle brugsdata og præstationsdata fra tusindvis af produktionsdatabaser.


Indekser altid Many2one-felter på højvolumenmodeller

For modeller, der akkumulerer et stort antal poster over tid (journalposter, lagerbevægelser, salgsordrelinjer), skal du altid indeksere Many2one-felter, der bruges til filtrering. Omkostningen ved et ekstra indeks på en skrive-tung tabel er næsten altid det værd i forhold til forbedringen af læseydelsen.


Overvej trigramindeksering for tekstsøgningsfelter

På Odoo 16 og senere, hvis brugere ofte søger efter poster ved at indtaste delvise strenge i et Char-felt såsom et produktnavn, partnernavn eller dokumentreference, overvej at bruge index='trigram' i stedet for det standard B-træindeks. Trigramindekser er specifikt designet til ILIKE mønster match.


Bekræft at indekser faktisk bliver brugt

Efter at have tilføjet et indeks, kan du bekræfte, at PostgreSQL bruger det ved at køre en EXPLAIN ANALYZE på forespørgslen. Hvis forespørgselsplanlæggeren stadig vælger en sekventiel scanning, kan tabellen være for lille til, at indekset er gavnligt, eller forespørgselsbetingelserne er måske ikke kompatible med indekstype.


Dokumenter dine indekseringsbeslutninger

Når du bygger tilpassede moduler, skal du efterlade en kort kommentar, der forklarer, hvorfor et felt er indekseret. Dette hjælper fremtidige udviklere og konsulenter med at forstå hensigten og undgå ved et uheld at fjerne indekset under en refaktorering.

Almindelige faldgruber


Indeksering af hvert felt som standard

En almindelig fejl, når man lærer om indeksering, er at tilføje index=True til hvert felt bare for at være på den sikre side. Dette er kontraproduktivt. Hver indeks optager lagerplads og tilføjer overhead til hver skriveoperation. På tabeller, der modtager et højt volumen af indsættelser eller opdateringer, kan unødvendige indekser mærkbart sænke systemet.


Indeksering af felter på små tabeller

På tabeller med et par hundrede rækker beslutter PostgreSQL's forespørgselsplanlægger ofte, at en sekventiel scanning er hurtigere end at bruge et indeks. Indekser begynder at give reel fordel, når tabeller vokser til tusinder af poster og derover. Indeksering af små opslagstabeller eller sjældent befolkede brugerdefinerede modeller tilføjer kompleksitet uden nogen praktisk fordel.


At glemme at opgradere modulet efter at have tilføjet index=True

At tilføje index=True til en feltdefinition i Python opretter ikke automatisk indekset i databasen. Du skal opgradere modulet ved hjælp af -u module_name eller gennem Odoo-backend. At glemme dette trin er en hyppig kilde til forvirring under udviklingen og kan føre til ydeevneproblemer i staging- eller produktionsmiljøer, hvor opgraderingen blev sprunget over.


At forvente, at indekser fremskynder ILIKE-søgninger på Char-felter

Et almindeligt B-træindeks med index=True hjælper ikke med ILIKE '%keyword%' forespørgsler, hvor wildcardet er i starten af mønsteret. PostgreSQL kan ikke bruge et B-træindeks til at evaluere et førende wildcard. Hvis du har brug for hurtig delvis tekstsøgning, skal du bruge index='trigram' på Odoo 16+ eller udforske muligheder for fuldtekst søgning.


At ikke overveje beregnede gemte felter

Gemte beregnede felter (de med store=True) har en databasekolonne og kan indekseres. Udviklere overser nogle gange dette og går glip af en mulighed for at forbedre ydeevnen på felter, der aggregerer eller udleder værdier, der bruges meget i filtre. Hvis et gemt beregnet felt vises i domænefiltre på tværs af rapporter eller visninger, er det værd at overveje at indeksere det.

Konklusion


At index=True attributten er en lille detalje i Odoo-feltdefinitionen, men den har en reel indvirkning på databaseydelsen, efterhånden som dine data vokser. Bruges korrekt, holder det søgninger hurtige, listevisninger responsive og rapporter hurtige at generere. Bruges det uforsigtigt, tilføjer det overhead uden nogen fordel.


Den vigtigste pointe er simpel: indeksér felter, der regelmæssigt bruges i domænefiltre, især Many2one-felter på højvolumenmodeller. Følg de mønstre, der er sat af Odoos egne standardmoduler. Undgå overindeksering af små tabeller eller felter, der aldrig filtreres på. Og hvis du er på Odoo 16 eller senere, skal du overveje index='trigram' for tekstsøgningsfelter, hvor brugere indtaster delvise strenge.


At få indekseringsstrategien rigtig fra starten af et tilpasset udviklingsprojekt er meget lettere end at diagnosticere langsomme forespørgsler i produktion senere.

Arbejder du på en Odoo-implementering?


Hos Dasolo hjælper vi virksomheder med at implementere, tilpasse og optimere Odoo. Uanset om du bygger tilpassede moduler, forbedrer ydeevnen af en eksisterende instans, eller planlægger et nyt Odoo-projekt fra bunden, bringer vi praktisk teknisk ekspertise til hver engagement.


Hvis du har med langsomme forespørgsler, komplekse tilpasninger at gøre, eller har brug for vejledning om bedste praksis for Odoo-udvikling, er vi glade for at hjælpe. Kontakt Dasolo-teamet og lad os vide, hvad du arbejder på.

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