1
0
动态SQL解决方案在大多数方面都是最好的;您正在尝试使用不同数量的联接运行不同的查询,而不需要重写查询来执行不同数量的联接,这在性能方面并不能很好地工作。 当我在大约90年代初做这种事情时,我使用的语言是i4gl,查询是使用其construct语句构建的。这用于生成WHERE子句的一部分,因此(基于用户输入),它生成的筛选条件可能如下所示:
在那些日子里,我们没有现代的加入符号;我将不得不随机应变一点。通常有一个核心表(或一组核心表)始终是查询的一部分;也有一些表是查询的可选部分。在上面的示例中,我假设“c”是主表的别名。代码的工作方式是:
同样的基本技术也应该在这里应用——但是细节上略有不同。 首先,您没有要分析的字符串;从其他情况下,您知道需要向查询中添加哪些表。所以,你仍然需要设计一些东西来组装它们,但是…
注意,您需要对数据库模式和连接条件有一个很好的理解。基本上,这是用编程语言编写的,就像您必须考虑构造查询一样。只要你理解这一点和你的模式,就不会有任何无法克服的问题。 祝你好运。。。 |
2
2
或
或
老实说,除非使用文本,否则没有条件联接这样的构造。 如果它在SQL语句中,它将被评估…所以不要在SQL语句中使用动态SQL或if-else |
3
1
动态SQL解决方案通常是这些情况下最好的解决方案,但是如果您真的需要摆脱这种情况,那么一系列的if语句将在strood门廊中完成这项工作。这是一种痛苦,您必须编写更多的代码,但这将比在语句本身中使join成为条件更快。 |
4
1
我将采用一种简单而直接的方法,如:
编辑:我建议使用一个表变量,而不是临时表,这样程序就不会在每次运行时重新编译。一般来说,三个更简单的插入比一个结合了这三个大型怪物查询的插入更有可能获得更好的执行计划。 然而,我们不能猜测刺激的表现。我们必须通过基准来确定它。然而,更简单的代码块对于可读性和可维护性更好。 |
5
1
试试这个:
我想你会发现这是一个很好的表现,做你需要的。 更新 如果这不能提供我声称的性能,那么这可能是因为我上次使用联接到表来执行此操作。我需要的值可以来自3个表中的一个,基于2列,因此我构建了一个“连接映射”表,如下所示:
然后,
这使我在查询这些表(大多数是几十或数亿行表)时获得了巨大的性能改进。
这就是为什么我问你是否真的得到了改进。当然,它会将一个连接抛出到执行计划中,并分配一些成本,但总的来说,
要做的工作要少得多
而不是一个不加区别地把三张桌子连在一起的计划
如果您发现与动态SQL相比,用这种方式进行连接只需要5%的开销,但是如果不加区分的连接比动态SQL高100%,那么这样做可能是值得的,因为动态SQL的正确性、清晰性和简单性,所有这些都可能比一个小的改进更有价值(取决于您“当然在做。” 成本规模与行数是否也是另一个需要考虑的因素。如果即使有大量的数据,在一个每秒不运行几十次的查询上也只节省了200毫秒的CPU,那么使用它是一件很简单的事情。 我一直在强调这样一个事实,即我认为它的性能会很好,这是因为即使使用哈希匹配,它也没有任何要探测的行,或者也没有任何要创建哈希的行。与使用初始日志的WHERE子句或样式查询相比,哈希操作将提前停止。 |
6
0
因为没有其他人提到这个,这里有一些您可以使用的东西(不是动态的)。如果语法看起来很奇怪,那是因为我在Oracle中测试了它。 基本上,您可以将联接的表转换为具有WHERE子句的子选择,如果条件不匹配,该子句将不返回任何内容。如果条件匹配,则子选择将返回该表的数据。case语句允许您选择在总体选择中返回的列。
|
Duvan · 将逗号(,)替换为点(.)[副本] 2 年前 |
Mateen Bagheri · 选择表的计数并选择其自身 2 年前 |
SoT · SQL Server中求和函数的工作方式 2 年前 |
NKAT · 将列值聚合到列表中会产生错误 2 年前 |
deanpillow · 返回两列中有一个匹配值的记录 2 年前 |
snowflakes74 · 在Dapper中异步查询多个结果 2 年前 |