programing

MariaDB 컬럼스토어 LAST_INSERT_ID() 대체

javaba 2023. 1. 29. 20:32
반응형

MariaDB 컬럼스토어 LAST_INSERT_ID() 대체

환경:

OS: CentOS 7.2

DB 서버: 10.1.23-MariaDB Columnstore 1.0.9-1

테스트 데이터베이스 2개, InnoDB 1개 및 Column Store 1개:

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

문제:

InnoDB 테이블에 몇 가지 삽입을 실행합니다.

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

마지막으로 삽입된 ID를 가져오려면 다음을 수행합니다.

select last_insert_id();

InnoDB 테이블에 삽입을 실행하고 추가 ctlid 값 생성을 트리거하는 다른 동시 세션이 있는지 여부에 관계없이 현재 세션 중에 삽입된 마지막 ctlid 값이 올바르게 표시됩니다.아직까지는 괜찮지만..

이제 Columnstore 테이블에 몇 가지 삽입을 수행합니다.

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

위의 동작과 같은 동작을 하고 싶은데 Columnstore는 이를 무시합니다.

select last_insert_id();

다음 대안을 사용했습니다.

-- 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');

그러나 둘 다 주요 제한을 나타냅니다.다른 동시 세션이 삽입을 실행하는 경우 위의 2개의 쿼리의 결과는 이들 삽입에 의해 생성된 자동 증분 값에 영향을 받습니다.기본적으로 마지막으로 삽입된 ID는 예상되지 않지만 다른 세션에서 병렬로 자동 증가 값이 생성된 경우 더 큰 ID를 얻을 수 있습니다.

또, 다음과 같이 시도했습니다.

  • 식탁을 잠그다

  • 인서트를 하다

  • 사용하여 마지막 삽입 ID를 취득하다select callastinsertid('test_cs')

  • 나중에 테이블의 잠금을 해제하다

그러나 Columnstore에서는 잠금 테이블이 지원되지 않는 것 같습니다.

Columnstore와 마지막으로 삽입한 ID(세션당)를 일관되게 유지할 수 있습니까?

우리의 계획은 일부 기능을 MariaDB/MySQL에서 Columnstore로 전환하는 것이지만, 위의 제한은 상당히 제한적입니다.

고속 삽입의 경우 별도의 테이블에 삽입한 후 해당 테이블의 데이터를 실제 테이블로 정기적으로 복사합니다.이 추가 테이블을 사용하면 정규화 및 기타 필요한 사항을 보다 쉽게 제어할 수 있습니다.AUTO_INCREMENT가치.

또한 여러 스레드가 아닌 단일 스레드로 '복사'를 수행해야 합니다.

여기 많은 세부 사항들에 대한 토론이 있습니다.Column Store에는 약간의 적응이 필요하지만, 당신에게는 도움이 될 것이라고 생각합니다.http://mysql.rjweb.org/doc.php/staging_table

2개의 테이블에 ping ping을 사용하는 것에 주의해 주세요.따라서 ColumnStore에 병렬로 복사하는 동안 지속적으로 섭취할 수 있습니다.

언급URL : https://stackoverflow.com/questions/45461572/mariadb-columnstore-last-insert-id-alternative

반응형