Wow! Det är den mest komplicerade "indexsammanslagning" jag har sett.
Vanligtvis (kanske alltid ), kan du skapa ett "sammansatt" index för att ersätta en index-merge-skärning, och prestera bättre . Ändra key2
från bara (pinned)
till (pinned, DeviceId)
. Detta kan bli av med "korsningen" och snabba upp den.
I allmänhet använder Optimizern indexsammanfogning endast i desperation. (Jag tror att detta är svaret på rubrikfrågan.) Alla mindre ändringar av frågan eller de inblandade värdena, och Optimizern kommer att utföra frågan utan indexsammanslagning.
En förbättring av temptabellen __codes
är att bygga en permanent tabell med ett stort intervall av värden, använd sedan ett intervall av värden från den tabellen i din Proc. Om du använder MariaDB, använd sedan den dynamiskt byggda "sekvens"-tabellen. Till exempel "tabellen" seq_1_to_100
är effektivt en tabell med en kolumn med nummer 1..100. Inget behov av att deklarera det eller fylla i det.
Du kan bli av med den andra REPEAT
loop genom beräkning tiden från Code
.
Undviker LOOPs
kommer att vara den största prestationsfördelen.
Få allt det gjort, så kanske jag har andra tips.