优化SQL插入

时间:2018-10-30 21:07:52

标签: sql-server tsql optimization

我目前正在优化大型表上相当长的代码段,并且有一个一般性的问题可以帮助我更好地理解SQL优化。我要完成的工作如下。

假设表A具有以下列:

X int, Y int, Z int

其中X是非唯一的,即许多X = x的行,每个Y都是唯一的。

表B有这些列

I int, J int, K int

然后

I = X if Z IN (1,3)
J = Y if Z IN (1,3)
K = 0 if y = Y is the smallest y for a given X
K = 1 if y = Y is the largest y for a given X
K IS NULL otherwise

例如,假设我们有表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范例提示吗?

1 个答案:

答案 0 :(得分:1)

以下内容并未进行优化,但是将“要求”直接翻译成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 );