错误的分布式连接计划:结果 table 分片键不匹配

Bad distributed join plan: result table shard keys do not match

我们是 memsql/mysql 的新手,我们正在尝试安装 memsql。

它安装在 CentOS7 虚拟机上,我们是 运行ning 版本 5.1.0 的 MemSQL。

我们正在尝试的查询之一收到错误: 错误 1889 (HY000):错误的分布式连接计划:结果 table 分片键不匹配。请通过 support@memsql.com.

联系 MemSQL 支持

关于我们的一个查询

我们有两个 table:

CREATE TABLE `MyObjects` (
    `Id` INT NOT NULL AUTO_INCREMENT,
    `Name` VARCHAR(128) NOT NULL, 
    `Description` VARCHAR(256) NULL,
    `Boolean` BIT NOT NULL,
    `Int8` TINYINT NOT NULL,
    `Int16` SMALLINT NOT NULL,
    `Int32` MEDIUMINT NOT NULL,
    `Int64` INT NOT NULL,
    `Float` DOUBLE NOT NULL,
    `DateCreated` TIMESTAMP  NOT NULL,

    SHARD KEY (`Id`),
    PRIMARY KEY (`Id`)
);

CREATE TABLE `MyObjectDetails` (
    `MyObjectId` INT,
    `Int32` MEDIUMINT NOT NULL,

    SHARD KEY (`MyObjectId`),
    INDEX (`MyObjectId`)
 );

这里是 SQL 我们正在执行并收到错误。

memsql> SELECT mo.`Id`,mo.`Name`,mo.`Description`,mo.`Boolean`,mo.`Int8`,mo.`Int16`,
mo.`Int32`,mo.`Int64`,mo.`Float`,mo.`DateCreated`,mods.`MyObjectId`,
mods.`Int32` FROM 
    ( SELECT
        mo.`Id`,mo.`Name`,mo.`Description`,mo.`Boolean`,mo.`Int8`,
        mo.`Int16`,mo.`Int32`,mo.`Int64`,mo.`Float`,mo.`DateCreated` 
      FROM `MyObjects` mo LIMIT 10 ) AS mo 
LEFT JOIN `MyObjectDetails` mods ON mo.`Id` = mods.`MyObjectId` ORDER BY `Name` DESC;
ERROR 1889 (HY000): Bad distributed join plan: result table shard keys do not match. Please contact MemSQL support at support@memsql.com.

有谁知道我们为什么会收到此错误,如果有可能的更改我们可以帮助缓解此问题?

我们确实知道的一件事是它与内部 select 有关,就好像我将其拉出并进行连接一样有效,但是我们从连接中总共只得到 10 行。我们正在尝试的是从主要 table 中获取前 10 名,并包括右侧的所有详细信息。

我们还尝试将 MyObjectDetails table 更改为空的 SHARD KEY,但这导致了同样的错误。

SHARD KEY()

我们还在详细信息中添加了一个自动递增的 Id 列 table 并将分片放在该列上,但仍然收到相同的错误。

在此先感谢您的帮助。

更新:

我通过电子邮件联系了 MemSQL(顺便说一句,对他们的客户服务有很大帮助——响应时间非常快,不到几个小时)

但是根据 Mike 的说法,我将 table 更改为 REFERENCE table 并删除了 create table 语句的 SHARD KEY 部分。一旦我这样做了,我就能够 运行 查询。我不是 100% 确定这会产生什么后果,但它解决了我手头的问题。谢谢

CREATE REFERENCE TABLE `MyObjects` (
    `Id` INT NOT NULL AUTO_INCREMENT,
    `Name` VARCHAR(128) NOT NULL, 
    `Description` VARCHAR(256) NULL,
    `Boolean` BIT NOT NULL,
    `Int8` TINYINT NOT NULL,
    `Int16` SMALLINT NOT NULL,
    `Int32` MEDIUMINT NOT NULL,
    `Int64` INT NOT NULL,
    `Float` DOUBLE NOT NULL,
    `DateCreated` TIMESTAMP  NOT NULL,

    PRIMARY KEY (`Id`)
);

感谢 Mike Gallegos 对此进行调查,并在此处添加他的回答摘要:

这里的错误信息很糟糕,但错误的原因是 MemSQL 当前不支持左侧(在本例中为 Limit 子查询)具有 LIMIT 运算符的分布式左连接。如果您无法在加入后重写查询以执行限制,那么您可以将 MyObjects table 更改为引用 table 以解决此问题。