Accès lié à SQL Server

Si j'utilise Access pour lier à la database SQL Server, la vitesse sera-t-elle la même?

Par exemple, j'ai une table [TEST] dans la database SQL Server, avec un index sur la colonne [ID] . Si j'écris la requête SQL dans l'environnement SQL Server:

 SELECT .... FROM TEST WHERE ID = ...; 

L'index fonctionne (ou aide). Si je lier à ce [TEST] utilisant Access, et écrire la requête dans Access:

 SELECT .... FROM TEST WHERE ID = ...; 

La vitesse sera-t-elle la même que l'interrogation de données dans l'environnement SQL Server? Y at-il un moyen de le tester, comme le plan d'exécution, ou SQL Server Profiler dans le SQL Server?

Merci

Tant que vous faites toutes vos jointures et où les clauses sur les champs indexés, il devrait être relativement similaire côté server. Des problèmes commencent à se produire lorsque vous utilisez le moteur de requête Access pour extraire des données des tables liées et que vous utilisez des champs non indexés.

Dans ces cas, Access aime faire des choses comme requestr tout à partir de la table, et effectuer ses filters côté client. Cela frappe le server plus fort, frappe le réseau plus fort et oblige votre machine à passer beaucoup plus de données pour afficher le jeu de résultats.

Les requêtes directes sont certainement votre meilleur choix pour éviter ce genre de problèmes. Quelques avertissements pour l'utilisation des requêtes directes avec DAO:

  • Vous ne pouvez pas affecter de parameters aux requêtes directes DAO. Par conséquent, lorsque vous avez besoin de critères flexibles, vous devez utiliser le SQL dynamic.
  • Vous pouvez faire des choses complexes dans les requêtes directes DAO (par exemple, les déclarations de variables, exécuter plusieurs requêtes en séquence, sliders (si vous devez), etc.) mais pour faire quelque chose de plus compliqué qu'une seule instruction, vous devez SET NOCOUNT ON ou sinon Access se bloquera lorsque la première instruction returnnera son statut.

(Si je travaille dans le code, je préfère généralement utiliser ADO pour les requêtes directes, principalement parce que cela me permet d'utiliser des parameters, et je suis super paranoïaque sur le SQL dynamic (surtout s'il y a une input de string impliquée). ADO ne gère pas les environnements JET aussi bien que DAO.)

La vitesse sera-t-elle la même que l'interrogation de données dans l'environnement SQL Server?

En général: oui. Dans mon expérience, pour la grande majorité des requêtes, le time d'exécution sur le server sera plus ou less identique dans les deux cas. Bien sûr, il y a un peu de surcharge réseau pour afficher datatables dans Access, de sorte que le time d'exécution total peut être un peu plus élevé.

Il y a des exceptions, cependant. J'ai eu des requêtes complexes, généralement avec une ou plusieurs jointures à gauche, qui fonctionnent de manière abyssale lorsqu'elles sont exécutées dans Access, mais sans aucun problème lorsqu'elles sont exécutées sur SQL Server.

Pour ces cas (vous les remarquerez!), Utilisez les requêtes directes dans Access. Ils sont exécutés directement sur le server tel qu'il est écrit, sans être interprétés par le pilote ODBC.

Je fais quelque chose de similaire, mais avec Redbrick, pas de server SQL. Ce sont mes observations:

En utilisant une requête de passage, il y a peu ou pas de différence de performance. Cependant, la sortie sera en lecture seule, ce qui peut être ou ne pas être ce que vous voulez.

En utilisant le concepteur de requêtes d'access, sur une seule table, avec une key primaire composite, il peut être rapide comme l'éclair ou horriblement lent. Si la requête ne renvoie aucune ligne, vous obtenez instantanément un jeu de résultats vide. Toutefois, si la requête doit renvoyer des données, l'histoire est différente.

Cet exemple utilise une table appelée clinic_fact avec une key primaire de registration_number et clinic_position. Il a environ 6,5 millions d'loggings. Si vous interrogez la database directement, en filtrant sur un seul numéro d'logging, vous obtenez des résultats instantanés. En access, il faut plus de 10 secondes pour get les résultats. Pendant ce time, je peux voir ce que SQL est généré. Ça ressemble à ça.

 select yourfields from "clinic_fact" where "registration_number" = 'something' and "clinic_position" = 2 or "registration_number" = 'something' and "clinic_position" = 1 or "registration_number" = 'something' and "clinic_position" = 1 or "registration_number" = 'something' and "clinic_position" = 1 or "registration_number" = 'something' and "clinic_position" = 1 or "registration_number" = 'something' and "clinic_position" = 1 or "registration_number" = 'something' and "clinic_position" = 1 or "registration_number" = 'something' and "clinic_position" = 1 or "registration_number" = 'something' and "clinic_position" = 1 or "registration_number" = 'something' and "clinic_position" = 1; 

Cette requête renvoie 2 lignes. Les positions cliniques sont 1 et 2.

Ce genre de choses peut ou ne peut pas arriver avec SQL Server. Je suggère que vous l'essayiez et que vous voyiez.

Si j'utilise Access pour lier à la database SQL Server, la vitesse sera-t-elle la même?

Cela dépend du type de requête que vous exécutez. J'ai trouvé que généralement pour les requêtes SELECT le time d'exécution finit par être à peu près le même, mais pour les requêtes UPDATE et DELETE, pour une raison quelconque, semble être très lent. Cela dit, je pense que tout le monde qui a travaillé avec Access pendant un petit moment sera d'accord pour dire qu'il se comporte parfois de façon inattendue. Vous devrez donc l'essayer et comparer les résultats finaux.