SQL Server CE 4.0 performance-Vergleich
SQL Server CE-4 (SQL-Server Compact Edition 4.0) ist nicht news schon (Wenn es ist, könnte man Lesen Sie diesen Artikel)
Aber es ist sehr interessant zu sehen, dass SQL Server CE-4 performance-Vergleich zu anderen Datenbanken.
Insbesondere mit:
- SQLite
- SQL-Server (1)
- SQL Server Express *
- vielleicht Firebird
(1) für Anwendungen, bei denen Funktionalität vergleichbar ist.
Leider gibt es nicht so viel links über das Thema, dass google jetzt. Eigentlich war ich nicht in der Lage, diese zu finden (für korrekte SQL-CE-version).
Könnte man finden oder teilen diese Informationen können Sie sammeln hier für die Zukunft der Menschheit.
Es ist auch noch ein Alter benchmark, bei Desktop-Benchmark Roundup. Es ist mit C# provider für den Zugriff auf SQLite-wenn Sie also mit C direkt ich denke, es wird ein wenig schneller. Wenn Sie Ihre eigenen benchmarks poste bitte die Ergebnisse.
Was ist die Frage?
In der Regel ist die Leistung bezogen auf Ihr design und den code. Die Wahl der Plattform spielt keine Rolle, zu viel. Unterstützung, feature-set, corporate-standard, multi-user oder keine Rolle mehr. SQL CE-sollte nur im Vergleich zu SQLite, die auf dieser Partitur. Wenn Sie möchten, multi-Nutzer, die Sie verwenden würden, SQL Server Express, das gemeinsame und skaliert. Eine zweite @Ash-Maschine: was ist die Frage?
SqlCe hat mir immer viel besser einfügen Geschwindigkeiten immer, wenn im Vergleich zu sqlite.
Was ist die Frage?
In der Regel ist die Leistung bezogen auf Ihr design und den code. Die Wahl der Plattform spielt keine Rolle, zu viel. Unterstützung, feature-set, corporate-standard, multi-user oder keine Rolle mehr. SQL CE-sollte nur im Vergleich zu SQLite, die auf dieser Partitur. Wenn Sie möchten, multi-Nutzer, die Sie verwenden würden, SQL Server Express, das gemeinsame und skaliert. Eine zweite @Ash-Maschine: was ist die Frage?
SqlCe hat mir immer viel besser einfügen Geschwindigkeiten immer, wenn im Vergleich zu sqlite.
InformationsquelleAutor MajesticRa | 2011-03-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meiner Meinung nach, ist es falsch, vergleichen Sie die eingebettete Datenbank (wie SQL CE) vs. server-Seite-relationale Datenbank (wie der ganze rest, außer für SQLite und die Embedded-version von Firebird).
Der wesentliche Unterschied zwischen Ihnen ist, dass die Allzweck-server-side-relationale Datenbanken (wie MS SQL, MySQL, Firebird Classic and SuperServer etc.) installiert sind als Unabhängiger service-und laufen außerhalb der Reichweite Ihres Haupt-Anwendung. Das ist, warum Sie durchführen können viel besser, weil die tatsächliche Unterstützung für multi-core und multi-CPU-Architekturen unter Verwendung der OS-Funktionen wie pre-caching, VSS etc. erhöhen den Durchsatz bei intensivem Datenbank Betrieb und kann behaupten, so viel Speicher wie Ihr Betriebssystem, kann sich für einen einzelnen Dienst/Anwendung. Es bedeutet auch, dass die performance-Indikatoren sind mehr oder weniger unabhängig von Ihrer Anwendung, kann aber weitgehend davon abhängen, Ihre hardware. In dieser Hinsicht würde ich sagen, dass die server-Versionen der Datenbank werden immer mehr Leistung im Vergleich zu den embedded lieben.
SQL CE (zusammen mit Firebird Embedded, SQLite, TurboSQL und einige andere) sind embedded-DB-engines, was bedeutet, dass die komplette Datenbank ist verpackt in einem einzigen (oder maximal 2) DLL-Dateien, die verteilt werden, die zusammen mit Ihrer Anwendung. Aufgrund der offensichtlichen Größe Einschränkungen (möchten Sie vertreiben eine 30-MB-DLL zusammen mit Ihren 2-3 MB lange Anwendung?) Sie auch läuft direkt im Kontext Ihrer Anwendung und die insgesamt Speicher und performance für data access-Operationen werden gemeinsam mit anderen teilen der Anwendung -- das betrifft sowohl die verfügbaren Speicher, CPU-Zeit, Festplatten-Durchsatz etc. Mit einem rechenintensiven threads laufen parallel Ihre Daten zugreifen-thread könnte dazu führen, dramatischen Rückgang der Datenbank-performance.
Aufgrund der unterschiedlichen Einsatzbereiche diese Datenbanken haben unterschiedliche palette von Optionen: server-db bieten umfangreiche Benutzer-und Rechte-management, Unterstützung für die Ansichten und gespeicherten Prozeduren in der Erwägung, dass eingebettete Datenbank, die sich normalerweise keine Unterstützung für Benutzer-und Rechte-management und haben nur begrenzte Unterstützung für die Ansichten und gespeicherte Prozeduren (letztere verlieren die meisten Ihrer Vorteile, die auf der server-Seite). Der Datendurchsatz ist eine übliche Engpässe von RDBMS, server-Versionen sind in der Regel installiert auf Stripeset-RAID-volumes, in der Erwägung, dass embedded-DB sind oft Speicher-orientiert (versuchen zu halten, alle aktuellen Daten im Speicher) und minimieren die Speicherung der Daten Zugriffen.
So, was Sinn machen würde ist wahrscheinlich zu vergleichen verschiedene embedded RDBMS .Net für Ihre performance, wie Sie MS SQL CE 4.0, SQLite, Firebird Embedded, TurboSQL.
ich würde nicht erwarten, dass drastische Unterschiede während der üblichen nicht-peak-Betrieb, in der Erwägung, dass einige Datenbanken möglicherweise bieten eine bessere Unterstützung für große BLOBs, die durch die bessere integration mit OS.-- update --
Ich wieder meine letzten Worte, für meine schnelle Umsetzung zeigt sehr interessante Ergebnisse.
Schrieb ich eine kurze Konsole-Anwendung um test-Daten-Anbietern, hier ist der source-code für Sie, wenn Sie wollen, mit Ihnen zu Experimentieren, auf Ihre eigenen.
Notwendige Haftungsausschluss:
Hier sind die Ergebnisse für zwei verschiedene Proben:
... und ein etwas größeres Beispiel:
So, wie Sie sehen können, jedes schreiben-Operationen (create, update, delete) erfordern fast 1000x mehr Zeit in SQLite im Vergleich zu SQLCE. Es spiegelt nicht unbedingt die Allgemeine schlechte performance der Datenbank und kann mit der folgenden:
Es ist interessant, dass SQLite in der Regel verwendet wird, wie in-memory-db gespeichert und Spülen Sie es relativ selten. Sollte Sie versuchen in Ihren tests dieser Art der Verwendung von SQLite?
Ja, werde ich berücksichtigen verschiedene Modi in der nächsten version. Siehe meine zweite Antwort hier und den Artikel veröffentlichte ich auf der CodeProject Seite. Und danke für die bounty!
Setzen Sie Ihre sqlite-update-code in eine Transaktion ein und es wird schlagen die sqlce-code die Hände nach unten. Dies ist ein bekanntes design-Entscheidung, und nicht, das zu tun, ist unehrlich.
UPDATE: ich habe gerade ein gehen mit diesem source-code und ich finde, dass, wenn Sie tatsächlich läuft die lese-query-as-a
ExecuteReader
Sie werden feststellen, dass SQLite schwerer Leistung Treffer als mit SQL-CE - (ich nehme an, Sie wollen tatsächlich, dass Sie die Ergebnisse Ihrer Abfrage). Dies ist, weilreader[int]
ist implementiert unter Verwendung von P/Invoke.InformationsquelleAutor
Hier ist meine frisch gebackene Artikel über das benchmarking auf CodeProject Webseite:
Das Benchmarking der Leistungsfähigkeit von embedded-DB .Net: SQL CE 4.0 vs. SQLite
(der Artikel hat einen status "ausstehend" jetzt müssen Sie angemeldet sein auf CodeProject, um seinen Inhalt zugreifen)
P. S.: ich habe versehentlich markiert meine Vorherige Antwort als community-wiki-Eintrag und auch nicht mit ansehen. Dies ermutigte mich, den Artikel zu schreiben für Code Projekt zu diesem Thema, mit einer etwas optimierten code, mehr zusätzliche Informationen zu eingebetteten dbs und die statistische Analyse der Ergebnisse. Also, bitte, Stimmen Sie diesem beantworten, wenn Sie gerne die Artikel und meine zweite Antwort hier.
Ich habe gerade einen Blick auf deinen test. Ich habe eine große Klage über ihn. Sie LESEN sich wie ein ExecuteNonQuery. Aber aus meiner begrenzten Erfahrung der größte Aufwand in der SQLite-lese-performance ist, dass jeder
reader[int]
call P/Ruft in SQLite native. Was bedeutet, dass große Anfragen werden extrem langsam.Danke! genau das, was ich suchte
InformationsquelleAutor Alexander Galkin
Weil ich habe eine echte harte Zeit mit Alaudo tests, test-Ergebnisse, und letztlich mit seiner Schlussfolgerung, ich ging voran und spielte ein bisschen mit seinem Programm und kam mit einer modifizierten version.
Er testet jedes der folgenden 10-mal und Ausgänge die durchschnittlichen Zeiten:
Hier ist das Programm (es ist ein Klasse eigentlich):
Hier sind die zahlen, die ich bekomme:
~3 Sekunden für 200-inserts oder-updates mit sqlite könnte noch scheinen ein wenig hoch, aber es ist zumindest vernünftiger als 23 Sekunden. Umgekehrt könnte man besorgt sein, wie SqlCe nimmt sich zu wenig Zeit, um die gleiche 200-inserts oder Updates, vor allem, da es scheint keinen wirklichen Geschwindigkeitsunterschied zwischen jede SQL-Abfrage in einzelnen Transaktionen, oder zusammen in einer Transaktion. Ich weiß nicht genug über SqlCe, dies zu erklären, aber es macht mir sorgen. Würde es bedeuten, dass, wenn .Commit() zurückgibt, sind Sie nicht versichert, dass die änderungen tatsächlich auf den Datenträger geschrieben?
InformationsquelleAutor
Ich habe vor kurzem arbeitete an einem Projekt mit SQL CE 4 und NHibernate und ich fand die Leistung wirklich gut sein. Mit SQL CE 4 wir waren in der Lage zu legen 8000 Datensätze in einer Sekunde. Mit Oracle über das Netzwerk konnten wir nur insert 100 Datensätze pro Sekunde, die auch batch-Größe und seqhilo-Ansätze verwendet wurden.
Habe ich nicht getestet, es aber nach einem Blick auf die performance-Berichte für NoSQL-Produkte für die .NET, SQL CE 4 scheint eine der besten Lösungen für stand-alone-Anwendungen.
Nur vermeiden Sie die Verwendung von Identity-Spalten, bemerkten wir, dass die Leistung war 40-mal besser, wenn Sie nicht verwendet werden. Die gleichen 8000 Einträge wurden unter 40 Sekunden zu legen, wenn Sie eine Identity-Spalte verwendet wurde, als PK.
Super Tipp! Ich arbeite an einem Projekt mit SQL CE 4 und Fluent NHibernate wo wir einen Faktor 30 speedup auf Einsätze durch die Umstellung von Identität auf hilo Primärschlüssel.
Nicht sicher, ob dies möglicherweise Hinweise auf die Identität problem, das hier erwähnt wird, aber es ist ein Fehler bis zu Entity Framework 5, während mit dem Server-IDs erstellt und SQL Server Compact 4.0. Siehe: stackoverflow.com/questions/14768394/...
Ich wusste nicht neu, dass Problem in SQL CE und EF, in jedem Fall, ich habe den oben erwähnten Ansatz mit SQL-Server und Oracle, Wann immer es möglich war, bei der hin-und Rückfahrt in NHibernate, um den neuen Datensatz-id ist ein performance-killer. EF nicht die ID, bis alle änderungen werden übernommen, die für einige Fälle (Dto Schöpfung in tier-apps) könnte ein Schmerz, um das Mindeste zu sagen.
InformationsquelleAutor ealbert