Was kann bei einer SQL-Abfrage (aggregiert) die Ausführungszeit in diesen drei Datenbanksystemen beschleunigen? Ich bin mir sicher, dass viele Dinge es beschleunigen könnten (Hardware für einen), aber ich bin nur ein unerfahrener DBA, also bin ich sicher, dass ich hier ein paar Antworten bekommen werde. Ich habe ungefähr 157 Millionen Zeilen in eine SQL Server-Datenbank migriert, und diese Abfrage dauert ewig. In meiner Netezza-Quelldatenbank dauert es jedoch Sekunden.
Zum Beispiel:
Netezza 6:
SELECT COUNT(*) FROM DATABASENAME..MYTABLE
Oracle 11g:
SELECT COUNT(*) FROM MYTABLE
SQL Server 2012:
SELECT COUNT(*) FROM DATABASENAME.[dbo].[MYTABLE]
sql-server
query-performance
count
netezza
MacGyver
quelle
quelle
Antworten:
Netezza ist eine Appliance, die sich hervorragend für große Tischscans eignet. Deshalb erzielen Sie mit diesem System so schnelle Ergebnisse.
Für Ihren SQL Server können Sie die Zeilenanzahl erheblich beschleunigen, indem Sie die DMV sys.dm_db_partition_stats abfragen.
In einer Umgebung mit hohen Transaktionen ist nicht garantiert, dass diese DMV 100% genau ist. Aus Ihrer Frage geht jedoch hervor, dass Sie nur Zeilenzählungen durchführen, um jede Tabelle nach Ihrer Migration zu überprüfen. Daher sollte diese Abfrage für Sie funktionieren.
quelle
Hier ist eine SQL Server-Lösung, die
COUNT_BIG
in einer indizierten Ansicht verwendet wird. Auf diese Weise erhalten Sie eine transaktionskonsistente Zählung ohne den Aufwand für große Tabellen- oder Index-Scans und ohne den für letztere erforderlichen Speicherplatz:Dies erfordert einen einzelnen ersten Scan (kein Weg davon weg) und einen zusätzlichen Aufwand für inkrementelle Tabellendatenmanipulationen. Wenn Sie große Operationen mit vielen Daten ausführen (im Gegensatz zu vielen kleinen Operationen), sollte der Aufwand für Änderungen meiner Meinung nach vernachlässigbar sein.
quelle
In Oracle kann ein binärer Baumindex für eine NOT NULL-Spalte verwendet werden, um einen COUNT (*) zu beantworten. In den meisten Fällen ist es schneller als ein FULL TABLE SCAN, da Indizes normalerweise kleiner als ihre Basistabelle sind.
Ein regulärer binärer Baumindex wird jedoch mit 157 Mrows immer noch riesig sein. Wenn Ihre Tabelle nicht gleichzeitig aktualisiert wird (dh nur ein Stapelladevorgang), möchten Sie möglicherweise stattdessen einen Bitmap-Index verwenden.
Der kleinste Bitmap-Index wäre ungefähr so:
Null-Einträge werden von einem Bitmap-Index berücksichtigt. Der resultierende Index ist winzig (20-30 8.000 Blöcke pro Million Zeile), verglichen mit einem regulären Binärbaumindex oder der Basistabelle.
Der resultierende Plan sollte die folgenden Operationen zeigen:
Wenn Ihre Tabelle gleichzeitig aktualisiert wird, ist ein Bitmap-Index mit einem eindeutigen Wert ein Streitpunkt und sollte nicht verwendet werden.
quelle
In Oracle wird eine einfache Zählabfrage häufig ausgeführt, indem ein Index anstelle einer ganzen Tabelle gescannt wird. Der Index muss ein Bitmap-Index sein oder in einer Spalte mit der Einschränkung NOT NULL definiert sein. Für komplexere Abfragen, die einen vollständigen Tabellenscan erfordern, können Sie parallele Abfragen verwenden.
Um die parallele Abfrage zu aktivieren (Enterprise Edition erforderlich), können Sie den Optimierungshinweis verwenden:
Oder aktivieren Sie die parallele Abfrage für alle Abfragen in der Tabelle:
quelle