2014-09-14 24 views
8

Ho un database in SQL Azure, che non sta prendendo tra i 15 ei 30 minuti per fare un semplice:"select count (id) dalla tabella" richiede fino a 30 minuti per il calcolo in SQL Azure

select count(id) from mytable 

Il database è di circa 3,3 GB e il conto ritorna circa 2.000.000, ma ho provato a livello locale e ci vogliono meno di 5 secondi!

Ho anche eseguire un:

ALTER INDEX ALL ON mytable REBUILD 

Su tutte le tabelle del database.

Apprezzeremmo se qualcuno potesse indicarmi alcune cose per provare a diagnosticare/risolvere questo problema.

(Si prega di saltare l'AGGIORNAMENTO 3 di seguito poiché ora penso che questo sia il problema, ma continuo a non capirlo).

UPDATE 1: Sembra che impieghi il 99% del tempo in una scansione dell'indice cluster come mostra l'immagine qui sotto. Ho

enter image description here

UPDATE 2: e questo è ciò che i messaggi statistiche tornano, come quando lo faccio:

SET STATISTICS IO ON 
SET STATISTICS TIME ON 
select count(id) from TABLE 

Statistiche:

SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 317037 ms. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 

(1 row(s) affected) 
Table 'TABLE'. Scan count 1, logical reads 279492, physical reads 8220, read-ahead reads 256018, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

(1 row(s) affected) 

SQL Server Execution Times: 
    CPU time = 297 ms, elapsed time = 438004 ms. 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 

UPDATE 3: OK - I avere un'altra teoria ora. Il portale di Azure suggerisce ogni volta che eseguo il test selezionando semplicemente la query che sta raggiungendo il 100% della mia percentuale di DTU. Sto usando un'istanza SQL standard di Azure con livello di prestazioni S1 (20 DTU). È possibile che questa semplice query venga rallentata dal mio limite DTU?

+0

Avete controllato per verificare che non ci sia un deadlock? – Craig

+0

Non formalmente ma sono abbastanza sicuro che non ci sia - Ho disattivato tutti gli aggiornamenti quindi la mia query è l'unica cosa che dovrebbe colpire il DB. – chrisb

+0

D: Quindi hai mai risolto il problema delle prestazioni di Azure? – FoggyDay

risposta

1

Suggerimento: provate select count(*) invece: potrebbe effettivamente migliorare il tempo di risposta:

Inoltre, hai fatto un "spiegano piano"?

============ UPDATE ============

Grazie per aver ottenuto le statistiche.

Stai facendo un tavolo scansione completa di righe 2M - non va bene :(

possibile soluzione: query tabella di sistema row_count invece:

http://blogs.msdn.com/b/arunrakwal/archive/2012/04/09/sql-azure-list-of-tables-with-record-count.aspx

select t.name ,s.row_count from sys.tables t 
join sys.dm_db_partition_stats s 
ON t.object_id = s.object_id 
    and t.type_desc = ‘USER_TABLE’ 
    and t.name not like ‘%dss%’ 
    and s.index_id = 1 
+0

Il conteggio di selezione (*) non ha aiutato - in realtà, dopo un lungo periodo ho ottenuto "Si è verificato un errore a livello di trasporto durante la ricezione dei risultati dal server. (Provider: Provider TCP, errore: 0 - Il periodo di timeout del semaforo è scaduto .) " Controllerò presto gli altri punti. – chrisb

+0

Ho modificato la mia risposta sopra dopo aver visto anche il piano - sembra che una scansione dell'indice cluster continui a occupare tutto il tempo. Questo richiede davvero tanto tempo per un semplice conteggio (id)? – chrisb

+0

Grazie per aver ottenuto le statistiche. Stai facendo una scansione completa della tabella di 2 milioni di righe: è una cosa brutta. POSSIBILE WORKAROUND: query table di sistema "row_count" invece: http://blogs.msdn.com/b/arunrakwal/archive/2012/04/09/sql-azure-list-of-tables-with-record-count.aspx – FoggyDay

1

Mi rendo conto che è vecchio , ma ho avuto lo stesso problema: avevo un tavolo con 2,5 milioni di righe che ho importato da un database on-prem in SQL di Azure ed eseguito a livello S3. Select Count(0) from Table res ultimato in un tempo di esecuzione di 5-7 minuti rispetto a millisecondi in sede.

In Azure, le scansioni di indici e tabelle sembrano essere penalizzate tremendamente in termini di prestazioni, pertanto aggiungere una query "inutile" WHERE alla query che lo costringe a eseguire una ricerca di indice sull'indice cluster ha aiutato.

Nel mio caso, questo eseguito quasi identico Select count(0) from Table where id > 0 ha comportato prestazioni corrispondenti alla query on-premise.

+0

WOW. Questo ha funzionato anche per me. Ho una query piuttosto complessa, che contiene una sottoquery. Quando aggiungo la clausola "inutile" dove subquery passava da 22 secondi a 1 secondo su Azure e da 600ms a 160ms localmente. Tuttavia, questa è una query su cui ho il controllo. La mia app utilizza anche EF che mi dà abbastanza incertezza per esaminare il passaggio alla VM. – Keith