2016-07-11 12 views
1

ich die folgende Abfrage leite aus einer Tabelle Daten zu schwenken:MySQL Datenbankfehler: Zu viele Spalten

SELECT 
time_stamp, 
SUM(CASE WHEN sensor_id=000001 THEN temp ELSE 0 END) AS 'temp_000001', 
SUM(CASE WHEN sensor_id=000002 THEN temp ELSE 0 END) AS 'temp_000002', 

...

SUM(CASE WHEN sensor_id=003372 THEN temp ELSE 0 END) AS 'temp_003372' 

FROM sensor_data 
GROUP BY time_stamp 

Die Abfrage eine Ergebnismenge mit 3372 Spalten zurückgeben soll und 8928 Zeilen (Anzahl verschiedener time_stamps). Ich bekomme einen "Too many columns" -Fehler, der merkwürdig ist, weil die Abfrage vorher funktioniert hat. sensor_data enthält Messungen von 3372 Sensoren zu 8928 Zeitpunkten. Wenn ich die gleiche Abfrage für eine Tabelle ausführen, die Messungen von 3372 Sensoren zu 288 Zeitpunkten enthält, funktioniert es. Die Anzahl der Spalten kann also nicht wirklich das Problem sein.

Antwort

0

Es scheint, dass Sie auf das Problem der Zeilenlänge der temporären Tabelle stoßen, die zum Berechnen von GROUP BY benötigt wird. Die Anzahl der Spalten hat eine harte Grenze von 4096, die Sie nicht zu erreichen scheinen, aber die Zeilenlänge ist auf 64 KB begrenzt (ohne Blobs). Es gibt eine Reihe von Dingen, können Sie versuchen, um das Problem zu bekommen:

  • ersetzen temp mit cast(temp as signed) oder einem anderen Guss Trick verwenden, um den Ausdruck zu zwingen, von der Art zu sein, die eine möglichst geringe Menge an Speicher erfordert
  • spaltete die Abfrage in eine union von zwei group by abfragt
  • eine temporäre Ergebnistabelle mit time_stamp Spalte manuell erstellen und alle resultierenden Spalten des kleinstmöglichen Speichertyp sein, und füllen sie es manuell insert into ... select ... on duplicate key update ... mit - dann Ihr Ergebnis aus dieser Tabelle lesen - im Wesentlichen eine schlechte-m durchzuführen ein group by mit Ihren eigenen Händen.
  • Ändern Sie den Typ der Temperatur auf das kleinstmögliche, das Ihre Daten zulassen. Sie können eine Empfehlung von MySQL erhalten, indem Sie select temp from sensor_data procedure analyse()
+0

funktioniert immer noch nicht für mich und selbst wenn es tat, fühlt sich das an, als ob ich das falsche Werkzeug für den Job verwende. aber wie sonst würde man große Datensätze so drehen? – salvador

+0

Können Sie die Details veröffentlichen? Was ist die Art von Temp? –

+0

Temperatur ist VARCHAR (50). Angesichts der Tatsache, dass ich nicht das tatsächliche harte Limit von 4096 Spalten treffe, gibt es eine Möglichkeit, die Zeilenlänge von 64k zu erhöhen? Ich bin ein wenig verwirrt darüber, warum ich immer wieder auf diese scheinbar willkürlichen Grenzen stoße. Zu keinem Zeitpunkt sehe ich, dass die Speicherauslastung meiner Maschine ihre Grenzen erreicht. Warum also sollte MySQL diese nicht verwenden? Ich bekomme, dass es eine Spalte Grenze für Tabellen gibt, um eine angemessene Datenbank-Design zu gewährleisten, aber für Abfragen? – salvador

2

Die maximale Anzahl der Spalten in MySQL ist trügerisch.

Es kann 4096 sein (das ist die dokumentierte MAX_FIELDS in der Quelle), aber es kann auch viel niedriger sein, je nach Namen der Spalten!

Die blutigen Details sind hier: Understanding the Maximum Number of Columns in a MySQL Table

Sie auch vor Ihrer Anfrage könnte Arbeit gehabt haben, weil es nicht eine temporäre Tabelle erstellt wurde. Vielleicht wurde die Timestamp-Spalte vorher indiziert und ist es nicht mehr?