Ich habe einen Tisch mit ungefähr 1 Million bis 5 Millionen Datensätzen. Bei einem kleinen Teil dieser Datensätze ist eine Bitspalte auf 'TRUE' gesetzt. Müssen schnell diese Aufzeichnungen finden. Ich denke, dass der Index die Suche in dieser Spalte beschleunigen kann, aber ich habe Angst vor INSERTs. Daher meine Frage.
Die Datenbank funktioniert wie eine Art Data Warehouse, daher gibt es viele SELECTs und kleine (bis zu 10-20 pro Tag), aber ziemlich große INSERTs (bis zu 200.000 Datensätze gleichzeitig). Ich habe Angst vor einer längeren Importzeit in die Datenbank.
sql-server
sql-server-2005
Marioosh
quelle
quelle
Antworten:
Ein Index für ein Bit für 1 Million Datensätze ist nutzlos. Der Optimierer wird es niemals verwenden, Sie zahlen nur für die Wartung. Eine viel bessere Alternative besteht darin, dieses Bit als Schlüssel ganz links im Clustered-Index hinzuzufügen.
Aber ich werde im Dunkeln einen Blindschuss machen und vermuten, dass es sich um ein Warteschlangenmuster handelt: Datensätze werden in der Tabelle abgelegt, wobei das Bit auf 'TRUE' (dh 'needsprocessing = true') gesetzt ist, und dann wird ein Hintergrundprozess angezeigt Führt für diese Datensätze eine Verarbeitung durch und aktualisiert das Bit auf FALSE. Dies ist ein allgegenwärtiges Muster, das auch liebevoll als "Rezeptmuster für Leistungskatastrophen" bezeichnet wird. Ich würde empfehlen, die Datensätze in die Tabelle einzufügen und gleichzeitig eine Benachrichtigung (könnte so einfach wie die neu eingefügte Datensatz-ID sein) in eine Warteschlange zu stellen . Siehe Verwenden von Tabellen als Warteschlangen .
quelle
Wie @MartinSmith sagte, wäre ein gefilterter Index die perfekte Lösung, wenn Sie jemals ein Upgrade auf SQL 2008 durchführen würden. In der Zwischenzeit erhöht jedoch im Allgemeinen JEDER hinzugefügte Index Ihre Ladezeit. Kleine Indizes weniger als große.
Eine Sache, die ich mir ansehen würde, ist, wenn Sie einen vorhandenen Index haben, der geändert werden kann. Angenommen, Ihre vorhandenen Abfragen verwenden einen bestimmten Index, dann sollte das Hinzufügen der Bitspalte am Ende dieses Index nur minimale Auswirkungen auf Einfügungen und den positiven Effekt haben, den Sie auf Ihre Abfragen haben.
Als nächstes sollten Sie sich ansehen: "Habe ich bereits viele Indizes?" Es gibt keine feste Regel, was "viel" ist, aber ich halte mich normalerweise an eine Regel von 10 Indizes, es sei denn, ich brauche WIRKLICH eine neue.
Letzter Gedanke, testen Sie es auf einer Testinstanz. Richten Sie eine Tabelle mit einigen Millionen Zeilen ein, führen Sie Ihre Last darauf aus, fügen Sie Ihren Index hinzu, führen Sie dann Ihre Last erneut aus und prüfen Sie, ob Sie eine signifikante Verlängerung der Ladezeit feststellen.
Nur Sie können wirklich entscheiden, was "bedeutend" ist. Ich habe Maschinen, bei denen das Hinzufügen von 5 Minuten zur Ladezeit "signifikant" ist, und andere, bei denen ich sicher ein paar Stunden mehr sehen konnte.
BEARBEITEN:
Eine andere Möglichkeit besteht darin, Ihre Tabelle zu partitionieren. Möglicherweise müssen Sie eine partitionierte Ansicht verwenden, wenn Sie die Enterprise Edition nicht verwenden. Dies sollte jedoch hilfreich sein. Sie setzen Ihre Bit 0s in eine Partition und Ihre Bit 1s in eine andere. Angenommen, Sie fügen nur die eine oder andere Version ein, dann können Sie Ihre Einfügungen sogar beschleunigen.
quelle