2017-08-02 2 views
0

Environment:MariaDB Columns LAST_INSERT_ID() alternative

OS: CentOS 7,2

DB-Server: 10.1.23-MariaDB Columns 1.0.9-1

2 Testdatenbanken, eine InnoDB und ein Columns:

CREATE TABLE `test_innodb` (
    `ctlid` bigint(20) NOT NULL AUTO_INCREMENT, 
    `rfid` varchar(100) DEFAULT NULL, 
    PRIMARY KEY (`ctlid`) 
) ENGINE=InnoDB 

CREATE TABLE `test_cs` (
    `ctlid` bigint(20) DEFAULT NULL COMMENT 'autoincrement=1', 
    `rfid` varchar(100) DEFAULT NULL 
) ENGINE=Columnstore 

Das Problem:

Ich betreiben mehrere Einsätze in die InnoDB-Tabelle:

insert into test_innodb (rfid) values ('a1'); 
... 
insert into test_innodb (rfid) values ('aX'); 

Wenn ich will die letzte Eingabe id ich diese laufen bekommen:

select last_insert_id(); 

und das Ergebnis richtig den letzten ctlid Wert zeigt, der hat während der aktuellen Sitzung eingefügt wurde, unabhängig davon, ob andere gleichzeitige Sitzungen vorhanden sind, die Einfügungen in diese InnoDB-Tabelle ausführen und die Erstellung zusätzlicher ctll-Werte auslösen. So weit so gut ..

Jetzt führe ich mehrere Einsätze in die Columns Tabelle:

insert into test_cs (rfid) values ('a1'); 
... 
insert into test_cs (rfid) values ('aX'); 

und ich möchte das gleiche Verhalten wie das oben erreichen, aber leider wird dies durch Columns ignoriert:

select last_insert_id(); 

habe ich folgende Alternativen:

-- this will return the next value 
select nextvalue from calpontsys.syscolumn cs where cs.schema='my_test_database' and cs.tablename='test_cs' and cs.columnname='ctlid'; 

- this will return the last inserted id 
select callastinsertid('test_cs'); 

aber beide Anzeige Eine wichtige Einschränkung: Wenn andere gleichzeitige Sitzungen Einfügungen ausführen, werden die Ergebnisse der beiden obigen Abfragen durch die Autoincrements-Werte beeinflusst, die von diesen Einfügungen generiert werden. Grundsätzlich bekomme ich vielleicht nicht die erwartete letzte eingefügte ID, aber eine größere, falls andere Sessions Autoincrement-Werte parallel erzeugen.

Ich habe auch versucht zu:

  • den Tisch

  • den Einsatz

  • den letzt Einsatz-ID mit select callastinsertid('test_cs')

  • die Tabelle durchführen sperren entsperren danach

Aber es sieht aus wie Sperren Tabellen wird nicht von Columns unterstützt.

Gibt es eine Möglichkeit, eine konsistente zuletzt eingefügte ID (pro Sitzung) mit Columns zu erreichen?

Unser Plan ist, einige unserer Funktionen von MariaDB/MySQL zu Columns wechseln, aber die Begrenzung oben ist ziemlich Blockierung.

+1

Es scheint ein Fehler zu sein. Es hat auch eine offene jira https://jira.mariadb.org/browse/MCOL-780 – Hackerman

+0

Die einzige "Lösung" ist etwas wie 'select ctlid aus test_cs Auftrag von ctlid desc Grenze 1' – Hackerman

+0

Leider gibt es keine Lösung noch. Ich bekomme nur eine klare Antwort auf einem anderen Forum: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!topic/mariadb-columnstore/u9L8YT9lh5c –

Antwort

1

Fügen Sie für das Einfügen mit hoher Geschwindigkeit eine separate Tabelle ein, und kopieren Sie dann regelmäßig die Daten aus dieser Tabelle in die reale Tabelle. Wenn Sie diese zusätzliche Tabelle verwenden, haben Sie eine einfachere Kontrolle über die Normalisierung und andere Dinge, die möglicherweise AUTO_INCREMENT Werte benötigen.

Und achten Sie darauf, die 'Kopie' in einem einzigen Thread, nicht mehrere Threads zu tun.

Hier ist eine Diskussion über viele Details. Einige Anpassungen sind für ColumnStore erforderlich, aber ich denke, es wird für Sie funktionieren. http://mysql.rjweb.org/doc.php/staging_table

Beachten Sie die Verwendung von zwei Ping-Pong-Tabellen. Dies ermöglicht eine kontinuierliche Aufnahme beim parallelen Kopieren in den ColumnStore.

+0

Sieht aus wie dies die einzige praktikable Lösung ist. Nicht perfekt, aber zumindest funktioniert es. –