IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Requetes dans Access localement sur tables liées SLQServer sur serveur


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2013
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 39
    Points : 25
    Points
    25
    Par défaut Requetes dans Access localement sur tables liées SLQServer sur serveur
    Bonjour à tous,

    Je poste ici car peu de réponses dans la section Access.

    J'ai des interrogations concernant un projet de migration Access vers SQLServer portant sur l’exécution des requêtes, La documentation Microsoft restant vague à ce sujet.

    En bref l'existant : j'ai une solution Access développée classiquement avec d'un côté un fichier contenant les données, exploité via tables liées par une autre base contenant formulaires, macros, code vba,...

    Je souhaite migrer dans un premier temps les données vers SQLServer en gardant les formulaires access tels quels (moyennant ajustements), en faisant pointer les tables attachées vers SQLServer.
    Outre le fait de bénéficier des avantages d'un vrai sgbd, l’intérêt est aussi de limiter le trafic réseau puisque théoriquement, les requêtes sont exécutées par le serveur de base de données.

    Néanmoins, j'ai vraiment quelques interrogations concernant le site d'exécution des requêtes, les voici :

    1. Les requêtes sql sur des tables liées sqlserver d'un formulaire access démarré sur un poste local sont-elle réellement toutes exécutées par le serveur base de données ?

    2. Si non, quelles types de requêtes sont exécutées sur le serveur ? sont exécutées en local ? hybrides ? je pense aux requêtes en sql spécifique Access ou embarquant des fonctions, requête paramétrée, ...etc...

    3. Si non, comment savoir qui exécute réellement la requête (poste local ou serveur ou les deux) ? Y a-t-il un outil pour monitorer ça ?

    4. Où/comment sont exécutées les commandes VBA type DLookup,... ?

    5. Le choix du site d’exécution est-il implicite, c'est à dire automatiquement décidé par le système selon la syntaxe de la requête ?

    J'espère qu'un spécialiste ou autre pourra me faire un retour d'expérience pouvant répondre à mes interrogations.

    Toutes autres remarques ou conseils seront bien sûr appréciés.

    D'avance merci


    **** edit ********


    J'ai importé mes données telles quelles dans une base sqlserver sur serveur et fait un simple test.

    J'ai créé volontairement une requête que je sais longue car non optimisée (pas d'index,...) du type [select * from matable order by monchamp desc].

    Cette requête, exécutée sur mon poste local dans Access, sur une la base access (fichier hébergé sur un serveur de fichiers, donc transit des données via le réseau), prend... un certain temps.
    La même requête, exécutée sur mon poste local, Dans Access, mais sur la table liée équivalente dans SQLServer (SQLServer hébergé sur un serveur, donc transit des données via le réseau), est immédiate.

    Dans le monitoring SQLServer, je vois bien la requête s'exécuter.
    Un fetch vers le dernier enreg dans Access est immédiat.

    De la même façon, une requête du type [select * from matable where monchamp = 'abcde'] apparait bien dans le moniteur de requête de SQLServer, ce qui me fait penser que la requête est bien exécutée par le serveur et que seul l'enregistrement résultat transite via le réseau vers mon mon poste local. (et non pas un mécanisme du style rapatriement de toute la table en local, puis application du filtre.

    Mais entre mon ressenti et la réalité, une confirmation d'un spécialiste serait la bienvenue

    ***********

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par troycanneda Voir le message
    ...

    Néanmoins, j'ai vraiment quelques interrogations concernant le site d'exécution des requêtes, les voici :

    1. Les requêtes sql sur des tables liées sqlserver d'un formulaire access démarré sur un poste local sont-elle réellement toutes exécutées par le serveur base de données ?
    Toutes les requêtes envoyées au serveur SQL sont exécutées de manière interne au moteur SQL Server. Le problème est qu'en utilisant des tables liées vous ne faites qu'envoyer un SELECT * FROM MaTable au serveur SQL qui va ensuite renvoyer toutes les données de chacune des tables qu'Access traitera localement....

    2. Si non, quelles types de requêtes sont exécutées sur le serveur ? sont exécutées en local ? hybrides ? je pense aux requêtes en sql spécifique Access ou embarquant des fonctions, requête paramétrée, ...etc...
    Il faut ne pas faire de tables liées pour que tout s'exécute dans le moteur SQL...

    3. Si non, comment savoir qui exécute réellement la requête (poste local ou serveur ou les deux) ? Y a-t-il un outil pour monitorer ça ?
    Le profiler SQL vous permet de sniffer toutes les requêtes exécutées par le serveur SQL.


    4. Où/comment sont exécutées les commandes VBA type DLookup,... ?
    Dans Access une fois qu'il a reçu l'intégralité des données de la table...

    5. Le choix du site d’exécution est-il implicite, c'est à dire automatiquement décidé par le système selon la syntaxe de la requête ?
    La syntaxe n'a rien à voir la dedans. L'architecture oui ! Utiliser ou non des tables liées...

    J'espère qu'un spécialiste ou autre pourra me faire un retour d'expérience pouvant répondre à mes interrogations.

    Toutes autres remarques ou conseils seront bien sûr appréciés.

    D'avance merci


    **** edit ********


    J'ai importé mes données telles quelles dans une base sqlserver sur serveur et fait un simple test.

    J'ai créé volontairement une requête que je sais longue car non optimisée (pas d'index,...) du type [select * from matable order by monchamp desc].

    Cette requête, exécutée sur mon poste local dans Access, sur une la base access (fichier hébergé sur un serveur de fichiers, donc transit des données via le réseau), prend... un certain temps.
    La même requête, exécutée sur mon poste local, Dans Access, mais sur la table liée équivalente dans SQLServer (SQLServer hébergé sur un serveur, donc transit des données via le réseau), est immédiate.

    Dans le monitoring SQLServer, je vois bien la requête s'exécuter.
    Un fetch vers le dernier enreg dans Access est immédiat.

    De la même façon, une requête du type [select * from matable where monchamp = 'abcde'] apparait bien dans le moniteur de requête de SQLServer, ce qui me fait penser que la requête est bien exécutée par le serveur et que seul l'enregistrement résultat transite via le réseau vers mon mon poste local. (et non pas un mécanisme du style rapatriement de toute la table en local, puis application du filtre.

    Mais entre mon ressenti et la réalité, une confirmation d'un spécialiste serait la bienvenue

    ***********
    En fait, la différence de vitesse vient du fait que dans Access il y a parcours de tous le fichier de la base sur le disque pour trouver les données. Dans SQL Server c'est juste une lecture faite en mémoire. Il n'y a qu'un seul accès au disque lors de la première lecture et ensuite toutes les lectures/écritures sont faites dans le cache mémoire....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2013
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Merci pour cette réponse complète, qui forcément amène d'autres questions

    Il faut ne pas faire de tables liées pour que tout s'exécute dans le moteur SQL...
    La syntaxe n'a rien à voir la dedans. L'architecture oui ! Utiliser ou non des tables liées...
    Quelles solutions a préconiser donc pour exploiter des formulaires access basés sur des tables sqlserver sans passer par des tables liées ?

    Le profiler SQL vous permet de sniffer toutes les requêtes exécutées par le serveur SQL.
    Le problème est qu'en utilisant des tables liées vous ne faites qu'envoyer un SELECT * FROM MaTable au serveur SQL qui va ensuite renvoyer toutes les données de chacune des tables qu'Access traitera localement....
    J'ai effectivement tester le profiler SQL, comme indiqué dans mon *** edit ***.
    Lorsque j'effectue dans Access ma requête [select * from matable where monchamp = 'abcde'], je vois bien passer cette requête dans le profiler SQL sur le serveur. J'en déduis donc naturellement que c'est bien le moteur SQLServer qui effectue la condition [= 'abcde'], et donc que seul les données répondant à la condition transitent via le réseau. Votre dernier commentaire semble affirmer que l'ensemble des données de la table transite via le réseau, puis que Access effectue la condition localement. Dans ce cas là, le profiler SQL devrait simplement me montrer un [select * from matable], sans condition. J'avoue que ça me rend perplexe... D'autant plus qu'en parallèle, je commence à lire certains articles sur internet (par exemple https://codekabinett.com/rdumps.php?...le-performance) qui décrivent des comportements différents selon le type de requêtes

    merci
    ++

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/01/2022, 17h17
  2. Réponses: 0
    Dernier message: 16/04/2010, 18h45
  3. Ecrire une requete dans une formulaire sur plusieurs lignes
    Par Elendhil dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/01/2008, 15h44
  4. Réponses: 16
    Dernier message: 27/10/2006, 16h12
  5. Runtime Access 2002, MDE, tables liées
    Par jfg dans le forum Runtime
    Réponses: 13
    Dernier message: 13/12/2005, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo