SQL Server CE 4.0 comparaison des performances
SQL Server CE 4 (SQL Server Compact Edition 4.0) n'est pas nouvelle déjà (Si elle l'est, vous pourriez lire cet article)
Mais il est très intéressant de voir de SQL Server CE 4 comparaison des performances à d'autres bases de données.
En particulier avec:
- SQLite
- SQL Server (1)
- SQL Server Express *
- peut-être Firebird
(1) pour les applications où la fonctionnalité est comparable.
Malheureusement, il n'y a pas tellement de liens sur le sujet que google propose maintenant. En fait, j'ai été incapable de trouver une (bonne SQL version CE).
Si l'on pouvait trouver ou partager ces informations permet de recueillir ici pour l'avenir de l'humanité.
Il y a aussi un autre ancien indice est Bureau de Référence Roundup. C'est à l'aide de C# fournisseur pour accéder à SQLite donc, si vous êtes à l'aide de C directement, je suppose que ce sera un peu plus rapide. Si vous exécutez vos propres critères d'évaluation, veuillez poster les résultats.
Quelle est la question?
Généralement, le rendement est lié à votre design et le code. Le choix de la plate-forme n'a pas trop d'importance. De prise en charge, un ensemble de fonctionnalités d'entreprise standard, multi-utilisateur, ou pas plus d'importance. SQL CE ne doivent être comparés à SQLite sur ce score. Si vous voulez multi-utilisateur, vous pouvez utiliser SQL Server Express qui est commun et des échelles. Un deuxième @Ash Machine: quelle est la question?
SqlCe m'a toujours donné beaucoup mieux insérer des vitesses toujours comparativement à sqlite.
Quelle est la question?
Généralement, le rendement est lié à votre design et le code. Le choix de la plate-forme n'a pas trop d'importance. De prise en charge, un ensemble de fonctionnalités d'entreprise standard, multi-utilisateur, ou pas plus d'importance. SQL CE ne doivent être comparés à SQLite sur ce score. Si vous voulez multi-utilisateur, vous pouvez utiliser SQL Server Express qui est commun et des échelles. Un deuxième @Ash Machine: quelle est la question?
SqlCe m'a toujours donné beaucoup mieux insérer des vitesses toujours comparativement à sqlite.
OriginalL'auteur MajesticRa | 2011-03-09
Vous devez vous connecter pour publier un commentaire.
À mon avis, il est incorrect de comparer la base de données intégrée (comme SQL CE) versus le côté serveur de base de données relationnelle (comme tout le reste, sauf pour SQLite et Intégré à la version de Firebird).
La principale différence entre eux est que le usage général côté serveur bases de données relationnelles (MS SQL, MySQL, Firebird Classique et SuperServer etc.) sont installé en tant que service indépendant et exécuter en dehors de la portée de votre application principale. C'est pourquoi ils peuvent faire beaucoup mieux en raison de la valeur intrinsèque du support pour le multi-core et multi-architectures des processeurs, en utilisant les fonctionnalités du système d'exploitation comme pré-mise en cache, VSS, etc pour augmenter le débit dans le cas de l'intensif opération de base de données et peut prétendre à autant de mémoire que votre système d'exploitation peut fournir un seul service/de l'application. Cela signifie également que les indicateurs de performance sont plus ou moins indépendants à partir de votre application, mais en grande partie dépendre de votre matériel. À cet égard, je dirais que les versions serveur de base de données sont toujours plus de performances par rapport à ceux intégrés.
SQL CE (avec Firebird Embedded, SQLite, TurboSQL et quelques autres) sont incorporé moteurs de base de données, ce qui signifie que la base de données complète est emballé dans un seul (ou au maximum 2) DLL-fichiers qui sont distribués avec votre application. En raison de l'évidente les limites de la taille (aimeriez-vous avoir à les distribuer à 30 MO DLL avec votre 2 à 3 MO long de l'application?) ils ont également exécuter directement dans le contexte de votre application et le total des de mémoire et de performances pour les opérations d'accès aux données sont partagées avec d'autres parties de votre application -- qui concerne à la fois la mémoire disponible, le temps CPU, le débit du disque etc. Avoir un calcul intensif threads s'exécutant en parallèle avec vos données d'accès thread peut conduire à une diminution spectaculaire de votre base de données de performance.
En raison des différents domaines d'application de ces bases de données sont différentes palette d'options: serveur-db fournir un grand nombre d'utilisateur et de droit, de gestion, de soutien pour les vues et les procédures stockées, alors que la base de données intégrée, normalement, l'absence de toute assistance aux utilisateurs et la gestion des droits, et ont peu de soutien pour les vues et les procédures stockées (ceux-ci perdent la plupart de leurs avantages de la course sur le côté serveur). Le débit de données est une habitude des goulots d'étranglement des SGBD, serveur versions sont généralement installés sur les rayures des volumes RAID, alors que embedded DB sont souvent la mémoire orientée (essayez de garder toutes les données dans la mémoire) et de minimiser le stockage de données, les opérations d'accès.
Donc, ce qui ferait sens est probablement à comparer les différentes intégré SGBDR pour .Net pour leurs performances, comme MS SQL CE 4.0, SQLite, Firebird Embedded, TurboSQL.
je ne m'attends pas à des différences radicales au cours habituel de la période de l'opération, alors que certains de la base de données peut fournir un meilleur support pour les grandes Gouttes grâce à une meilleure intégration avec le système d'exploitation.-- update --
Je dois reprendre mes dernières paroles, pour ma mise en œuvre rapide montre des résultats très intéressants.
J'ai écrit une application console pour tester les deux fournisseurs de données, voici le code source pour vous si vous voulez expérimenter avec eux sur votre propre.
Nécessaire avertissement:
Voici les résultats pour les deux échantillons différents:
... et un échantillon de plus grande taille:
Donc, comme vous pouvez le voir, toute écriture des opérations (create, update, delete) nécessitent presque 1000x plus de temps dans SQLite par rapport à SQLCE. Il ne reflète pas nécessairement le général de mauvaise performance de cette base de données et peut-être pour les raisons suivantes:
Il est intéressant, que SQLite est généralement utilisé que dans la mémoire stockée db et le rincer relativement rarement. Devrait vous essayez dans vos tests sur le mode de l'utilisation de SQLite?
Oui, je vais tenir compte de plusieurs modes dans la prochaine version. Voir ma réponse ici, et l'article que j'ai publié sur le CodeProject site. Et merci pour la générosité!
Mettez votre sqlite code de mise à jour dans une transaction et il va battre la sqlce code des mains vers le bas. C'est un choix de conception et de ne pas le faire, c'est être malhonnête.
Mise à JOUR: je viens d'avoir un aller avec ce code source et je trouve que lorsque l'exécution de la requête en lecture comme un
ExecuteReader
, vous trouverez que SQLite plus lourd de performances qu'avec SQL CE (je suppose que vous voulez réellement les résultats de votre requête). C'est parce quereader[int]
est mis en œuvre à l'aide de P/Invoke.OriginalL'auteur
Voici mon fraîchement cuits article sur l'analyse comparative sur CodeProject page web:
L'analyse comparative de la performance de l'embedded DB pour .Net: SQL CE 4.0 vs SQLite
(l'article a un statut en attente maintenant, vous avez besoin d'être connecté sur CodeProject pour accéder à son contenu)
P. S.: j'ai malencontreusement marqué ma réponse précédente comme un wiki de la communauté d'entrée et de ne pas obtenir de toute la réputation. Cela m'a encouragé à écrire l'article Projet De Code sur ce sujet, avec un peu de code optimisé, plus d'informations sur incorporé dbs et de l'analyse statistique des résultats. Donc, s'il vous plaît, votez cette réponse si vous aimez cet article et ma deuxième réponse ici.
Je viens de prendre un coup d'oeil à votre test. J'ai une grande plainte à ce sujet. Vous exécutez le LIRE comme un ExecuteNonQuery. Cependant, à partir de mon expérience limitée des plus grands généraux dans SQLite de la performance en lecture, c'est que chaque
reader[int]
appel P/Invoque en natif SQLite. Ce qui signifie que les grandes requêtes vont être extrêmement lente.Merci! juste ce que je cherchais
OriginalL'auteur Alexander Galkin
Parce que je vais avoir un réel moment difficile avec Alaudo de tests, les résultats des tests, et finalement de sa conclusion, je suis allé de l'avant et joué un peu avec son programme et est venu avec une version modifiée.
Il teste chacun des éléments suivants, 10 fois et sorties de la moyenne des temps:
Voici le programme (c'est une classe en fait):
Voici les chiffres que j'obtiens:
~3 secondes pour 200 inserts ou des mises à jour à l'aide de sqlite peut encore sembler un peu élevé, mais au moins il est plus raisonnable de 23 secondes. À l'inverse, on peut être inquiet comment SqlCe prend trop peu de temps pour remplir la même 200 inserts ou de mise à jour, surtout depuis qu'il semble y avoir pas de véritable différence de vitesse entre chaque requête SQL dans les transactions individuelles ou regroupées dans une transaction. Je ne sais pas assez sur SqlCe pour expliquer cela, mais cela m'inquiète. Cela voudrait-il dire que lorsque .Commit() renvoie, vous n'êtes pas assuré que les changements sont effectivement écrit sur le disque?
OriginalL'auteur
J'ai récemment travaillé sur un projet à l'aide de SQL CE 4 et NHibernate et j'ai trouvé la performance pour être vraiment bon. Avec SQL CE 4 nous avons été en mesure d'insérer 8000 enregistrements dans une seconde. Avec Oracle sur le réseau, nous n'avons pu insérer 100 enregistrements par seconde, même batch-size et seqhilo approches ont été utilisées.
Je n'ai pas tester, mais en regardant certains des rapports sur l'exécution des NoSQL produits pour .NET, SQL CE 4 semble être l'une des meilleures solutions pour des applications autonomes.
Juste éviter d'utiliser des colonnes d'Identité, nous avons remarqué que le rendement est de 40 fois mieux si ils ne sont pas utilisés. La même 8000 enregistrements ont été 40 secondes pour insérer lorsqu'une colonne d'Identité a été utilisé comme PK.
Bon conseil! Je suis en train de travailler sur un projet avec SQL CE 4 et NHibernate Fluent où nous avons eu un facteur de 30 speedup sur les plaquettes par le passage de l'identité de hilo des clés primaires.
Vous ne savez pas si cela pourrait concerner le problème de l'Identité qui est mentionné ici, mais il y a un bug jusqu'à Entity Framework 5 lors de l'utilisation du Serveur Id générés et SQL Server Compact 4.0. Voir: stackoverflow.com/questions/14768394/...
Je ne savais pas re de problème dans SQL EC et EF, en tout cas, j'ai utilisé l'approche ci-dessus avec SQL Server et Oracle chaque fois que cela était possible à l'aller-retour dans NHibernate pour obtenir le nouveau recordId est une performance killer. EF ne pas fournir l'ID jusqu'à ce que toutes les modifications sont validées qui, pour certains cas (Dto création au niveau des applications) pourrait être une douleur pour dire le moins.
OriginalL'auteur ealbert