Quels sont les avantages et les inconvénients de OleDB par rapport à SQLClient?
Contexte: l'un des systèmes que je suis en train de travailler sur un .net 2.0 de l'application web. VB.net pour le front-end, et SQL Server 2005 pour le backend. Pour une variété de raisons qui ont été perdu de temps, l'architecte a décidé d'utiliser l' .Net connexion OleDB plutôt que la connexion SQLClient.
Après quelques années de développement, ce système est sur le point de franchissement de la ligne de "beta" dans "1.0". L'une des choses dont nous avons parlé à ce point est le déplacement de la connexion SQLClient. Même si j'ai conscience que c'est la meilleure pratique pour l'utiliser, et que c'est le seul moyen d'obtenir l'amateur fonctionnalités de SQL Server 2005 (dont nous ne sommes pas à l'aide, évidemment) quels sont les avantages de l'utilisation de l'un sur l'autre? Tout pièges cachés que je devrais connaître? Et quelqu'un peut me pointer à certains critères de référence illustrant les différentes vitesses? (J'ai entendu dire que le SQLClient est censé être plus rapide, mais je n'ai jamais vu de chiffres à l'arrière.)
Merci à tous.
source d'informationauteur Electrons_Ahoy | 2009-01-23
Vous devez vous connecter pour publier un commentaire.
OleDb est plus générique. Si jamais vous passez à un autre type de base de données à l'avenir, il ya une bonne chance qu'il va avoir un pilote Ole et vous n'aurez pas à changer beaucoup de code.
D'autre part, le natif Sql Server pilote est censé être plus rapide que vous avez dit et il a de plus agréable à la prise en charge des paramètres (les paramètres peuvent utiliser des noms et ne pas ont être dans l'ordre).
Dans mon expérience personnelle, je n'ai jamais remarqué la différence de vitesse, donc comme vous je ne pouvais pas trouver quelque chose à l'arrière. Je soupçonne l'avantage de performance est réelle, mais que vous auriez à traiter des millions d'enregistrements avant de pouvoir commencer à mesurer.
Ce que j'ai fait remarquer que fait une différence significative ont été les messages d'erreur. J'ai eu du mal avec un vieux OleDb application, et je l'ai mis à SqlClient en désespoir de cause. Il ne fonctionne toujours pas, bien sûr, mais la meilleure des messages d'erreur suffisamment fourni de nouvelles informations que j'ai pu corriger le problème.
OLEDB est beaucoup plus rapide que la SQLClient, SAUF quand c'est l'accès à travers ADO.NET. Les pilotes pour OLEDB sont écrites en code natif non managé toutefois, lorsque vous accédez à ces pilotes par le biais de ADO.NET, vous devez passer par plusieurs couches (y compris une couche d'abstraction et d'une couche d'interopérabilité COM). La couche d'abstraction s'occupe de la gestion des ressources telles que la gestion de la mémoire poignées pour s'assurer que la collecte des ordures se passe correctement, la modification des types de données et de paramètres .Types de filets et de la conversion de la oledb tampon de ligne et de colonne liaisons. La couche d'interopérabilité COM prend soin de canaliser la transmission de messages à partir .NET COM et vice versa, y compris le verrouillage/déverrouillage/conversion des pointeurs.
De ne pas écouter quelqu'un qui fait de fausses accusations sur OleDB performances sans comprendre comment ils ont été testés et dans quel environnement ils ont utilisé (code managé vs code managé). La seule chose qui ralentit OleDB est le montant de la plomberie qui est nécessaire pour obtenir le code natif pour jouer gentil avec le code managé. Aussi garder à l'esprit que le SqlClient .NET de la bibliothèque dispose de son propre plomberie et n'EST PAS NATIF .NET-library comme la plupart des gens pensent qu'il est. Le SqlClient bibliothèques .NET, le SNINativeMethodWrapper et SNIPacket classes qui sont des wrappers que le maréchal de données entre le code non managé (sqlncli.dll) et gérés .NET code. C'est le sans-papiers, la vérité et la raison de l' .NET SqlClient ne sera jamais en mesure de les effectuer le OleDB lorsque vous utilisez le pilote OleDB dans natif de code non managé.
En résumé, si vous utilisez 100% de code managé, vous obtiendrez de meilleures performances du Système.les données.SqlClient. Si vous disposez d'un environnement mixte, vous permettra d'obtenir des performances bien meilleures en parler à OleDB directement ou sqlncli.dll (SQL2005) ou sqlncli10.dll SQL (2008). Gardez à l'esprit que les deux OleDB et ODBC sont mis à jour par Microsoft et la dernière OleDB pilotes NE parlez-en à la dernière non géré native client SQL bibliothèques. Microsoft recommande d'utiliser OleDB dans les applications non gérées lors de la haute performance est nécessaire.
Voir "SQL Server 2008 Livres en Ligne\Moteur de Base de données\Développement\Guide du Développeur d'\2008 de SQL Server Native Client de Programmation\2008 de SQL Server Native Client (OLE DB)" pour plus d'informations.
Je suis avec Joel, SqlClient est le meilleur à utiliser si vous prévoyez de coller avec SQL Server. Il y a des gains de performance, mais vous devez commencer à travailler avec de grands ensembles, et un nombre élevé de transactions généralement de commencer à voir les avantages de cette.
Dans l'ensemble, les erreurs et les fonctionnalités fournies est beaucoup plus adaptée à ce que SQL Server peut le faire, donc une "meilleure" mise en œuvre si vous voulez. Il a également le soutien de MARS qui, pour certains, il est le "doit faire" basculer.
Voici quelques PowerShell Code pour faire un direct de comparer:
Ole-DB:
SQLClient:
J'ai eu
Et comme un résultat, pour les requêtes ad-hoc de ce type, je préfère Ole-DB, comme je n'ai qu'à ajuster la chaîne de connexion à extraire des données à partir d'une base de données Oracle.
Vous pouvez toujours écrire un exemple d'application avec quelques-unes des principales opérations à l'aide de SqlClient et OleDB et les comparer pour comparer les performances. Je doute que la différence soit significative, mais il n'y a qu'une seule façon de le savoir.
Je ne pense pas que vous avez un problème avec OleDb, sauf si vous êtes avec des types de données comme les données XML dans ce cas, vous pourriez avoir besoin de travailler un peu plus difficile.