Sql 使用并集插入行的性能

Sql 使用并集插入行的性能,sql,sql-server,Sql,Sql Server,如何优化下面的查询。您可以看到唯一的区别在于Amount列 INSERT INTO TableA ( Name, Amount, Cityname) (SELECT Name,(Expense *15),CityName FROM TableB B JOIN TableC C ON B.Id = C.FID AND B.Number = E23) UNION (SELECT Name,(Expense *25),CityName FROM TableB B JOIN TableC C ON B

如何优化下面的查询。您可以看到唯一的区别在于Amount列

INSERT INTO TableA
( Name, Amount, Cityname)

(SELECT Name,(Expense *15),CityName
FROM TableB B JOIN TableC C ON B.Id = C.FID AND B.Number = E23)
UNION
(SELECT Name,(Expense *25),CityName
FROM TableB B JOIN TableC C ON B.Id = C.FID AND B.Number = E23)
有更好的方法吗?

你可以做两件事

  • 覆盖指数。Id、编号上的索引表B。FID上的索引表C

  • 团结所有人。如果您不希望有任何需要消除的重复数据,那么UNION ALL的执行速度比UNION快,因为它不需要额外的检查重复数据的工作

  • 你可以做两件事

  • 覆盖指数。Id、编号上的索引表B。FID上的索引表C

  • 团结所有人。如果您不希望有任何需要消除的重复数据,那么UNION ALL的执行速度比UNION快,因为它不需要额外的检查重复数据的工作

  • 我建议:

    INSERT INTO TableA ( Name, Amount, Cityname)
        SELECT Name, (Expense * v.val), CityName
        FROM TableB B JOIN
             TableC C
             ON B.Id = C.FID AND B.Number = E23 CROSS APPLY
             (VALUES (15), (25)) c(val);
    
    这并不完全相同,因为它不会减少重复。但是,我怀疑你真的想这么做

    然后,您需要在
    表B(编号,ID)
    表C(FID)
    上建立索引,我建议:

    INSERT INTO TableA ( Name, Amount, Cityname)
        SELECT Name, (Expense * v.val), CityName
        FROM TableB B JOIN
             TableC C
             ON B.Id = C.FID AND B.Number = E23 CROSS APPLY
             (VALUES (15), (25)) c(val);
    
    这并不完全相同,因为它不会减少重复。但是,我怀疑你真的想这么做

    然后,您需要在
    TableB(Number,ID)
    TableC(FID)
    上建立索引,请尝试此查询--


    你也应该在回答中考虑“TabLaMman”提到的两点。我只是在重复他说的话--

  • 覆盖指数。 Id、编号上的索引表B。 FID上的索引表C
  • 团结所有人。 如果您不希望有任何需要消除的重复数据,那么UNION ALL的执行速度比UNION快,因为它不需要额外的检查重复数据的工作
  • 请尝试此查询--


    你也应该在回答中考虑“TabLaMman”提到的两点。我只是在重复他说的话--

  • 覆盖指数。 Id、编号上的索引表B。 FID上的索引表C
  • 团结所有人。 如果您不希望有任何需要消除的重复数据,那么UNION ALL的执行速度比UNION快,因为它不需要额外的检查重复数据的工作


  • 也许可以提供与之相关的问题的细节。例如,为什么这项工作表现不好?否则,这只是一个代码检查,有更多这样的工会。我刚刚加了2个以使其更小为什么不做多个插入?为什么是联合?您可以使用UNION ALL,因为它在数量上明显不同。是的,您可以使用所需的数据预填充该表,以避免以这种方式生成该表。也许可以提供有关该表问题的详细信息。例如,为什么这项工作表现不好?否则,这只是一个代码检查,有更多这样的工会。我刚刚加了2个以使其更小为什么不做多个插入?为什么是联合?您可以使用UNION ALL,因为它在数量上明显不同。是的,您可以使用所需的数据预填充表,以避免以这种方式生成数据。@Happy为什么需要光标?@Tanner,因为这样查询不会太长?@Happy。使用光标通常是个坏主意。使用光标提高性能就像向后走以更快地到达某个地方。@Happy为什么需要光标?@Tanner因为这样查询不会太长?@Happy。使用光标通常是个坏主意。使用光标提高性能就像向后走以更快地到达某个地方。使用这种类型的查询有什么好处?使用这种类型的查询有什么好处?