Teljesítményhiba, amikor egy dokumentumelemet használ a dátum helyett a virtuális táblázatokban
A határidő és az időperiódus olyan alkalmazásobjektumok, amelyek egy dátum és számos egyéb paraméter kombinációja, amelyek lehetővé teszik a rendszer számára, hogy pontosan határozza meg a regiszter táblákból származó adatok lekérését.
Például gyakori helyzet a több dokumentum jelenléte egy másodpercen belül - ebben az esetben a fejlesztők a dokumentum helyzetét használják a maradványok helyes feldolgozásához a gazdaság feldolgozásában, mert Ha egyszerű dátumot használ, előfordulhat, hogy az adatok helyesek.
A Border és az Time Moment használata azonban csökkenti a teljesítményt azáltal, hogy lelassítja az elemi igényeket is virtuális táblázatokra.
Vegyünk egy konkrét példát.
Vegyük az "áruk és raktárak" felhalmozási nyilvántartását, és kapjuk meg a maradékokat a Nómenklatúra és a raktár szerinti kiválasztással.
(az ideiglenes táblázatokban a nómenklatúra és az értéktartók kicsit)
Van egy további index a Raktár mérésére.
Az "időszak" paraméterhez eltérő értékű lekérdezést hajtunk végre:
Többször is végrehajtjuk ezeket a lekérdezéseket, és a következő eredményeket kapjuk:
A méréseket a MSSQL szerver "Max. Párhuzamossági fokozat" 3 különböző értékére végzik.
Vannak különböző vélemények a MAXDOP paraméterről. Az 1C-becenevek gyakrabban telepítik az egységet. És itt van például a DBA-nézet, amely más típusú alkalmazásokat is alkalmaz. :)
De a kérdés más.
Mind a négy esetben a platform körülbelül ugyanazokat a lekérdezéseket generálja két részből:
A végső egyenleg a két táblázat közötti különbségből származik.
Az eredmények teljesítmény szerinti kiválasztásával minden rendben van - az asztal fürtözött indexe minden olyan dimenzióval, amelyre a lekérdezési feltételek jól alkalmazhatók.
De a mozgás táblázatából származó minta egyértelműen problémát jelent.
Dokumentumpozícióval rendelkező állapot esetén a lekérdezés úgy néz ki, mint:
Egy dátummal rendelkező állapot esetén a lekérdezés úgy néz ki, mint:
Nyilvánvalóan az első esetben a lekérdezés összetettebb az érzékelő által az optimalizáló számára.
Mindkét lekérdezést kiadjuk az SQL Server felügyeleti stúdióban, és megnézzük, hogyan hajtják végre azokat:
I / O statisztikák és végrehajtási idő:
Az első lekérdezés (a dokumentum pozíciójából) 4,5-szer hosszabb volt a másodiknál, és 8-szor több logikai leolvasást igényelt.
A szerkezet azonos, de az alkalmazott paraméterek eltérőek.
Az első Seek Predicate kérelemhez csak egy van megadva (az időtartam kisebb, mint május 1), és a második esetében mindkét időszakra vonatkozó korlátozás van megadva.
A probléma megoldása:
Ha a probléma az Ön által megerősített, akkor kívánatos, hogy a lekérdezések periódusainak a virtuális táblákhoz való kiválasztása során lehetőleg ne használják a Határt és az Idő pillanatát. Ha ilyen kérelem van a dokumentumban, akkor a dokumentum pozíció többi részének kiválasztása nem mindig szükséges, de csak akkor, ha a dokumentum NEM az elsõ egy másodpercben, és a dokumentumok hatással vannak egymásra. A munkafolyamat mennyiségétől függően ez jelentősen csökkentheti a nem kívánt paraméterekkel végrehajtott lekérdezések számát.
Például, amikor dokumentumot ír, figyelje, hogy a nyilvántartásban egy adott másodpercben bejegyzések vannak-e ugyanannak a raktárnak az aktuális dokumentumához képest. Ha nem, akkor válassza ki a maradékokat dátum szerint, ha igen - a dokumentum pozíciója szerint:
Ugyanakkor a kérelem leegyszerűsítésének egy változata van a dokumentum pozíciójával, amely lehetővé teszi a probléma kiküszöbölését. Sajnos csak a platform fejlesztői képesek erre.
Ezt a helyzetet és az optimalizálási lehetőséget ismertetem a partnerkonferencián.
Ki férhet hozzá - köszönetet mondok a "+1" -nek ebben a témában.