错误的分布式连接计划:结果 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 以解决此问题。
我们是 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 以解决此问题。