Wenn Sie kalt Daten partitionieren entfernt dann ein führender boolean Indexspalte ist eine gültige Art und Weise, das zu tun. Diese Spalte muss zu allen Indizes hinzugefügt werden, die Sie als Warm/Kalt-Partition verwenden möchten. Dies umfasst den gruppierten Index. Das ist ziemlich peinlich. Für den Abfrageoptimierer müssen Sie ein Dummy-Prädikat where IsActive IN (0, 1)
hinzufügen, damit es weiterhin nach solchen Indizes suchen kann. Natürlich wird dies nun auch die kalten Daten berühren. Sie müssen also wahrscheinlich den konkreten Wert von IsActive
kennen oder versuchen Sie zuerst den 1
Wert und stellen Sie sicher, dass es 99% der Zeit entspricht.
Je nach Schema kann dies unpraktisch sein. Ich habe nie einen guten Fall dafür gesehen, aber ich bin mir sicher, dass es existiert.
Eine andere Möglichkeit ist die Partitionierung. Hier wird der Abfrageoptimierer verwendet, um mehrere Partitionen trotzdem zu untersuchen, aber Sie möchten auch nicht, dass er kalte Daten untersucht. Selbst wenn es nichts findet, wird dies Seiten in den Speicher ziehen, was die Partitionierung unmöglich macht.
Die historische Tabelle Idee (z. B. HistoricalOrders
) ist das gleiche in verschiedenen Kleidern.
Also, um diese Arbeit zu machen Sie brauchen:
- alle Indizes ändern, die Sie im Begriff sind (wahrscheinlich alle) oder Partition oder eine History-Tabelle erstellen.
- Haben Sie einen Weg, fast nie die kalte Partition zu untersuchen.
Ich denke, (2) tötet es für die meisten Fälle.
Unter den 3 Lösungen würde ich wahrscheinlich die Indexlösung wählen, weil es am einfachsten ist. Wenn du dir Sorgen machst, dass Leute Fehler machen, indem du ständig schlechte Anfragen schreibst, würde ich mir eine separate Tabelle aussuchen. Das macht Fehler schwierig, macht den Code jedoch ziemlich umständlich.
Beachten Sie, dass viele Indizes bereits natürlich partitioniert sind. Indizes in der Identitätsspalte oder in einer steigenden Datetime-Spalte sind am Ende heiß und an anderer Stelle kalt. Ein Index auf (OrderStatus INT, CreateDateTime datetime2)
hätte einen Hotspot pro Bestellstatus und wäre sonst kalt. So sind diese schon gelöst.
Some further discussion.
können Sie zeigen die Linq-Abfrage im Moment? – Sampath
@Sampath Haven't schrieb es noch nicht, aber für den ersten Ansatz wäre es etwa so: _context.Set() .Wo (o => o.IsActive == true) –