使用UNION ALL添加任意元组时的性能损失

时间:2015-06-11 08:50:50

标签: mysql sql

我想在包含1.8M行的SELECT结果中添加一个任意元组。我决定像这样使用UNION运算符:

SELECT 
    id as id
FROM 
    user
UNION
SELECT 
    -1 as id

返回:

+---+
| id|
+---+
| -1|
+---+
| 01|
+---+
| 02|
+---+
|...|
+---+

然而,使用和不使用UNION运算符的查询之间的性能损失是巨大的。我尝试使用这样的UNION ALL语句:

SELECT 
    id as id
FROM 
    user
UNION ALL
SELECT 
    -1 as id

其中 - 我认为 - 可能是导致性能损失的原因,但性能损害仍然存在。

我错过了什么吗?我只想在SELECT结果中添加一个额外的任意元组。

2 个答案:

答案 0 :(得分:2)

使用BEGIN MERGE INTO Listings L USING @CustomSeo AS Tvp ON Listings.ListingID = @CustomSeo.RecordID WHEN MATCHED UPDATE SET L.OriginalSubdivisionName = CASE WHEN L.OriginalSubdivisionName IS NULL THEN L.SubdivisionName ELSE Tvp.Name END END (或UNION)似乎会导致创建临时表。请参阅此bug以供参考。

创建一个1.8M行的临时表可能是导致速度减慢的原因。

在好消息中,5.7.3似乎在某些情况下会改变这种行为。请参阅链接的错误报告中的最后一篇文章。

答案 1 :(得分:0)

尝试使用union all代替unionunion删除重复项:

SELECT id as id
FROM user
UNION ALL
SELECT -1 as id

如果-1可能是有效值 - 并且您只希望它出现一次 - 那么您可以这样做:

SELECT id as id
FROM user
UNION ALL
SELECT u.id
FROM (SELECT -1 as id) u
WHERE NOT EXISTS (SELECT 1 FROM user WHERE user.id = u.id)