Johdanto
Jos olet viettänyt aikaa Odoo-kenttämääritysten kirjoittamisessa tai tarkistamisessa, olet todennäköisesti törmännyt johonkin sellaiseen kuin index=True kentässä. Se näyttää pieneltä, melkein kuin jälkiajatukselta. Mutta tuo yksittäinen attribuutti voi tehdä merkittävän eron siinä, kuinka nopeasti Odoo-instanssisi reagoi, kun käyttäjät etsivät, suodattavat tai navigoivat suurissa tietoaineistoissa.
Tämä opas käy läpi, mitä indeksoitu kenttä oikeastaan on Odoo-tietomallin kontekstissa, kuinka se vaikuttaa tietokantaasi ja milloin sen käyttö on järkevää omassa Odoo-kehitystyössäsi. Olitpa sitten rakentamassa mukautettua moduulia tai tarkistamassa olemassa olevaa implementaatiota, tämän käsitteen ymmärtäminen auttaa sinua tekemään parempia päätöksiä.
Mikä on indeksoitu kenttä Odoossa
Odoo ORM:ssa kenttä määritellään indeksoiduksi, kun sen määritelmä sisältää index=True. Tämä kertoo Odoolle, että sen tulee pyytää PostgreSQL:ltä luomaan B-puuindeksi vastaavalle tietokantapalvelimelle, kun moduuli asennetaan tai päivitetään.
Tässä on yksinkertainen esimerkki Odoo-kenttä määritelmästä Pythonissa:
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)
Käyttäjäliittymän näkökulmasta indeksoiduista kentistä ei ole mitään näkyvää. Käyttäjä, joka täyttää lomaketta tai selaa luetteloa, ei voi tietää, onko kenttä indeksoitu vai ei. Indeksointi on täysin tietokantatasoinen huolenaihe.
Mitä se vaikuttaa, on nopeus. Kun kenttä on indeksoitu, PostgreSQL voi etsiä vastaavat tietueet paljon nopeammin, erityisesti tauluissa, joissa on tuhansia tai miljoonia rivejä. Ilman indeksiä tietokannan on skannattava jokainen rivi taulusta löytääkseen ne, jotka vastaavat hakukriteereitäsi. Indeksin avulla se navigoi lajitellussa rakenteessa ja löytää tulokset suoraan.
Mitkä Odoo-kenttätyypit tukevat index=True
Useimmat skalaari kenttätyypit Odoo ORM:ssä tukevat index -attribuuttia:
- Char ja Text kentät
- Integer ja Float kentät
- Date ja Datetime kentät
- Selection kentät
- Many2one kentät (erittäin yleisesti indeksoitu)
- Boolean kentät
Suhteelliset kentät, kuten One2many ja Many2many, eivät omaa suoraa saraketta, jota indeksoidaan samalla tavalla, joten index -attribuutti ei ole niille relevantti. Laskennallisia kenttiä, joita ei ole tallennettu, ei myöskään voida indeksoida, koska niillä ei ole tietokannan saraketta.
Kuinka kenttä toimii
Kun Odoo alustaa tai päivittää moduulia, se lukee kaikki kenttämääritykset ja synkronoi tietokannan skeeman. Kaikille kentille, joilla on index=True, Odoo suorittaa SQL-lauseen luodakseen indeksin kyseiselle sarakkeelle PostgreSQL:ssä.
Oletuksena PostgreSQL luo B-puuindeksin, joka on standardiindeksityyppi ja toimii hyvin yhtäläisyysvertailuissa (=), aluekyselyissä (>, <, BETWEEN) ja lajittelussa. Tämä kattaa suurimman osan siitä, mitä Odoo tekee suodattaessaan tietueita luettelonäkymissä tai laskettaessa aluepohjaisia hakuja.
Kuinka se vuorovaikuttaa Odoo ORM:n kanssa
Odoo ORM kääntää Pythonin aluefilttereitä SQL-kyselyiksi. Kun kirjoitat alueen kuten [('state', '=', 'sale')], ORM tuottaa jotain kuten WHERE state = 'sale'. Jos state -kentällä on indeksi, PostgreSQL käyttää sitä ratkaistakseen tuon ehdon tehokkaasti ilman, että koko taulua skannataan.
Many2one-kentät ovat erittäin yleinen käyttötapa. Odoon tietomallissa kenttä kuten partner_id myyntitilauksessa tallentaa liittyvän kumppanin kokonaislukuid. Kun avaat asiakasta suodatetun tilausten luettelon, Odoo suorittaa kyselyn, jossa on WHERE partner_id = X -ehto. Indeksin avulla partner_id:ssä tuo haku on nopea, vaikka tietokannassa olisi satojatuhansia tilauksia.
Indeksit ja kirjoitus suorituskyky
Indeksit eivät ole ilmaisia. Joka kerta, kun tietue luodaan, päivitetään tai poistetaan, PostgreSQL:n on päivitettävä kaikki kyseisen taulun indeksit. Tauluissa, joissa on paljon indeksejä, kirjoitusoperaatiot kestävät hieman kauemmin. Useimmissa Odoo-käyttötapauksissa tämä kauppa on sen arvoista, mutta on syytä ymmärtää, että kaiken indeksoiminen ei aina ole oikea vastaus.
Indeksi='trigram' -vaihtoehto
Odoo 16:sta ja myöhemmistä versioista eteenpäin index -attribuutti hyväksyy ei vain True, vaan myös merkkijonon arvon 'trigram'. Tämä luo GIN trigram -indeksin käyttäen pg_trgm PostgreSQL-laajennusta, joka tukee nopeaa kaavion vastaavuutta ILIKE -kyselyillä. Tämä on erityisen hyödyllistä tekstihauissa kentillä, kuten tuotenimillä tai kumppanin nimillä, joissa käyttäjät usein kirjoittavat osittaisia merkkijonoja hakupalkkiin.
name = fields.Char(string='Product Name', index='trigram')
Tämä on edistyneempi vaihtoehto, jota käytetään Odoon omissa standardimoduuleissa kentille, joita haetaan usein osittaisella tekstillä.
Liiketoimintakäyttötapaukset
Indeksoidut kentät näkyvät monissa oikeissa Odoo-työnkuluissa. Tässä on viisi käytännön esimerkkiä, joissa kentän indeksointi tekee huomattavan eron.
1. CRM: Liidien suodattaminen myyjän mukaan
CRM:ssä myyntipäälliköt suodattavat säännöllisesti putkea myyjän mukaan. Kenttä user_id crm.lead:ssä on Odoossa oletuksena indeksoitu, mikä tekee myyjän mukaan suodattamisesta nopeaa, vaikka liidejä olisi tuhansia. Jos lisäät mukautetun Many2one-kentän, joka osoittaa käyttäjään tai tiimiin, sen indeksointi seuraa samaa logiikkaa.
2. Myynti: Tilauksien hakeminen tilan mukaan
Kenttä state sale.order:ssä on indeksoitu. Tämä tekee vahvistettujen tilausten luettelon lataamisesta tai toimitusta odottavien tilausten suodattamisesta nopeaa yrityksille, jotka käsittelevät suuria määriä. Valintakentät, joita käytetään usein suodatuskriteereinä, ovat hyviä ehdokkaita indeksoitavaksi.
3. Varasto: Liikkeiden seuraaminen tuotteen mukaan
Odoossa varastosiirrot voivat kasvaa erittäin suuriksi, erityisesti jakelu- tai valmistusliiketoiminnassa. Kenttä product_id stock.move:ssä on indeksoitu, mikä tekee tehokkaaksi kysyä kaikki siirrot tietylle tuotteelle. Ilman tätä indeksiä tuotteen jäljitettävyysraportit olisivat tuskallisen hitaita kiireisissä varastoissa.
4. Kirjanpito: Kirjanpitotietojen suodattaminen kumppanin mukaan
Kirjanpitäjät avaavat usein kirjanpidon tiettyä asiakasta tai toimittajaa varten. Kenttä partner_id account.move.line:ssä on indeksoitu, jotta nämä hakuja olisivat tehokkaita. Yrityksissä, joilla on vuosien kirjanpitohistoria, tämä indeksi estää vanhojen saatavien raportin aikakatkaisemasta.
5. Mukautetut moduulit: Viittauskentät jäljitettävyyttä varten
Kun rakennetaan mukautettuja moduuleja, on yleistä lisätä viittauskenttiä, jotka yhdistävät tietueita eri malleihin, esimerkiksi mukautettu projektikoodi tai ulkoinen asiakirjanumero. Jos käyttäjät etsivät tai suodattavat tuon viittauskentän mukaan säännöllisesti, index=True lisääminen on suoraviivainen tapa pitää nämä haut nopeina datan kasvaessa.
Indeksoidun kentän luominen tai mukauttaminen
Pythonissa (Mukautetun moduulin kehitys)
Lisäämällä index=True kenttä määrittelyyn Python-moduulissa on suoraviivaista. Sinun tarvitsee vain sisällyttää se avainsanaparina kenttää julkistaessasi:
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'
)
Kun olet lisännyt tämän kentän moduuliisi, suorita odoo-bin -u your_module_name tai päivitä moduuli Apps-valikon kautta. Odoo havaitsee uuden kentän ja luo vastaavan indeksin tietokantaan.
Voit myös lisätä indeksin olemassa olevaan kenttään perimällä sen ja ylittämällä määritelmän, vaikka tämä lähestymistapa vaatii huolellisuutta, jotta alkuperäisen kenttäkäyttäytymisen ei tapahtuisi ei-toivottuja sivuvaikutuksia.
Odoo Studiossa
Odoo Studio antaa ei-teknisille käyttäjille mahdollisuuden luoda kenttiä käyttöliittymän kautta. Kuitenkin Studio ei tällä hetkellä tarjoa vaihtoehtoa indeksoinnin kytkemiseksi päälle tai pois kenttiä luodessa. Studion kautta luodut kentät tallennetaan tietokantaan manuaalisina kenttinä, eikä niillä ole index=True asetettuna oletuksena.
Jos tarvitset Studio-käytössä luodun kentän indeksoitavaksi suorituskykysyistä, puhtain tapa on muuntaa Studion mukautus oikeaksi Python-moduuliksi ja lisätä index=True koodiin. Tämä kuuluu tekniseen mukauttamiseen ja sen käsittelee tyypillisesti Odoo-kehittäjä eikä Studio-käyttäjä.
Indeksin lisääminen suoraan PostgreSQL:ssä
Joissakin tilanteissa, kuten olemassa olevan tuotantotietokannan optimoinnissa ilman moduulin päivitystä, tietokannan ylläpitäjä voi lisätä indeksin suoraan SQL:llä:
CREATE INDEX CONCURRENTLY idx_sale_order_partner_id
ON sale_order (partner_id);
Käyttämällä CONCURRENTLY vältetään taulun lukitseminen indeksin luomisen aikana, mikä on tärkeää tuotantoympäristöissä. Siitä huolimatta tätä lähestymistapaa tulisi koordinoida Odoo-moduulin määritelmän kanssa, jotta Python-koodi ja tietokanta pysyvät synkronoituna. Jos moduulia myöhemmin päivitetään, Odoo saattaa tai ei ehkä hallitse indeksiä riippuen siitä, mitä kenttä määritelmässä on.
Parhaat käytännöt
Indeksoi kentät, jotka näkyvät hakudomaaneissa
Jos kenttää käytetään säännöllisesti aluefilttereissä, joko luettelonäkymän suodattimissa, automatisoiduissa toiminnoissa, aikataulutetuissa töissä tai lasketuissa kenttäriippuvuuksissa, se on hyvä ehdokas indeksoitavaksi. Yleisimmät esimerkit ovat Many2one-suhdekentät, tilakentät ja viite- tai koodikentät.
Noudata Odoon omia käytäntöjä
Paras viite siihen, milloin käyttää index=True, on Odoon oma lähdekoodi. Tarkista standardikenttämääritykset sale.order, account.move tai stock.move nähdäksesi, mitkä kentät Odoon omat kehittäjät valitsivat indeksoitavaksi. Nämä valinnat perustuvat todellisiin käyttökuvioihin ja suorituskykytietoihin tuhansista tuotantotietokannoista.
Indeksoi aina Many2one-kentät suurivolyymisissa malleissa
Malleissa, jotka keräävät suuren määrän tietueita ajan myötä (kirjanpitotapahtumat, varastosiirrot, myyntitilauslinjat), indeksoi aina suodattamiseen käytettävät Many2one-kentät. Lisäindeksin kustannus kirjoituspainotteisessa taulussa on lähes aina sen arvoinen, että lukusuorituskyky paranee.
Harkitse trigrammi-indeksointia tekstihakukentille
Odoossa 16 ja myöhemmin, jos käyttäjät etsivät usein tietueita kirjoittamalla osittaisia merkkijonoja Char-kenttään, kuten tuotteen nimi, kumppanin nimi tai asiakirjan viite, harkitse index='trigram' -käyttämistä oletus B-puuindeksin sijaan. Trigrammi-indeksit on erityisesti suunniteltu ILIKE-mallin vastaavuuteen.
Varmista, että indeksit todella käytetään
Indeksin lisäämisen jälkeen voit varmistaa, että PostgreSQL käyttää sitä suorittamalla EXPLAIN ANALYZE kyselylle. Jos kyselysuunnittelija valitsee edelleen sekvenssiskannauksen, taulu saattaa olla liian pieni, jotta indeksistä olisi hyötyä, tai kyselyehdot eivät ehkä ole yhteensopivia indeksityypin kanssa.
Dokumentoi indeksointipäätöksesi
Kun rakennat mukautettuja moduuleja, jätä lyhyt kommentti, joka selittää, miksi kenttä on indeksoitu. Tämä auttaa tulevia kehittäjiä ja konsultteja ymmärtämään tarkoituksen ja välttämään indeksin poistamista vahingossa refaktoroinnin aikana.
Yleiset sudenkuopat
Indeksoi jokainen kenttä oletusarvoisesti
Yksi yleinen virhe indeksointia opetellessa on lisätä index=True jokaiseen kenttään vain varmuuden vuoksi. Tämä on haitallista. Jokainen indeksi vie tallennustilaa ja lisää ylikuormitusta jokaiseen kirjoitusoperaatioon. Tauluissa, jotka saavat suuren määrän lisäyksiä tai päivityksiä, tarpeettomat indeksit voivat huomattavasti hidastaa järjestelmää.
Indeksointi pienillä tauluilla
Tauluissa, joissa on muutama sata riviä, PostgreSQL:n kyselysuunnittelija päättää usein, että sekventiaalinen skannaus on nopeampi kuin indeksin käyttäminen. Indeksit alkavat tuottaa todellista hyötyä, kun taulut kasvavat tuhansiin tietueisiin ja yli. Pienten hakutaulujen tai harvoin täytettyjen mukautettujen mallien indeksointi lisää monimutkaisuutta ilman käytännön hyötyä.
Unohtaminen päivittää moduuli lisäämisen jälkeen index=True
Pelkkä index=True lisääminen kenttä määrittelyyn Pythonissa ei automaattisesti luo indeksiä tietokantaan. Sinun on päivitettävä moduuli käyttämällä -u module_name tai Odoo-taustajärjestelmän kautta. Tämän vaiheen unohtaminen on yleinen sekaannuksen lähde kehityksen aikana ja voi johtaa suorituskykyongelmiin staging- tai tuotantoympäristöissä, joissa päivitys on ohitettu.
Odotetaan, että indeksit nopeuttavat ILIKE-hakuja Char-kentillä
Tavallinen B-puuindeksi, jossa on index=True, ei auta ILIKE '%keyword%' kyselyissä, joissa wildcard on mallin alussa. PostgreSQL ei voi käyttää B-puuindeksiä arvioidakseen johtavaa wildcardia. Jos tarvitset nopeaa osittaista tekstihakua, käytä index='trigram' Odoo 16+:ssa tai tutki täysimittaisia hakuvaihtoehtoja.
Laskettujen tallennettujen kenttien huomioimatta jättäminen
Tallennetut laskettavat kentät (ne, joissa on store=True) omaavat tietokannan sarakkeen ja niitä voidaan indeksoida. Kehittäjät joskus ohittavat tämän ja menettävät mahdollisuuden parantaa suorituskykyä kentillä, jotka aggregoivat tai johdattavat arvoja, joita käytetään runsaasti suodattimissa. Jos tallennettu laskettava kenttä esiintyy alueen suodattimissa raporttien tai näkymien kautta, sen indeksoiminen on syytä harkita.
Yhteenveto
Attribuutti index=True on pieni yksityiskohta Odoo-kenttä määrittelyssä, mutta sillä on todellinen vaikutus tietokannan suorituskykyyn, kun tietosi kasvavat. Oikein käytettynä se pitää haut nopeina, luettelo-näkymät reagoivina ja raportit nopeasti tuotettavina. Huolimattomasti käytettynä se lisää ylikuormitusta ilman mitään hyötyä.
Keskeinen opetus on yksinkertainen: indeksoi kentät, joita käytetään säännöllisesti alueen suodattimissa, erityisesti Many2one-kentät suurten mallien kohdalla. Noudata Odoon omien standardimoduulien asettamia malleja. Vältä yli-indeksoimista pienillä tauluilla tai kentillä, joita ei koskaan suodateta. Ja jos olet Odoo 16 tai uudemmassa, harkitse index='trigram' tekstihakukentille, joissa käyttäjät kirjoittavat osittaisia merkkijonoja.
Indeksointistrategian saaminen oikeaksi alusta alkaen mukautetussa kehitysprojektissa on paljon helpompaa kuin hitaiden kyselyjen diagnosoiminen tuotannossa myöhemmin.
Työskenteletkö Odoo-implementoinnin parissa?
Dasololla autamme yrityksiä toteuttamaan, mukauttamaan ja optimoimaan Odoo'ta. Olitpa sitten rakentamassa mukautettuja moduuleja, parantamassa olemassa olevan instanssin suorituskykyä tai suunnittelemassa uutta Odoo-projektia alusta alkaen, tuomme käytännön teknistä asiantuntemusta jokaiseen sitoumukseen.
Jos kohtaat hitaita kyselyitä, monimutkaisia mukautuksia tai tarvitset ohjeita Odoo-kehityksen parhaista käytännöistä, autamme mielellämme. Ota yhteyttä Dasolon tiimiin ja kerro meille, mihin olet työskentelemässä.