Felsöka långsamma frågor
- Ämnen:
- Developing
Skapat för:
- Developer
Långsam frågeklassificering
Det finns tre huvudklassificeringar av långsamma frågor i AEM, ordnade efter allvarlighetsgrad:
-
Indexlösa frågor
- Frågor som gör det not omvandla till ett index och gå igenom JCR-innehållet för att samla in resultat
-
Dåligt begränsade (eller begränsade) frågor
- Frågor som leder till ett index, men som måste gå igenom alla indexposter för att samla in resultat
-
Stora resultatuppsättningsfrågor
- Frågor som returnerar mycket många resultat
De första två klassificeringarna av frågor (indexlösa och dåligt begränsade) är långsamma eftersom de tvingar Oak-frågemotorn att granska varje potentiell resultat (innehållsnod eller indexpost) för att identifiera vilken som tillhör faktisk resultatuppsättning.
Att inspektera varje möjligt resultat kallas att gå igenom.
Eftersom varje potentiellt resultat måste kontrolleras, växer kostnaden för att fastställa det faktiska resultatet linjärt med antalet potentiella resultat.
Genom att lägga till frågebegränsningar och justera index kan indexdata lagras i ett optimerat format som ger snabb resultathämtning och minskar eller eliminerar behovet av linjär kontroll av potentiella resultatuppsättningar.
I AEM 6.3 misslyckas frågan som standard när en genomgång på 100 000 nås och ett undantag genereras. Den här gränsen finns inte som standard i AEM versioner före AEM 6.3, men den kan anges med hjälp av APache Jackrabbit Query Engine Settings OSGi-konfigurationen och QueryEngineSettings JMX-böna (egenskapen LimitReads).
Identifiera indexlösa frågor
Under utveckling
Förklara alla frågor och kontrollera att deras frågeplaner inte innehåller /* bläddra förklaringar i dem. Exempel på genomgång av frågeplan:
- PLAN:
[nt:unstructured] as [a] /* traverse "/content//*" where ([a].[unindexedProperty] = 'some value') and (isdescendantnode([a], [/content])) */
Efter distribution
-
Övervaka
error.log
för indexlösa genomgångsfrågor:*INFO* org.apache.jackrabbit.oak.query.QueryImpl Traversal query (query without index) ... ; consider creating and index
- Det här meddelandet loggas bara om det inte finns något index tillgängligt och om frågan eventuellt går igenom många noder. Meddelanden loggas inte om ett index är tillgängligt, men mängden att gå igenom är liten och därmed snabb.
-
Besök AEM Frågeprestanda driftskonsol och Förklara långsamma frågor som letar efter stegvis genomgång eller inga indexfrågeförklaringar.
Identifierar dåligt begränsade frågor
Under utveckling
Förklara alla frågor och kontrollera att de matchar ett index som justerats för att matcha frågans egenskapsbegränsningar.
- Idealisk frågeplantäckning har
indexRules
för alla egenskapsbegränsningar och minst för de tätaste egenskapsbegränsningarna i frågan. - Frågor som sorterar resultat bör matchas till ett Lucene-egenskapsindex med indexregler för de sorterade efter egenskaper som anges
orderable=true.
Som standard cqPageLucene
har ingen indexregel för jcr:content/cq:tags
Innan indexregeln cq:tags läggs till
-
cq:taggindexregel
- Finns inte i lådan
-
Fråga i Frågebyggaren
type=cq:Page property=jcr:content/cq:tags property.value=my:tag
-
Frågeplan
[cq:Page] as [a] /* lucene:cqPageLucene(https://experienceleague.adobe.com/oak:index/cqPageLucene?lang=sv) *:* where [a].[jcr:content/cq:tags] = 'my:tag' */
Den här frågan löses till cqPageLucene
index, men eftersom det inte finns någon egenskapsindexregel för jcr:content
eller cq:tags
, när den här begränsningen utvärderas, alla poster i cqPageLucene
index kontrolleras för att fastställa en matchning. Det innebär att om indexet innehåller 1 miljon cq:Page
noder kontrolleras sedan 1 miljon poster för att fastställa resultatet.
När indexregeln cq:tags lagts till
-
cq:taggindexregel
/oak:index/cqPageLucene/indexRules/cq:Page/properties/cqTags @name=jcr:content/cq:tags @propertyIndex=true
-
Fråga i Frågebyggaren
type=cq:Page property=jcr:content/cq:tags property.value=myTagNamespace:myTag
-
Frågeplan
[cq:Page] as [a] /* lucene:cqPageLucene(https://experienceleague.adobe.com/oak:index/cqPageLucene?lang=sv) jcr:content/cq:tags:my:tag where [a].[jcr:content/cq:tags] = 'my:tag' */
Tillägget av indexRule för jcr:content/cq:tags
i cqPageLucene
index tillåter cq:tags
data som ska lagras på ett optimerat sätt.
När en fråga med jcr:content/cq:tags
begränsning utförs, indexet kan söka efter resultat efter värde. Det betyder att om 100 cq:Page
noder har myTagNamespace:myTag
som värde returneras endast de 100 resultaten och de andra 999 000 utesluts från begränsningskontrollerna, vilket förbättrar prestandan med en faktor på 10 000.
Ytterligare frågebegränsningar minskar förstås antalet giltiga resultatuppsättningar och optimerar frågeoptimeringen ytterligare.
Utan en extra indexregel för cq:tags
-egenskap, även fulltextfråga med en begränsning för cq:tags
skulle fungera dåligt eftersom resultatet från indexet skulle returnera alla fulltextmatchningar. Begränsningen för cq:tags filtreras efter den.
En annan orsak till postindexfiltrering är Access Control Lists, som ofta missas under utvecklingen. Försök att se till att frågan inte returnerar sökvägar som kanske inte är tillgängliga för användaren. Detta kan oftast göras genom bättre innehållsstruktur tillsammans med relevant sökvägsbegränsning för frågan.
Ett praktiskt sätt att identifiera om Lucene-indexet returnerar många resultat för att returnera en mycket liten delmängd som frågeresultat är att aktivera DEBUG-loggar för org.apache.jackrabbit.oak.plugins.index.lucene.LucenePropertyIndex
och se hur många dokument som läses in från indexet. Antalet slutliga resultat jämfört med antalet inlästa dokument bör inte vara oproportionerligt. Mer information finns i Loggning.
Efter distribution
-
Övervaka
error.log
för genomgångsfrågor:*WARN* org.apache.jackrabbit.oak.spi.query.Cursors$TraversingCursor Traversed ### nodes ... consider creating an index or changing the query
-
Besök AEM Frågeprestanda driftskonsol och Förklara långsamma frågor som söker efter frågeplaner som inte löser frågeegenskapsbegränsningar till indexegenskapsregler.
Identifiera stora resultatuppsättningsfrågor
Under utveckling
Ange låga tröskelvärden för oak.queryLimitInMemory (t.ex. 10000) och oak.queryLimitReads (t.ex. 5000) och optimera den dyra frågan när du klickar på ett UnsupportedOperationException som säger"Frågan läser fler än x noder…".
Detta hjälper till att undvika resurskrävande frågor (t.ex. som inte backas upp av något index eller backas upp av mindre täckande index). En fråga som till exempel läser 1M-noder skulle leda till mycket IO och negativt påverka programmets prestanda. Alla frågor som inte godkänns på grund av ovanstående gränser bör därför analyseras och optimeras.
Efter distribution
-
Övervaka loggarna för frågor som utlöser genomgång av stora noder eller stor minnesförbrukning i stackar:
*WARN* ... java.lang.UnsupportedOperationException: The query read or traversed more than 100000 nodes. To avoid affecting other tasks, processing was stopped.
- Optimera frågan för att minska antalet genomgående noder
-
Övervaka loggarna för frågor som utlöser stor minnesförbrukning i stackar:
*WARN* ... java.lang.UnsupportedOperationException: The query read more than 500000 nodes in memory. To avoid running out of memory, processing was stopped
- Optimera frågan för att minska heap-minnesanvändningen
I AEM 6.0-6.2 kan du justera tröskelvärdet för nodgenomgång via JVM-parametrar i AEM startskript för att förhindra att stora frågor överbelastar miljön. Rekommenderade värden är:
-Doak.queryLimitInMemory=500000
-Doak.queryLimitReads=100000
I AEM 6.3 är ovanstående två parametrar förkonfigurerade som standard och kan ändras via OSGi QueryEngineSettings.
Mer information finns under: https://jackrabbit.apache.org/oak/docs/query/query-engine.html#Slow_Queries_and_Read_Limits
Justering av frågeprestanda
Motto för optimering av frågeprestanda i AEM är:
"Ju fler begränsningar, desto bättre."
Följande utkast rekommenderar justeringar för att säkerställa frågeprestanda. Finjustera först frågan, en mindre diskret aktivitet och finjustera sedan indexdefinitionerna om det behövs.
Justera frågeuttryck
AEM stöder följande frågespråk:
- Query Builder
- JCR-SQL2
- XPath
I följande exempel används Query Builder som det vanligaste frågespråket som används av AEM utvecklare, men samma principer gäller för JCR-SQL2 och XPath.
-
Lägg till en nodetypbegränsning så att frågan löses till ett befintligt Lucene-egenskapsindex.
-
Ooptimerad fråga
property=jcr:content/contentType property.value=article-page
-
Optimerad fråga
type=cq:Page property=jcr:content/contentType property.value=article-page
Frågor som saknar begränsningskraft för nodetype AEM att anta
nt:base
nodetype, som alla noder i AEM är en undertyp till, vilket i sin tur resulterar i ingen nodtypsbegränsning.Inställning
type=cq:Page
begränsar frågan till endastcq:Page
noder och löser frågan till AEM cqPageLucene, vilket begränsar resultatet till en delmängd av noder (endastcq:Page
noder) i AEM. -
-
Justera frågans nodetypbegränsning så att frågan matchar ett befintligt Lucene-egenskapsindex.
-
Ooptimerad fråga
type=nt:hierarchyNode property=jcr:content/contentType property.value=article-page
-
Optimerad fråga
type=cq:Page property=jcr:content/contentType property.value=article-page
nt:hierarchyNode
är den överordnade nodtypen förcq:Page
och förutsätterjcr:content/contentType=article-page
används endast förcq:Page
noder via vårt anpassade program returnerar den här frågan endastcq:Page
noder därjcr:content/contentType=article-page
. Detta är dock en suboptimal begränsning eftersom:- Annan nod ärver från
nt:hierarchyNode
(t.ex.dam:Asset
) som lägger till i onödan till de potentiella resultaten. - Det finns inget AEM-angivet index för
nt:hierarchyNode
, men som det finns ett angivet index förcq:Page
.
Inställning
type=cq:Page
begränsar frågan till endastcq:Page
noder och löser frågan till AEM cqPageLucene, vilket begränsar resultatet till en delmängd av noder (endast cq:Page-noder) i AEM. -
-
Du kan också justera egenskapsbegränsningar så att frågan matchar ett befintligt egenskapsindex.
-
Ooptimerad fråga
property=jcr:content/contentType property.value=article-page
-
Optimerad fråga
property=jcr:content/sling:resourceType property.value=my-site/components/structure/article-page
Ändra egenskapsbegränsningen från
jcr:content/contentType
(ett anpassat värde) till den välkända egenskapensling:resourceType
låter frågan matcha egenskapsindexetslingResourceType
som indexerar allt innehåll medsling:resourceType
.Egenskapsindex (till skillnad från Lucene-egenskapsindex) används bäst när frågan inte identifieras av nodetype, och en enskild egenskapsbegränsning dominerar resultatuppsättningen.
-
-
Lägg till den striktaste möjliga sökvägsbegränsningen för frågan. Använd
/content/my-site/us/en
över/content/my-site
, eller/content/dam
över/
.-
Ooptimerad fråga
type=cq:Page path=/content property=jcr:content/contentType property.value=article-page
-
Optimerad fråga
type=cq:Page path=/content/my-site/us/en property=jcr:content/contentType property.value=article-page
Omfång för sökvägsbegränsningen från
path=/content
tillpath=/content/my-site/us/en
gör att indexen kan minska antalet indexposter som behöver inspekteras. När frågan kan begränsa sökvägen mycket bra, bortom bara/content
eller/content/dam
, kontrollera att indexet harevaluatePathRestrictions=true
.Anteckning med
evaluatePathRestrictions
ökar indexstorleken. -
-
Undvik om möjligt frågefunktioner och -åtgärder som:
LIKE
ochfn:XXXX
när kostnaderna skalas upp med antalet begränsningsbaserade resultat.-
Ooptimerad fråga
type=cq:Page property=jcr:content/contentType property.operation=like property.value=%article%
-
Optimerad fråga
type=cq:Page fulltext=article fulltext.relPath=jcr:content/contentType
Villkoret LIKE tar lång tid att utvärdera eftersom inget index kan användas om texten börjar med ett jokertecken ("%…"). jcr:contains-villkoret tillåter att ett fulltextindex används och är därför att föredra. Detta kräver att det matchade Lucene-egenskapsindexet har indexRule för
jcr:content/contentType
medanalayzed=true
.Använda frågefunktioner som
fn:lowercase(..)
kan vara svårare att optimera eftersom det inte finns snabbare motsvarigheter (utanför mer komplexa och diskreta indexanalysatorkonfigurationer). Det är bäst att identifiera andra omfångsbegränsningar för att förbättra den övergripande frågeprestandan, vilket kräver att funktionerna arbetar på den minsta möjliga uppsättningen möjliga resultat. -
-
Justeringen är Query Builder-specifik och gäller inte JCR-SQL2 eller XPath.
Använd Query Builder' gissningssumma när hela uppsättningen resultat inte behövs omedelbart.
-
Ooptimerad fråga
type=cq:Page path=/content
-
Optimerad fråga
type=cq:Page path=/content p.guessTotal=100
Om frågekörningen är snabb men antalet resultat är stort, s.
guessTotal
är en viktig optimering för frågor i Query Builder.p.guessTotal=100
anger för Query Builder att endast samla in de första 100 resultaten och anger en boolesk flagga som anger om det finns minst ett resultat till (men inte hur många fler, eftersom det skulle bli långsamt om talet räknades). Den här optimeringen är utmärkt för sidnumrering eller oändlig inläsning, där bara en delmängd av resultaten visas stegvis. -
Justering av befintligt index
-
Om den optimala frågan löses till ett egenskapsindex finns det inget kvar att göra eftersom egenskapsindex är minimalt justeringsbara.
-
Annars bör frågan matchas mot ett Lucene-egenskapsindex. Om inget index kan tolkas går du till Skapa ett nytt index.
-
Konvertera frågan till XPath eller JCR-SQL2 efter behov.
-
Fråga i Frågebyggaren
query type=cq:Page path=/content/my-site/us/en property=jcr:content/contentType property.value=article-page orderby=@jcr:content/publishDate orderby.sort=desc
-
XPath genererad från frågan i Query Builder
/jcr:root/content/my-site/us/en//element(*, cq:Page)[jcr:content/@contentType = 'article-page'] order by jcr:content/@publishDate descending
-
-
Ange XPath (eller JCR-SQL2) till Definitionsgenerator för Oak Index för att generera den optimerade definitionen av Lucene-egenskapsindex.
Skapad definition av Lucene-egenskapsindex
- evaluatePathRestrictions = true - compatVersion = 2 - type = "lucene" - async = "async" - jcr:primaryType = oak:QueryIndexDefinition + indexRules + cq:Page + properties + contentType - name = "jcr:content/contentType" - propertyIndex = true + publishDate - ordered = true - name = "jcr:content/publishDate"
-
Sammanfoga manuellt den genererade definitionen i det befintliga Lucene-egenskapsindexet på ett additivt sätt. Var försiktig så att du inte tar bort befintliga konfigurationer eftersom de kan användas för att tillgodose andra frågor.
- Leta reda på det befintliga Lucene-egenskapsindex som omfattar cq:Page (med hjälp av Indexhanteraren). I detta fall
/oak:index/cqPageLucene
. - Identifiera konfigurationsförändringen mellan den optimerade indexdefinitionen (steg 4) och det befintliga indexet (https://experienceleague.adobe.com/oak:index/cqPageLucene?lang=sv) och lägg till de saknade konfigurationerna från det optimerade indexet till den befintliga indexdefinitionen.
- Enligt AEM bästa praxis för omindexering är det antingen en uppdatering eller omindexering i ordning, baserat på om befintligt innehåll kommer att påverkas av den här indexkonfigurationsändringen.
- Leta reda på det befintliga Lucene-egenskapsindex som omfattar cq:Page (med hjälp av Indexhanteraren). I detta fall
Skapa ett nytt index
-
Kontrollera att frågan inte matchar ett befintligt Lucene-egenskapsindex. Om så är fallet, se avsnittet ovan om justering och befintligt index.
-
Konvertera frågan till XPath eller JCR-SQL2 efter behov.
-
Fråga i Frågebyggaren
type=myApp:Author property=firstName property.value=ira
-
XPath genererad från frågan i Query Builder
//element(*, myApp:Page)[@firstName = 'ira']
-
-
Ange XPath (eller JCR-SQL2) till Definitionsgenerator för Oak Index för att generera den optimerade definitionen av Lucene-egenskapsindex.
Skapad definition av Lucene-egenskapsindex
- compatVersion = 2 - type = "lucene" - async = "async" - jcr:primaryType = oak:QueryIndexDefinition + indexRules + myApp:AuthorModel + properties + firstName - name = "firstName" - propertyIndex = true
-
Distribuera den genererade indexdefinitionen för Lucene-egenskap.
Lägg till XML-definitionen från Oak Index Definition Generator för det nya indexet i det AEM projektet som hanterar Oak-indexdefinitioner (kom ihåg att behandla Oak-indexdefinitioner som kod, eftersom koden är beroende av dem).
Distribuera och testa det nya indexet efter den vanliga AEM programutvecklingslivscykeln och kontrollera att frågan löses till indexvärdet och att frågan är utförd.
När det här indexet börjar distribueras kommer AEM att fylla i indexet med nödvändiga data.
När är det okej med indexlösa frågor och genomgående frågor?
På grund av AEM flexibla innehållsarkitekturen är det svårt att förutsäga och se till att genomgången av innehållsstrukturer inte förändras över tid och blir oacceptabla.
Se därför till att ett index uppfyller frågor, förutom om kombinationen av sökvägsbegränsning och nodetype-begränsning garanterar att färre än 20 noder genomgås någonsin.
Frågeutvecklingsverktyg
Adobe stöds
-
Query Builder-felsökning
- Ett WebUI-program som används för att köra Query Builder-frågor och generera den XPath som stöds (för användning i Förklara fråga eller Oak Index Definition Generator).
- Finns på AEM /libs/cq/search/content/querydebug.html
-
CRXDE Lite - Frågeverktyg
- Ett WebUI för att köra XPath- och JCR-SQL2-frågor.
- Finns på AEM /crx/de/index.jsp > Verktyg > Fråga…
-
- En kontrollpanel för AEM som ger en detaljerad förklaring (frågeplan, frågetid och antal resultat) för en given XPATH- eller JCR-SQL2-fråga.
-
- En kontrollpanel för AEM åtgärder som listar de senaste långsamma och populära frågorna som kördes på AEM.
-
- En AEM Operations WebUI som visar indexvärdena för AEM. gör det lättare att förstå vilka index som redan finns, vilka som kan användas eller utökas.
-
-
Loggning i Query Builder
DEBUG @ com.day.cq.search.impl.builder.QueryImpl
-
Loggning av körning av Oak-frågor
DEBUG @ org.apache.jackrabbit.oak.query
-
-
APache Jackrabbit Query Engine Settings OSGi Config
- OSGi-konfiguration som konfigurerar felbeteende för att gå igenom frågor.
- Finns på AEM /system/console/configMgr#org.apache.jackrabbit.oak.query.QueryEngineSettingsService
-
NodeCounter JMX Mbean
- JMX MBean används för att beräkna antalet noder i innehållsträd i AEM.
- Finns på AEM /system/console/jmx/org.apache.jackrabbit.oak%3Namn%3DnodeCounter%2Ctype%3DNodeCounter
Community-stöd
-
Definitionsgenerator för Oak Index
- Generera ett optimalt Lucence-egenskapsindex från XPath- eller JCR-SQL2-frågesatser.
-
- Webbläsartillägget Google Chrome som visar loggdata per begäran, inklusive utförda frågor och tillhörande frågeplaner, i webbläsarens Dev Tools Console.
- Kräver Sling Log Tracer 1.0.2+ som ska installeras och aktiveras på AEM.
Experience Manager
- Utveckla användarhandboken - översikt
- Introduktion för utvecklare
- Komma igång med utveckling i AEM Sites – WKND-självstudiekurs
- AEM kärnbegrepp
- Struktur för det AEM användargränssnittet med pekskärm
- Koncepten i det AEM användargränssnittet med pekskärm
- AEM - riktlinjer och bästa praxis
- Använda bibliotek på klientsidan
- Developing and Page Diff
- Begränsningar för redigerare
- CSRF Protection Framework
- Datamodellering - David Nueschelers modell
- Bidrar till AEM
- Dokumentskydd
- Referensmaterial
- Skapa en webbplats med alla funktioner (Classic UI)
- Designer och Designer (Classic UI)
- Plattform
- Fusklapp för Sling
- Använda Sling-adaptrar
- Taggbibliotek
- Mallar
- Använda Sling Resource Merger i AEM
- Övertäckningar
- Namnkonventioner
- Skapa en ny GRE-fältkomponent
- Query Builder
- Taggar
- Anpassa sidor som visas av felhanteraren
- Anpassade nodtyper
- Lägga till teckensnitt för grafikåtergivning
- Ansluta till SQL-databaser
- Extern URL
- Skapa och använda jobb för avlastning
- Konfigurerar cookie-användning
- Så här programmässigt kommer du åt AEM JCR
- Integrera tjänster med JMX-konsolen
- Developing the Bulk Editor
- Utveckla rapporter
- eCommerce
- Komponenter
- Kärnkomponenter
- Formatsystem
- Komponenter - översikt
- AEM - Grunderna
- Utveckla AEM
- Utveckla AEM - kodexempel
- JSON-exporterare för innehållstjänster
- Aktivera JSON-export för en komponent
- Bildredigeraren
- Dekoration-tagg
- Använda Dölj villkor
- Konfigurera flera redigerare på plats
- Utvecklarläge
- Testa användargränssnittet
- Komponenter för innehållsfragment
- Hämta sidinformation i JSON-format
- Internationalisering
- Klassiska gränssnittskomponenter
- Headless Experience Management
- Headless och Hybrid with AEM
- Aktivera JSON-export för en komponent
- Enkelsidiga program
- SPA introduktion och genomgång
- SPA WKND - självstudiekurs
- Getting Started with SPA in AEM - React
- Komma igång med SPA i AEM - Angular
- Implementera en React Component for SPA
- SPA djupdykning
- SPA
- Utveckla SPA för AEM
- SPA Blueprint
- SPA
- Dynamisk mappning av modell till komponent för SPA
- SPA
- SPA och Adobe Experience Platform Launch Integration
- SPA- och serveråtergivning
- SPA referensmaterial
- HTTP-API
- Innehållsfragment
- Experience Fragments
- Utvecklingsverktyg
- Utvecklingsverktyg
- AEM Modernization Tools
- Dialogruteredigeraren
- Verktyget Dialogkonvertering
- Utveckla med CRXDE Lite
- Hantera paket med Maven
- Utveckla AEM projekt med Eclipse
- Skapa AEM projekt med Apache Maven
- Utveckla AEM projekt med IntelliJ IDEA
- Så här använder du VLT-verktyget
- Så här använder du proxyserververktyget
- AEM Brackets Extension
- AEM Developer Tools for Eclipse
- AEM
- Personanpassning
- Utöka AEM
- Anpassa sidredigering
- Anpassa konsolerna
- Anpassa vyer av Sidegenskaper
- Konfigurera din sida för gruppredigering av sidegenskaper
- Anpassa och utöka Content Fragments
- Utöka arbetsflöden
- Utöka Multi Site Manager
- Spårning och analys
- Cloud Services
- Skapa anpassade tillägg
- Forms
- Integrera tjänster med JMX-konsolen
- Developing the Bulk Editor
- Utöka Classic UI
- Testning
- Bästa praxis
- Mobil webb