我想在包含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
结果中添加一个额外的任意元组。
答案 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
代替union
。 union
删除重复项:
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)