2015-04-23 12 views
6

Ich habe versucht, dieses Beispiel so einfach wie möglich zu reproduzieren. Ich habe eine Tabelle in MS Access mit etwa 425.000 Zeilen. Wenn ich die folgende Abfrage ausführen erneut die Tabelle es etwa 10 Sekunden dauert auszuführen:Warum ist Select * Faster als Select Top 1 in einem Microsoft Access DB

SELECT TOP 1 BlockID FROM AvailabilityBlocks ORDER BY BlockID; 

Das „BLOCKID“ Feld der Primärschlüssel ist und indiziert ist.

Aber wenn ich die folgende Abfrage ausführen es in weniger als 2 Sekunden zurück:

SELECT BlockID FROM AvailabilityBlocks ORDER BY BlockID; 

Ich habe versucht, den Index wieder aufzubauen, hat sogar eine kompakte und Reparatur und weder einen Unterschied gemacht.

Jede Hilfe oder Einblick würde sehr geschätzt werden!

+1

Randnotiz, warum tun Sie so viele Daten in Access haben Sie Ärger bringen für Ärger alle Daten jederzeit beim Zugang –

+2

mit bittet ...

+2

Ihr Titel sagt '* SELECT' aber Sie tun 'Select BlockID' . Wenn Sie nicht nur eine Spalte haben, sind diese nicht dasselbe (nicht, dass es für diese Frage wichtig wäre). –

Antwort

1

Wenn Sie Ihre Experimente erweitern, werden Sie ein solches Verhalten von MS-Access mehr sehen.

Die Beobachtung wird hier in einer MS-Access-Datenbank von 4 Millionen Zeilen reproduziert, die verwendet wird, um einen CSV-Import zu einem SQL-Server zu transportieren.

Wenn Sie alle nicht indizierten Felder mit einer Sortierreihenfolge auswählen, dauert die Ausführung von MS-Access 3 Minuten. Wenn Sie ein indiziertes Feld auswählen, dauert es Sekundenbruchteile. Wenn TOP 1 des indizierten Feldes ausgewählt wird, dauert es erneut 3 Minuten, was beweist, dass die Funktion den verfügbaren Index nicht verwendet. Der Cheat (SELECT TOP 1 BLOCKID FROM (SELECT BlockID FROM AvailabilityBlocks ORDER BY BlockID) benutzt den Index ebenfalls nicht und benötigt ebenfalls 3 Minuten.

Meine Erklärung ist, dass MS-Access native "Jet-Engine" -Funktionalität hat, die für einige Verwendung akzeptabel ist (ich benutze immer noch MS-Access auf einigen leichten Websites). Die "Jet-Engine" unterstützt alle Funktionen des visuellen Abfragedesign-Bildschirms. Ab Office 2007 wurde eine weitere Funktionalitätsebene hinzugefügt, um die SQL-Sprache mit T-SQL kompatibel zu machen.

Die Anweisung 'TOP 1' ist eine dieser 'neuen' Funktionen. Wie Sie sehen können, wird es im visuellen Design nicht unterstützt. Es ist klar, dass diese Funktion nicht erstellt wird, um den vorhandenen Index zu verwenden.

Sie können Ihren Code Düsentriebwerk Funktionalität begrenzen in 'options for Access'-> 'Design for objects' -> 'Query design' -> 'Compatibility with SQL server (ANSI 92).'

Eine weitere Möglichkeit, Ihre Investitionen in MS-Access zu schützen, ist, die Daten zu einer ODBC-Datenbank (MySQL, SQL-Server, Oracle ...) zu migrieren und benutze MS-Access nur als Frontend. Die Ansicht mit "Top 1" kann dann von einer optimierten Engine gerendert werden.

+0

Sehr aufschlussreiche Antwort. Vielen Dank! – Mmm