CREATE STATISTICS (Transact-SQL)
Crea statistiche di ottimizzazione delle query, incluse le statistiche filtrate, su una o più colonne di una tabella o di una vista indicizzata. Per la maggior parte delle query, Query Optimizer genera già le statistiche necessarie per un piano di query di alta qualità. In alcuni casi, è necessario creare statistiche aggiuntive con CREATE STATISTICS o modificare la progettazione delle query per ottenere prestazioni migliori di esecuzione delle query.
Le statistiche filtrate possono migliorare le prestazioni di esecuzione delle query che effettuano la selezione da subset ben definiti di dati. Le statistiche filtrate utilizzano un predicato del filtro nella clausola WHERE per selezionare il subset di dati incluso nelle statistiche. L'operazione CREATE STATISTICS può utilizzare tempdb per ordinare l'esempio di righe per la compilazione di statistiche.
Per ulteriori informazioni sulle statistiche, incluso quando utilizzare CREATE STATISTICS, vedere Utilizzo di statistiche per migliorare le prestazioni di esecuzione delle query.
Sintassi
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ ,...n ] )
[ WHERE <filter_predicate> ]
[ WITH
[ [ FULLSCAN
| SAMPLE number { PERCENT | ROWS }
| STATS_STREAM = stats_stream ] [ , ] ]
[ NORECOMPUTE ]
] ;
<filter_predicate> ::=
<conjunct> [AND <conjunct>]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant ,…)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<
Argomenti
statistics_name
Nome delle statistiche da creare.table_or_indexed_view_name
Nome della tabella o della vista indicizzata per cui creare le statistiche. È possibile creare le statistiche per le tabelle o le viste indicizzate di un altro database specificando un nome di tabella completo.column [ ,…n]
Specifica la colonna chiave o l'elenco di colonne chiave per cui creare le statistiche. È possibile specificare qualsiasi colonna utilizzabile come colonna chiave di indice, con le eccezioni seguenti:Non è possibile specificare colonne xml, full-text e FILESTREAM.
È possibile specificare colonne calcolate solo se le opzioni del database ARITHABORT e QUOTED_IDENTIFIER sono impostate su ON.
È possibile specificare colonne CLR con tipo definito dall'utente se il tipo supporta l'ordinamento binario. È possibile specificare colonne calcolate definite come chiamate di metodi da una colonna con tipo definito dall'utente se tali metodi sono contrassegnati come deterministici. Per ulteriori informazioni sulla creazione di colonne CLR con tipo definito dall'utente, vedere Utilizzo di tipi CLR definiti dall'utente.
WHERE <filter_predicate>
Specifica un'espressione per la selezione di un subset di righe da includere durante la creazione dell'oggetto statistiche. Le statistiche create con un predicato del filtro vengono definite statistiche filtrate. Il predicato del filtro utilizza una logica di confronto semplice e non può fare riferimento a una colonna calcolata, a una colonna con tipo definito dall'utente, a una colonna con tipo di dati spaziale o a una colonna con tipo di dati hierarchyID. I confronti in cui vengono utilizzati valori letterali NULL non sono consentiti con gli operatori di confronto. In alternativa, utilizzare gli operatori IS NULL e IS NOT NULL.Di seguito sono riportati alcuni esempi di predicati di filtro per la tabella Production.BillOfMaterials:
WHERE StartDate > '20040101' AND EndDate <= '20040630'
WHERE ComponentID IN (533, 324, 753)
WHERE StartDate IN ('20040404', '20040905') AND EndDate IS NOT NULL
Per ulteriori informazioni sui predicati di filtro, vedere Linee guida per la progettazione di indici filtrati.
FULLSCAN
Consente di calcolare le statistiche analizzando tutte le righe nella tabella o nella vista indicizzata. FULLSCAN e SAMPLE 100 PERCENT generano gli stessi risultati. Non è possibile utilizzare FULLSCAN con l'opzione SAMPLE.SAMPLE number { PERCENT | ROWS }
Specifica la percentuale approssimativa o il numero di righe presenti nella tabella o nella vista indicizzata utilizzate da Query Optimizer durante la creazione delle statistiche. Per PERCENT, number può essere compreso tra 0 e 100, mentre per ROWS, number può essere compreso tra 0 e il numero totale di righe. La percentuale effettiva o il numero di righe campionate da Query Optimizer potrebbero non corrispondere alla percentuale o al numero specificato. Query Optimizer analizza ad esempio tutte le righe in una pagina di dati.SAMPLE è utile per i casi speciali in cui il piano di query, basato sul campionamento predefinito, non è ottimale. Nella maggior parte delle situazioni, non è necessario specificare SAMPLE perché Query Optimizer utilizza già il campionamento e determina le dimensioni del campione statisticamente significative per impostazione predefinita, come richiesto per creare piani di query di alta qualità.
Questa opzione non può essere utilizzata quando viene specificata l'opzione FULLSCAN. Se non si specifica né SAMPLE né FULLSCAN, Query Optimizer utilizza i dati campionati e calcola le dimensioni del campione per impostazione predefinita.
Si sconsiglia di specificare 0 PERCENT o 0 ROWS. Se si specifica 0 PERCENT o ROWS, l'oggetto statistiche viene creato ma non conterrà i dati delle statistiche.
NORECOMPUTE
Disabilitare l'opzione di aggiornamento automatico delle statistiche AUTO_STATISTICS_UPDATE per statistics_name. Se viene specificata questa opzione, Query Optimizer completa gli aggiornamenti delle statistiche in corso per statistics_name e disabilita gli aggiornamenti futuri.Per riabilitare gli aggiornamenti delle statistiche, rimuovere le statistiche con DROP STATISTICS ed eseguire CREATE STATISTICS senza l'opzione NORECOMPUTE.
Attenzione L'utilizzo di questa opzione può produrre piani di query non ottimali. È consigliabile limitare l'utilizzo di questa opzione e riservarne l'applicazione a un amministratore del sistema qualificato.
Per ulteriori informazioni sull'opzione AUTO_UPDATE_STATISTICS, vedere Opzioni ALTER DATABASE SET (Transact-SQL). Per ulteriori informazioni sulla disabilitazione e riabilitazione degli aggiornamenti delle statistiche, vedere Utilizzo di statistiche per migliorare le prestazioni di esecuzione delle query.
STATS_STREAM **=**stats_stream
Identificato solo a scopo informativo. Non supportato. Non è garantita la compatibilità con le versioni future.
Osservazioni
È possibile elencare fino a 32 colonne per oggetto statistiche.
Quando utilizzare CREATE STATISTICS
Per ulteriori informazioni sulle situazioni in cui utilizzare CREATE STATISTICS, vedere Utilizzo di statistiche per migliorare le prestazioni di esecuzione delle query.
Dipendenze di riferimento per le statistiche filtrate
Nella vista del catalogo sys.sql_expression_dependencies viene registrata ogni colonna nel predicato delle statistiche filtrate come una dipendenza di riferimento. Tenere presente le operazioni eseguite sulle colonne della tabella prima di creare statistiche filtrate poiché non è possibile eliminare, rinominare o modificare la definizione di una colonna della tabella definita in un predicato delle statistiche filtrate.
Autorizzazioni
È richiesta l'autorizzazione ALTER TABLE oppure l'utente deve essere il proprietario della tabella o della vista indicizzata o deve essere membro di un ruolo predefinito del database db_ddladmin.
Esempi
A. Utilizzo di CREATE STATISTICS con l'opzione SAMPLE number PERCENT
Nell'esempio seguente vengono create le statistiche ContactMail1 utilizzando un campionamento casuale del 5% delle colonne BusinessEntityID e EmailAddress della tabella Person del database AdventureWorks2008R2.
USE AdventureWorks2008R2;
GO
CREATE STATISTICS ContactMail1
ON Person.Person (BusinessEntityID, EmailPromotion)
WITH SAMPLE 5 PERCENT;
B. Utilizzo di CREATE STATISTICS con le opzioni FULLSCAN e NORECOMPUTE
Nell'esempio seguente vengono create le statistiche ContactMail2 per tutte le righe nelle colonne BusinessEntityID e EmailAddress della tabella Person e viene disabilitato il ricalcolo automatico delle statistiche.
CREATE STATISTICS NamePurchase
ON AdventureWorks2008R2.Person.Person (BusinessEntityID, EmailPromotion)
WITH FULLSCAN, NORECOMPUTE;
C. Utilizzo di CREATE STATISTICS per creare statistiche filtrate
Nell'esempio seguente vengono create le statistiche filtrate ContactPromotion1. Motore di database utilizza come campione il 50% dei dati, quindi seleziona le righe in cui EmailPromotion è uguale a 2.
USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.stats
WHERE name = N'ContactPromotion1'
AND object_id = OBJECT_ID(N'Person.Person'))
DROP STATISTICS Person.Person.ContactPromotion1
GO
CREATE STATISTICS ContactPromotion1
ON Person.Person (BusinessEntityID, LastName, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO
Vedere anche