SQL Query需要进行优化

时间:2013-07-24 18:21:21

标签: sql

Table1
column1 || column1Name
=======================
udf1    || Name1
udf2    || Name2


Table2
column1 || udf1   || udf2
================
key1    || value1 || value2

要求是编写查询以在使用value1传递的Name1的基础上查找key1。 我能够使用动态sql编写它,但是在大记录集的情况下它的性能太低了。请建议用乐观的方式编写sql查询。

1 个答案:

答案 0 :(得分:0)

虽然这是一个糟糕的例子,但是当你发布更多问题时,你会及时到达那里。拥有更现实的数据(良好的开端)并显示期望输出也是好事而不是基于评论。

无论如何,我不知道有多少“udf”(推断是用户定义的字段),我会在每个列上有一个索引。我正在运行以Table1(别名t1)开头的查询,并根据table1的值,根据每个相应的“udf”列多次连接到table2 ... IN ADDITION,每个left-join也将'value1'应用为这就是你要找的东西。 “value1”可能存在于任何可能的table2别名连接中。

WHERE子句特定于您要查找的'name',以及UDF1&的以下AND NOT(为null /为null)。 2表意味着我只想要一个别名实例中的任何一个具有匹配项而返回一条记录...如果没有,则忽略该记录。

最后,通过COALESCE()的字段选择,我知道两个viaUDF别名中的一个将匹配,因此首先通过UDF1抓取Column1 ...如果为null,则从viaUDF2抓取Column1

SELECT
      coalesce( viaUDF1.Column1, viaUDF2.Column1 ) as ReturnedKey
   from
      Table1 T1
      left join Table2 viaUDF1
         ON T1.Column1 = viaUDF1.udf1
         AND viaUDF1.udf1 = 'value1'
      left join Table2 viaUDF2
         ON T1.Column1 = viaUDF2.udf2
         AND viaUDF2.udf2 = 'value1'
   where
          T1.Column1Name = 'Name1'
      AND NOT (    viaUDF1.udf1 IS NULL 
                OR viaUDF2.udf2 IS NULL )

现在,如果你有10个以上的UDF列,那么所有的赌注都是关闭性能的,你必须以类似的方式左键连接到每个实例,因为你不能基于查询内联到表中(我没见过的,没有通过Dynamic-SQL做到这一点。