SQL Query 需要优化
Posted
技术标签:
【中文标题】SQL Query 需要优化【英文标题】:SQL Query needs to be optimized 【发布时间】:2013-07-24 18:21:21 【问题描述】:Table1
column1 || column1Name
=======================
udf1 || Name1
udf2 || Name2
Table2
column1 || udf1 || udf2
================
key1 || value1 || value2
要求是编写查询以根据与value1传递的Name1来查找key1。 我可以使用动态 sql 编写它,但在大型记录集的情况下它的性能太低。请建议写sql查询的乐观方式。
【问题讨论】:
我们应该优化什么查询?你用的是什么关系型数据库? 这不是关于查询优化......它是关于为规范化表编写查询的最佳方法是什么......数据库是 sql server 2008 您是否仅限于将其编写为动态 SQL? 不......这一切都是为了选择最佳解决方案,在大量数据的情况下提供更好的性能。 在给定特定输入的情况下,至少给出一个预期输出的示例。 【参考方案1】:虽然一开始是一个糟糕的例子,但随着您发布更多问题,您会及时到达那里。拥有更真实的数据(良好的开端)并显示预期输出也是一件好事,而不是基于评论。
无论如何,我不知道有多少“udf”(推断是用户定义的字段),并且我会在每列上都有自己的索引。我正在运行从Table1(别名t1)开始的查询,并根据table1中的值根据每个相应的“udf”列多次加入table2 ...此外,每个左连接也将'value1'应用为这就是你要找的。 'value1' 可能存在于任何可能的 table2 别名连接中。
WHERE 子句特定于您要查找的“名称”,UDF1 和 2 表的以下 AND NOT(为 null / 为 null )意味着我只希望在任一别名实例中返回一条记录是否有匹配项...如果没有,请忽略记录。
最后,通过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 来做。
【讨论】:
以上是关于SQL Query 需要优化的主要内容,如果未能解决你的问题,请参考以下文章
Presto系列 | 五Tuning Presto SQL Query