Dies ist eine Ausgründungsfrage aus der im Primärschlüssel angegebenen Sortierreihenfolge, die Sortierung wird jedoch bei SELECT ausgeführt .
@Catcall sagt dies zum Thema Speicherreihenfolge (Clustered Index) und Ausgabereihenfolge
Viele Leute glauben, dass ein Clustered-Index eine Sortierreihenfolge bei der Ausgabe garantiert. Aber das ist es nicht; Es garantiert eine Speicherreihenfolge auf der Festplatte. Siehe zum Beispiel diesen Blog-Beitrag .
Ich habe den Blog-Beitrag von Hugo Kornelis gelesen und verstehe, dass ein Index nicht garantiert, dass der SQL-Server die Datensätze in einer bestimmten Reihenfolge liest. Es fällt mir jedoch schwer zu akzeptieren, dass ich dies für mein Szenario nicht annehmen kann?
CREATE TABLE [dbo].[SensorValues](
[DeviceId] [int] NOT NULL,
[SensorId] [int] NOT NULL,
[SensorValue] [int] NOT NULL,
[Date] [int] NOT NULL,
CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED
(
[DeviceId] ASC,
[SensorId] ASC,
[Date] DESC
) WITH (
FILLFACTOR=75,
DATA_COMPRESSION = PAGE,
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [MyPartitioningScheme]([Date])
Meine ursprüngliche Anfrage war folgende:
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
ORDER BY Date DESC
Aber ich schlage vor, dass ich auch dieses verwenden könnte (lesen Sie unten für meine Erklärung):
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
Wie Sie sehen können, sind meine Tabellenzeilen klein (16 Byte) und ich habe nur einen Index, einen Cluster. In meinem Szenario besteht die Tabelle derzeit aus 100.000.000 Datensätzen (und dies wird sich höchstwahrscheinlich verzehnfachen).
Wenn der Datenbankserver diese Tabelle abfragt, hat er zwei Möglichkeiten, meine Zeilen zu finden. Entweder sucht er nach dem Primärschlüssel und liest und gibt meine Werte in desc zurück. Reihenfolge des Datums, oder es muss ein vollständiger Tabellenscan durchgeführt werden. Mein Fazit ist, dass ein vollständiger Tabellenscan für all diese Datensätze viel zu langsam ist und der Datenbankserver daher die Tabelle immer über seinen Primärschlüssel sucht und dabei die nach sortierten Werte zurückgibtDate DESC
ORDER BY
Klausel für mich ein großer Leistungshit ist (lesen Sie die andere Frage für weitere Informationen). Ich habe eine Lösung, die im Moment funktioniert, die jedoch nicht gilt, wenn und wenn mein Datenverkehr zunimmt.
ORDER BY
Klausel in der Abfrage. Dies gilt für SQL Server , Oracle , MySQL und alle anderen denkbaren RDBMS. Versuchen Sie etwas anderes und Sie bereiten sich auf eine Überraschungsschale FAIL vor.
ORDER BY
an, dann weißt du , dass du dich darauf verlassen kannst. Siehe # 3 hier