Questions tagged «union»

1
如何防止UNPIVOT转换为UNION ALL?
我有一个稍微复杂的Oracle查询,大约需要半个小时才能完成。如果我执行查询的慢速部分并单独运行它,它将在几秒钟内完成。这是隔离查询的SQL Monitor报告的屏幕截图: 作为完整查询的一部分运行时,这是相同的逻辑: 颜色与两个屏幕截图中的相同表格相对应。对于慢速查询,Oracle MERGE JOIN在的两个表中没有相等条件的表之间执行JOIN。结果,不必要地处理了大约1.5亿个中间行。 我可以通过查询提示或重写来解决此问题,但我想尽可能多地了解根本原因,以便将来避免该问题并可能向Oracle提交错误报告。每次我得到错误的计划UNPIVOT时,查询文本中的内容都会转换为UNION ALL计划中的一个。为了进一步调查,我想阻止查询转换的发生。我无法找到此转换的名称。我也无法找到阻止它的查询提示或下划线参数。我正在开发服务器上进行测试,因此一切正常。 有什么我可以做,以防止的查询转换UNPIVOT到UNION ALL?我使用的是Oracle 12.1.0.2。 由于IP原因,我无法共享查询,表名或数据。我无法提出一个简单的复制品。话虽如此,我仍不清楚为什么需要这些信息来回答这个问题。这是UNPIVOT查询以及与UNION ALL相同的查询的示例。

3
级联物理操作:是否保证执行顺序?
在标准SQL中,union all不能保证a的结果以任何顺序排列。因此,类似: select 'A' as c union all select 'B' 可以按任何顺序返回两行(尽管实际上,在我所知道的任何数据库上,“ A”都将排在“ B”之后)。 在SQL Server中,这变成使用“串联”物理操作的执行计划。 我很容易想到,连接操作将扫描其输入,并返回具有可用记录的任何输入。但是,我在网上(此处)找到了以下声明: 查询处理器将按照操作员出现在计划中的顺序执行该计划,第一个是最上一个,最后一个是最后一个。 问题:实际上是这样吗?这保证是真的吗? 我没有在Microsoft文档中找到任何参考,从头到尾按顺序扫描输入。另一方面,每当我尝试运行它时,结果表明实际上确实按顺序处理了输入。 有没有一种方法可以让引擎一次处理多个输入?我的测试(使用比常量更复杂的表达式)是在启用了并行的8核计算机上进行的,大多数查询的确利用了并行性。

2
将整数强制转换为上限(十进制)的问题
我有这种情况,看起来MySQL正在采用最大的十进制值,并尝试将其他值转换为该值。 问题是此查询是由外部库生成的,因此至少在此级别上我无法控制此代码。您知道如何解决此问题吗? SELECT 20 AS x UNION SELECT null UNION SELECT 2.2; +------+ | x | +------+ | 9.9 | -- why from 20 to 9.9 | NULL | | 2.2 | +------+ 预期结果 +------+ | x | +------+ | 20 | -- or 20.0, doesn't matter really in my …

1
MySQL:在内部查询中使用“ ORDER BY”优化UNION
我只是建立了一个由多个具有相同布局的表组成的日志系统。 每个数据源都有一个表。 对于日志查看器,我想 UNION所有日志表, 通过帐户过滤它们, 添加一个伪列以标识源, 按照时间排序他们, 并限制它们的分页。 所有表都包含一个称为zeitpunkt索引日期/时间列的字段。 我的第一次尝试是: (SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt AS zeit, 'hp' AS source FROM is_log AS l WHERE l.account_id = 730) UNION (SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt, 'ig' AS source FROM ig_is_log AS l WHERE l.account_id = 730) ORDER …

2
生成差异的最有效方法
我在SQL Server中有一张表,看起来像这样: Id |Version |Name |date |fieldA |fieldB ..|fieldZ 1 |1 |Foo |20120101|23 | ..|25334123 2 |2 |Foo |20120101|23 |NULL ..|NULL 3 |2 |Bar |20120303|24 |123......|NULL 4 |2 |Bee |20120303|34 |-34......|NULL 我正在研究要比较的存储过程,该过程需要输入数据和版本号。输入数据具有“名称”更新字段Z中的列。预期大多数字段列为NULL,即,每行通常仅具有前几个字段的数据,其余的均为NULL。名称,日期和版本对表构成唯一约束。 对于给定的版本,我需要针对该表比较输入的数据。每行都需要进行区分-通过名称,日期和版本来标识一行,并且字段列中任何值的任何更改都需要在差异中显示。 更新:所有字段都不必为十进制类型。其中一些可能是nvarchars。我希望diff在不转换类型的情况下发生,尽管diff输出可以将所有内容转换为nvarchar,因为它仅用于显示目的。 假设输入为以下,并且请求的版本为2: Name |date |fieldA |fieldB|..|fieldZ Foo |20120101|25 |NULL |.. |NULL Foo |20120102|26 |27 |.. |NULL Bar …

2
如何使联合视图更有效地执行?
我有一个大表(上千万个记录),出于性能原因,我们将其拆分为活动表和存档表,使用直接字段映射,并每晚运行一个存档过程。 在代码的几个地方,我们需要运行结合了活动表和归档表的查询,这些查询几乎总是被一个或多个字段过滤(我们显然已经在两个表中都添加了索引)。为了方便起见,有如下视图是有意义的: create view vMyTable_Combined as select * from MyTable_Active union all select * from MyTable_Archive 但是如果我运行类似的查询 select * from vMyTable_Combined where IndexedField = @val 在使用过滤之前,它将对Active和Store中的所有内容进行合并@val,这会降低性能。 是否有任何巧妙的方法可以使并集的两个子查询@val在创建并集之前查看每个过滤器? 或者,也许您会建议采用其他方法来实现我的目标,即一种简单有效的方法来获取由索引字段过滤的联合记录集? 编辑:这是执行计划(您将在这里看到实际的表名): 奇怪的是,活动表实际上使用了正确的索引(加上RID查找?),但是归档表正在执行表扫描!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.