gpt4 book ai didi

sql - 影响连接的 where 子句

转载 作者:行者123 更新时间:2023-12-04 20:51:32 25 4
gpt4 key购买 nike

愚蠢的提问时间。甲骨文 10g。

where 子句是否可能影响连接?

我有以下形式的查询:

select * from
(select product, product_name from products p
join product_serial ps on product.id = ps.id
join product_data pd on pd.product_value = to_number(p.product_value)) product_result
where product_name like '%prototype%';

显然,这是一个人为的例子。没有真正需要显示表结构,因为它都是虚构的。不幸的是,我无法显示真实的表结构或查询。在这种情况下, p.product_value 是一个 VARCHAR2 字段,它在某些行中存储了一个 ID 而不是文本。 (是的,糟糕的设计 - 但我继承了并且无法改变的东西)

问题在于加入。如果我省略 where 子句,则查询有效并返回行。但是,如果我添加 where 子句,我会在 pd.product_value = to_number(p.product_value) 连接条件上收到“无效数字”错误。

显然,“无效数字”错误发生在连接 p.product_value 字段中包含非数字的行时。但是,我的问题是如何选择这些行?如果在没有外部 where 子句的情况下连接成功,那么外部 where 子句不应该只从连接结果中选择行吗?看起来发生的事情是 where 子句正在影响连接的行,尽管连接是在内部查询中。

我的问题有意义吗?

最佳答案

它会影响生成的计划。

表连接(以及过滤)的实际顺序不是由您编写查询的顺序决定的,而是由表的统计信息决定的。

在一个版本中,同时生成的计划意味着“坏”行永远不会得到处理;因为前面的连接将结果集过滤到它们从未连接过的点。
WHERE的介绍子句意味着 ORACLE 现在认为不同的连接顺序更好(因为按产品名称过滤需要特定索引,或者因为它缩小了很多数据等)。

这个新顺序意味着“坏”行在过滤掉它们的连接之前得到处理。

我会努力在查询之前清理数据。可能通过创建一个派生列,其中值已经被转换为一个数字,或者如果不可能这样做,则将其保留为 NULL。

您还可以使用 EXPLAIN PLAN 查看从您的查询中生成的不同计划。

关于sql - 影响连接的 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com