Requisiti relativi alle statistiche di distribuzione per i provider OLE DB
Per ottimizzare ulteriormente le query distribuite, in SQL Server vengono definite estensioni della specifica OLE DB che i provider OLE DB possono utilizzare per visualizzare le statistiche di distribuzione relative agli oggetti set di righe o tabella esposti. Queste estensioni sono definite nella documentazione di SQL Server. Gli sviluppatori dei singoli provider OLE DB devono tuttavia definire all'interno dei provider il codice per il supporto delle estensioni, in modo da rendere disponibili tali informazioni in SQL Server. Se un provider include una parte di codice che supporta le estensioni, queste possono essere utilizzate in SQL Server per l'ottimizzazione delle prestazioni delle query distribuite. Se un provider non supporta le estensioni, in SQL Server vengono utilizzate semplici stime delle statistiche di distribuzione.
Nota
Il provider OLE DB di Microsoft SQL Server SQL Native Client e il provider Microsoft OLE DB per Oracle supportano le statistiche di distribuzione.
Le estensioni per le statistiche di distribuzione vengono sviluppate in base a un'unità denominata statistica. Ogni tabella può includere zero o più statistiche, ognuna delle quali corrisponde ai dati relativi a una o più colonne. In una statistica vengono registrati gli elementi seguenti:
La cardinalità dei valori, ovvero il numero di valori univoci, in ogni colonna considerata dalla statistica.
La cardinalità dei valori concatenati di tutte le colonne della statistica.
Facoltativamente, un istogramma che rappresenta le informazioni relative a diversi intervalli di valori di chiave della prima colonna della statistica. I valori rappresentati possono includere il numero di righe di ogni intervallo di chiavi, il numero di valori univoci in ogni intervallo di chiavi oppure il numero di righe della tabella in cui i valori di chiave sono uguali o minori del valore di chiave maggiore dell'intervallo.
Di seguito è riportata una tabella di esempio.
ColumnA |
ColumnB |
---|---|
'abc' |
'xyz' |
'abc' |
'xyz' |
'def' |
'xyz' |
'mno' |
'xyz' |
'mno' |
'mmm' |
'tuv' |
'xyz' |
Per una statistica relativa alle colonne ColumnA e ColumnB, la cardinalità dei valori combinati delle due colonne è 5. Ciò significa che esistono 5 combinazioni univoche di valori per ColumnA e ColumnB, in quanto le prime due righe includono lo stesso valore combinato ('abc' + 'xyz').
La cardinalità singola di ColumnA è 4 e la cardinalità singola di ColumnB è 2. Le statistiche di ColumnA possono essere rappresentate in un semplice istogramma a quattro livelli.
Intervallo di valori |
Percentuale di righe di tabella nell'intervallo |
---|---|
da 'aaa' a 'hzz' |
50% |
da 'iaa' a 'nzz' |
33% |
da 'oaa' a 'rzz' |
00% |
da 'taa' a 'zzz' |
17% |
Origini dei dati OLE DB diverse registrano le statistiche di distribuzione in combinazioni di colonne diverse e il set di statistiche restituite da un provider OLE DB viene definito in fase di implementazione. Ad esempio, in SQL Server 6.5 e versioni precedenti, le statistiche di distribuzione vengono compilate solo per le colonne associate a indici e viene registrata una statistica per ogni indice definito in una tabella. In SQL Server 7.0 e versioni successive, vengono compilate le statistiche seguenti:
Una statistica per ogni indice definito in una tabella.
Una statistica per ogni istruzione CREATE STATISTIC.
Una statistica per ogni statistica creata automaticamente.
Il livello di selettività di una colonna è elevato se è probabile che venga restituito un numero di righe ridotto in base al valore specificato in un argomento del predicato. Le statistiche di distribuzione possono essere utilizzate per stimare il livello di selettività:
Le colonne con una cardinalità elevata includono un maggior numero di valori di dati ed è probabile che ognuno di tali valori corrisponda a un minor numero di righe rispetto a una colonna con livello di cardinalità basso.
Se un provider OLE DB produce un istogramma in cui è indicata la distribuzione dei valori in una colonna, anche Query Optimizer di SQL Server potrà stimare se un valore specifico di un argomento del predicato è compreso in un intervallo con selettività elevata o ridotta.
La disponibilità di statistiche di distribuzione valide per un server collegato può inoltre consentire all'ottimizzatore di compilare un piano di esecuzione efficiente per la parte locale di una query distribuita.
Query Optimizer di SQL Server utilizza le statistiche di distribuzione per ridurre la quantità di dati scambiati tra il provider OLE DB e SQL Server. Ad esempio, quando si esegue un join distribuito tra TableA nel server locale e TableB in un server collegato, le statistiche di distribuzione consentono a SQL Server di determinare quale processo risulta più efficiente:
Inviare al server collegato le righe di TableA che corrispondono a predicati non di join ed eseguire il join nel server collegato.
Recuperare nel server locale le righe di TableB che corrispondono a predicati non di join ed eseguire il join nel server locale.
Se un provider OLE DB non visualizza le informazioni sulla cardinalità di una colonna, Query Optimizer di SQL Server stima una cardinalità bassa. Se un provider non visualizza un istogramma di distribuzione per una statistica, l'ottimizzatore funziona come se i valori fossero distribuiti uniformemente tra le righe della tabella.
Per la visualizzazione delle statistiche di distribuzione, in SQL Server vengono utilizzate le estensioni seguenti dei provider OLE DB:
Una proprietà per le origini dei dati, DBPROP_TABLESTATISTICS, indica se il provider segnala le statistiche di distribuzione.
L'interfaccia IDBSchemaRowset TABLE_STATISTICS visualizza un elenco delle statistiche disponibili per una tabella di base specifica, inclusa la cardinalità di colonne e righe.
IOpenRowset::OpenRowset accetta gli argomenti che identificano una statistica. Se viene specificata una statistica, OpenRowset restituisce un set di righe in forma di istogramma che indica la distribuzione dei valori della prima colonna inclusa nella statistica specificata in StatisticID.
Tali estensioni di OLE DB sono incluse in OLE DB 2.6 o versioni successive. Per ulteriori informazioni sulle estensioni indicate relative alle statistiche di distribuzione, vedere la specifica di OLE DB 2.6.
Un provider OLE DB può scegliere di implementare un miglioramento delle prestazioni eseguendo un campionamento di una parte delle righe di una tabella di base per determinare gli istogrammi e le statistiche di distribuzione. Prima di visualizzare i valori in TABLE_STATISTICS e nei set di righe dell'istogramma, questi provider devono adeguare la cardinalità e i dati dell'istogramma in modo che rispecchino i valori totali della tabella.
In fase di implementazione viene definito se un provider OLE DB mantiene aggiornati i dati di TABLE_STATISTICS e del set di righe dell'istogramma in base al contenuto corrente della tabella di base.
Nota
Per creare piani di query ottimali quando si utilizza una tabella in un server collegato, è necessario che Query Processor ottenga le statistiche di distribuzione dei dati dal server collegato. Gli utenti con autorizzazioni limitate per qualsiasi colonna della tabella potrebbero non disporre delle autorizzazioni sufficienti per ottenere tutte le statistiche utili, nonché ricevere un piano di query meno efficiente e riscontrare un peggioramento delle prestazioni. Se il server collegato è un'istanza di SQL Server, per ottenere tutte le statistiche disponibili l'utente deve essere il proprietario della tabella oppure un membro del ruolo predefinito del server sysadmin, del ruolo predefinito del database db_owner oppure del ruolo predefinito db_ddladmin nel server collegato.