Sto riscontrando uno strano problema che si verifica quando si accede a record storici all'interno di una tabella temporale. Le query che accedono alle voci precedenti nella tabella temporale tramite la sotto-clausola AS OF richiedono più tempo delle query sulle voci storiche recenti.
La tabella storica è stata generata da SQL Server (include un indice cluster sulle colonne della data e utilizza la compressione della pagina), ho aggiunto 50 milioni di righe alla tabella storica e le mie query stavano recuperando circa 25.000 righe.
Ho provato a determinare la causa principale del problema ma non sono stato in grado di identificarlo. Finora ho testato:
- Creazione di una tabella di test con 50 milioni di righe con un indice cluster per vedere se il rallentamento era semplicemente dovuto al volume. Sono stato in grado di recuperare 25K righe a tempo costante (~ 400ms).
- Rimozione della compressione della pagina dalla tabella storica. Ciò non ha avuto alcun effetto sul tempo di recupero ma ha aumentato in modo significativo le dimensioni della tabella.
- Ho provato ad accedere direttamente alle righe della tabella della cronologia utilizzando una colonna ID rispetto alle colonne della data. Questo è dove le cose erano un po 'più interessanti. Potrei accedere alle righe più vecchie nella tabella a ~ 400ms dove come con la sotto-clausola AS OF occorrerebbero ~ 1200ms. Ho provato a filtrare sulla mia tabella di test nella colonna della data e ho notato un rallentamento simile rispetto al filtro sulla colonna ID. Questo mi porta a credere che i confronti delle date siano alla base di alcuni rallentamenti.
Voglio approfondire questo aspetto, ma voglio anche assicurarmi di non abbaiare sull'albero sbagliato. Innanzitutto, qualcun altro ha riscontrato questo stesso comportamento durante l'accesso a dati storici meno recenti in una tabella temporale (abbiamo notato che i rallentamenti hanno superato solo 10 milioni di righe)? In secondo luogo, quali sono alcune strategie che posso utilizzare per isolare ulteriormente la causa principale del problema di prestazioni (ho appena iniziato a esaminare i piani di esecuzione ma per me è ancora un po 'enigmatico)?
Piani di esecuzione
Queste sono semplici query di recupero: la prima accede alle righe più vecchie, la seconda accede alle righe più recenti.
Righe precedenti ~ 1200 ms tempo di esecuzione
Righe recenti ~ tempo di esecuzione 350ms
Dettagli della tabella
Queste sono le colonne nella tabella temporale. La tabella cronologica ha le stesse colonne ma non ha una chiave primaria (secondo i requisiti della tabella cronologica):
Di seguito sono riportati gli indici nella tabella della cronologia: