错误的分布式连接计划:结果表分片键与

时间:2016-09-30 13:32:34

标签: memsql

我们对memsql / mysql很新,我们正在尝试使用memsql安装。

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

我们收到了我们正在尝试的其中一个查询的错误:     ERROR 1889(HY000):错误的分布式连接计划:结果表分片键不匹配。请通过support@memsql.com联系MemSQL支持。

在我们的一个查询

我们有两张桌子:

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.

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

我们知道的一件事是它与内部选择有关,好像我把它拉出来并且它可以连接它,但是我们只从连接中获得10行。我们正在尝试从主表中获得前10名,并包括右侧的所有细节。

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

SHARD KEY()

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

提前感谢您的帮助。

更新

我通过电子邮件联系了MemSQL(顺便提一下他们的客户服务很棒的道具 - 非常快的响应时间,不到几个小时)

但是从Mike所说的我把表改为REFERENCE表并删除了create table语句的SHARD KEY部分。一旦我这样做,我就能运行查询。我不是百分之百确定这会产生什么后果,但它解决了我的问题。感谢

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

1 个答案:

答案 0 :(得分:1)

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

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