Sql server 优化sql插入

Sql server 优化sql插入,sql-server,tsql,optimization,Sql Server,Tsql,Optimization,我目前正在一个大表上优化一段相当长的代码片段,有一个一般性问题可以帮助我更好地理解SQL优化。我要做的事情如下 假设表A有以下列: X int, Y int, Z int 其中X是非不同的,即X=X的许多行,每个Y是不同的 表B有这些列 I int, J int, K int 然后 例如,假设我们有表A X Y Z 1 5 1 1 2 3 1 3 3 2 6 1 2 7 3 3 8 1 3 9 2 3 10 1 3 11 3 那么经过这个过程之后,B应该是这样的 I J K 1 2 0 1

我目前正在一个大表上优化一段相当长的代码片段,有一个一般性问题可以帮助我更好地理解SQL优化。我要做的事情如下

假设表A有以下列:

X int, Y int, Z int
其中X是非不同的,即X=X的许多行,每个Y是不同的

表B有这些列

I int, J int, K int
然后

例如,假设我们有表A

X Y Z
1 5 1
1 2 3
1 3 3
2 6 1
2 7 3
3 8 1
3 9 2
3 10 1
3 11 3
那么经过这个过程之后,B应该是这样的

I J K
1 2 0
1 3 NULL
1 5 1
2 6 0
2 7 1
3 8 1
3 10 NULL
3 11 1
目前,我直接将A插入B,修剪Z!=1或Z=3.然后更新表B两次,首先查找K应为0的实例,然后查找K应为1的实例。在我看来,在最初的插入中完成这一切应该是可能的,而且更为理想。作为一名长期的Java程序员,我倾向于思考如何通过行循环使生活变得更加轻松,因此我的主要问题是

解决这个问题的最佳方法是什么


当我倾向于通过行循环来完成给定任务时,是否有人有任何T-SQL范例提示可以做什么?

以下不是优化的,而是将需求直接转换为select语句

请注意,以可消费的形式提供样本数据将使我们更容易帮助您

-- Sample data.
declare @A as Table ( X Int, Y Int, Z Int );
insert into @A ( X, Y, Z ) values
  ( 1, 5, 1 ), ( 1, 2, 3 ), ( 1, 3, 3 ), ( 2 ,6, 1 ), ( 2, 7, 3 ),
  ( 3, 8, 1 ), ( 3, 9, 2 ), ( 3, 10, 1 ), ( 3, 11, 3 );
select * from @A;

-- Generate the results.    
select
  -- Columns   I   and   J   don't require any effort since the   where   clause
  --   eliminates any rows where   Z   isn't 1 or 3.
  I = X,
  J = Y,
  -- Brute force the rules for   K .
  --   This is where optimization can occur by getting the   Min   and   Max
  --   value of   Y   for each value of   X   only once.
  K = case
    when Y = ( select Min( IA.Y ) from @A as IA where IA.X = A.X ) then 0
    when Y = ( select Max( IA.Y ) from @A as IA where IA.X = A.X ) then 1
    else NULL end
  from @A as A
  where Z in ( 1, 3 );

示例数据和期望的结果将真正有助于理解您想要做的事情。@GordonLinoff添加了一个表循环的示例集,它正是为了获得最佳性能而摆脱的心态。您可以在一条update语句中做任何您想做的事情,但这很难说。如果规则仅限于同一行中的列,则很容易。若规则依赖于不同的行,那个就有点棘手了。我是一个试图学习LINQ的SQL程序员,所以我用另一种方式回来。如果Z在1,3中,I=X?不清楚这些表是如何连接的。
-- Sample data.
declare @A as Table ( X Int, Y Int, Z Int );
insert into @A ( X, Y, Z ) values
  ( 1, 5, 1 ), ( 1, 2, 3 ), ( 1, 3, 3 ), ( 2 ,6, 1 ), ( 2, 7, 3 ),
  ( 3, 8, 1 ), ( 3, 9, 2 ), ( 3, 10, 1 ), ( 3, 11, 3 );
select * from @A;

-- Generate the results.    
select
  -- Columns   I   and   J   don't require any effort since the   where   clause
  --   eliminates any rows where   Z   isn't 1 or 3.
  I = X,
  J = Y,
  -- Brute force the rules for   K .
  --   This is where optimization can occur by getting the   Min   and   Max
  --   value of   Y   for each value of   X   only once.
  K = case
    when Y = ( select Min( IA.Y ) from @A as IA where IA.X = A.X ) then 0
    when Y = ( select Max( IA.Y ) from @A as IA where IA.X = A.X ) then 1
    else NULL end
  from @A as A
  where Z in ( 1, 3 );