Profilage des données de performances du pilote ODBC
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Cet exemple montre les options spécifiques au pilote ODBC SQL Server pour enregistrer les statistiques de performances. L’exemple crée un fichier : odbcperf.log.Cet exemple montre à la fois la création d’un fichier journal des données de performances et l’affichage des données de performances directement à partir de la structure de données SQLPERF (la structure SQLPERF est définie dans Odbcss.h.). Cet exemple a été développé pour la version 3.0 d'ODBC ou une version ultérieure.
Important
Lorsque c'est possible, utilisez l'authentification Windows. Si l'authentification Windows n'est pas disponible, invitez les utilisateurs à entrer leurs informations d'identification au moment de l'exécution. Évitez de stocker ces informations dans un fichier. Si vous devez rendre les informations d'identification persistantes, chiffrez-les avec l' API de chiffrement Win32.
Pour enregistrer les données de performances du pilote à l'aide de l'Administrateur ODBC
Dans Panneau de configuration, double-cliquez sur Outils d’administration, puis double-cliquez sur Sources de données (ODBC). Vous pouvez également appeler l'exécutable odbcad32.exe.
Cliquez sur l’onglet User DSN, System DSN ou File DSN .
Cliquez sur la source de données dont vous souhaitez consigner les performances.
Cliquez sur Configurer.
Dans l’Assistant Configuration DSN de Microsoft SQL Server, accédez à la page avec les statistiques du pilote ODBC du journal dans le fichier journal.
Sélectionnez les statistiques du pilote ODBC du journal dans le fichier journal. Dans la zone, tapez le nom du fichier dans lequel les statistiques sont à enregistrer. Si vous le souhaitez, cliquez sur Parcourir pour parcourir le système de fichiers du journal des statistiques.
Pour enregistrer les données de performances du pilote par programme
Appelez SQLSetConnectAttr avec SQL_COPT_SS_PERF_DATA_LOG et le chemin d’accès complet et le nom de fichier du fichier journal des données de performances. Par exemple :
"C:\\Odbcperf.log"
Appelez SQLSetConnectAttr avec SQL_COPT_SS_PERF_DATA et SQL_PERF_START pour démarrer la journalisation des données de performances.
Si vous le souhaitez, appelez SQLSetConnectAttr avec SQL_COPT_SS_LOG_NOW et NULL pour écrire un enregistrement délimité par un onglet des données de performances dans le fichier journal des données de données de performances. Vous pouvez effectuer plusieurs fois cette opération en cours d'exécution de l'application.
Appelez SQLSetConnectAttr avec SQL_COPT_SS_PERF_DATA et SQL_PERF_STOP pour arrêter la journalisation des données de performances.
Pour extraire les données de performances du pilote dans une application
Appelez SQLSetConnectAttr avec SQL_COPT_SS_PERF_DATA et SQL_PERF_START pour démarrer les données de performances de profilage.
Appelez SQLGetConnectAttr avec SQL_COPT_SS_PERF_DATA et l’adresse d’un pointeur vers une structure SQLPERF. Le premier appel définit le pointeur sur l'adresse d'une structure SQLPERF valide qui contient les données de performances actuelles. Le pilote n'actualise pas en permanence les données dans la structure de performance. L’application doit répéter l’appel à SQLGetConnectAttr chaque fois qu’elle doit actualiser la structure avec des données de performances plus actuelles.
Appelez SQLSetConnectAttr avec SQL_COPT_SS_PERF_DATA et SQL_PERF_STOP pour arrêter la journalisation des données de performances.
Exemple
Vous aurez besoin d'une source de données ODBC nommée AdventureWorks, dont la base de données par défaut est l'exemple de base de données AdventureWorks. (Vous pouvez télécharger l’exemple de base de données AdventureWorks à partir de la Page d’accueil exemples et projets communautaires Microsoft SQL Server.) Cette source de données doit être basée sur le pilote ODBC fourni par le système d’exploitation (le nom du pilote est « SQL Server »). Si vous générez et exécutez cet exemple comme une application 32 bits sur un système d'exploitation 64 bits, vous devez créer la source de données ODBC avec l'administrateur ODBC dans %windir%\SysWOW64\odbcad32.exe.
Cet exemple se connecte à l’instance SQL Server par défaut de votre ordinateur. Pour vous connecter à une instance nommée, modifiez la définition de la source de données ODBC pour spécifier l'instance en utilisant le format suivant : serveur\namedinstance. Par défaut, SQL Server Express est installé dans une instance nommée.
Compilez avec odbc32.lib.
// compile with: odbc32.lib
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
void Cleanup() {
if (hstmt1 != SQL_NULL_HSTMT)
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
if (hdbc1 != SQL_NULL_HDBC) {
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
}
if (henv != SQL_NULL_HENV)
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
int main() {
RETCODE retcode;
// Pointer to the ODBC driver performance structure.
SQLPERF *PerfPtr;
SQLINTEGER cbPerfPtr;
// Allocate the ODBC environment and save handle.
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(Env) Failed\n\n");
Cleanup();
return(9);
}
// Notify ODBC that this is an ODBC 3.0 app.
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLSetEnvAttr(ODBC version) Failed\n\n");
Cleanup();
return(9);
}
// Allocate ODBC connection handle and connect.
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
// This sample use Integrated Security. Please create the SQL Server
// DSN by using the Windows NT authentication.
retcode = SQLConnect(hdbc1, (UCHAR*)"AdventureWorks", SQL_NTS, (UCHAR*)"", SQL_NTS, (UCHAR*)"", SQL_NTS);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLConnect() Failed\n\n");
Cleanup();
return(9);
}
// Set options to log performance statistics. Specify file to use for the log.
retcode = SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA_LOG, &"odbcperf.log", SQL_NTS);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLSetConnectAttr() Failed\n\n");
Cleanup();
return(9);
}
// Start the performance statistics log.
retcode =
SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA, (SQLPOINTER)SQL_PERF_START, SQL_IS_UINTEGER);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLSetConnectAttr() Failed\n\n");
Cleanup();
return(9);
}
// Allocate statement handle, then execute command.
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLAllocHandle() Failed\n\n");
Cleanup();
return(9);
}
retcode = SQLExecDirect(hstmt1, (UCHAR*)"SELECT * FROM Purchasing.Vendor", SQL_NTS);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLExecDirect() Failed\n\n");
Cleanup();
return(9);
}
// Clear any result sets generated.
while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) {
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLMoreResults() Failed\n\n");
Cleanup();
return(9);
}
}
retcode = SQLExecDirect(hstmt1, (UCHAR*)"SELECT * FROM Sales.Store", SQL_NTS);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLExecDirect() Failed\n\n");
Cleanup();
return(9);
}
// Clear any result sets generated.
while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) {
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLMoreResults() Failed\n\n");
Cleanup();
return(9);
}
}
// Generate a long-running query.
retcode = SQLExecDirect(hstmt1, (UCHAR*)"waitfor delay '00:00:04' ", SQL_NTS);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLExecDirect() Failed\n\n");
Cleanup();
return(9);
}
// Clear any result sets generated.
while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) {
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLMoreResults() Failed\n\n");
Cleanup();
return(9);
}
}
// Write current statistics to the performance log.
retcode =
SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA_LOG_NOW, (SQLPOINTER)NULL, SQL_IS_UINTEGER);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLSetConnectAttr() Failed\n\n");
Cleanup();
return(9);
}
// Get pointer to current SQLPerf structure.
// Print a couple of statistics.
retcode =
SQLGetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA, (SQLPOINTER)&PerfPtr, SQL_IS_POINTER, &cbPerfPtr);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLGetConnectAttr() Failed\n\n");
Cleanup();
return(9);
}
printf("SQLSelects = %d, SQLSelectRows = %d\n", PerfPtr->SQLSelects, PerfPtr->SQLSelectRows);
// Cleanup
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
Voir aussi
Rubriques de procédures relatives au profilage de performances du pilote ODBC (ODBC)
Profilage des données de performances du pilote ODBC