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

优化 Sql Query 去掉 SELECT 子句并使用 JOIN

MySQL如何定位并优化慢查询sql

Flink SQL Query 语法(一)

mysqk优化概述

WP_Query 需要 3-4 秒执行,优化建议?