Sto usando MS SQL e devo eseguire diverse query sulla stessa tabella con criteri diversi. All'inizio ho eseguito ogni query sulla tabella originale sebbene condividessero tutti alcuni filtri (ad es. Data, stato). Ciò ha richiesto molto tempo (circa 2 minuti).
Esistono duplicati nelle righe di dati e tutti gli indici NON SONO CLUSTER. Sono interessato solo a 4 colonne per i miei criteri e il risultato dovrebbe generare solo il conteggio, per tutte le query.
colonne necessarie: TABLE
, FIELD
, AFTER
, DATE
, e v'è un indice a ciascuno di DATE
e TABLE
.
Dopo aver creato una tabella temporanea con solo i campi di cui ho bisogno, è scesa a 1:40 minuti, il che è ancora molto male.
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
Esegui questo -> (216598 righe interessate)
Poiché non tutte le query si basano sull'intervallo di date, non l'ho incluso nella query. Il problema è che l' inserimento richiede solo molto più di 1 minuto . L'inserto sopra ha richiesto 1:19 minuti
Voglio eseguire qualcosa di simile per diverse query:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
È un problema con l'inserimento maggiore di quello della selezione, ma la temperatura ha molte meno righe della tabella originale, il che potrebbe essere meglio che passare attraverso la tabella più volte.
Come posso ottimizzarlo?
MODIFICARE
Ho rimosso l'ID ordinamento, ho pensato che il problema fosse principalmente con la selezione e non l'inserimento. Era un'ipotesi.
Non riesco a creare un unico su alcun indice poiché non esiste un campo o righe univoci.
Sto usando SQL Server 2012.
Informazioni sulla tabella : è un heap e utilizza il seguente spazio:
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
, perché non provi a ottimizzare ciascuna (query) separatamente? Non ti è permesso aggiungere indici alla tabella?
TABLE
e FIELD
dalla #temp
tabella (tutte le righe hanno TABLE = 'OTB' AND FIELD = 'STATUS'
per la tabella temporanea specifica dopo tutto).
CREATE TABLE
istruzione). Il voto negativo è dovuto al fatto che la domanda non era chiara.