我有2个表,一个基础表,其中包含对另一个链接表的引用。
所有密钥在整个数据库中都是唯一的。每个表都有一列Market
,告诉我们每行数据属于哪个市场。我只对特定市场的数据感兴趣(比如说X)
我的问题是,如果我要加入2个表(我希望了解内部联接和左联接的情况(Base_Table LEFT JOIN Link_Table))确实有一个市场过滤器两个表上的X有助于提高性能?数据方面,我需要的是在我的基表上有一个市场过滤器,以确保我获得Market X的数据,但是在我的链接表上使用过滤器会影响性能:
/ INNER JOIN /
SELECT --COLUMNS required--
FROM
<Base Table> bt
JOIN
<Link Table> lt
ON
bt.link_column - lt.ID
WHERE
bt.Market = X
AND
lt.Market = X
/ LEFT JOIN /
SELECT --COLUMNS required>--
FROM
<Base Table> bt
LEFT JOIN
<Link Table> lt
ON
bt.link_column - lt.ID
AND lt.Market = X
WHERE
bt.Market = X
过滤条款lt.Market = X是否会影响性能?
不幸的是,我们没有权限查看表上的索引。
编辑: 我刚刚与一位拥有提升权限的同事核对过,&#34;表&#34;我所采取的实际上是视图,他们似乎没有定义任何索引。我们无法访问基础表。但是我确实设法获得了2个查询的执行计划,如下所示。希望他们能帮忙。
基本视图命名为&#34;订单&#34; 并且链接视图命名为&#34; call&#34; 订单有呼叫ID,因此指的是呼叫。两个视图都有一列表示市场
使用两个表格的市场过滤器: Filter on both tables
基表上的市场过滤器: Filter on base table
答案 0 :(得分:0)
如果您无法查看索引,则可能无法查看查询计划。
这将取决于。如果bt.link_column和lt.ID都被编入索引,那么两者上的Market可能实际上会降低它的速度。您必须查看查询计划。
所有其他等于优化器的人通常会首先处理较小的表,因此将Market放在该表上。
无法保证两个表中的市场相同。你的数据恰好就是这样。在多个表(或列)中重复的数据不是3NF。如果ID与单个市场相关联,那么该关系应该在一个表中。
select *
from <market Table> mt
join <Base Table> bt
on bt.ID = mt.ID
and mt.Market = X
JOIN <Link Table> lt
ON bt.link_column = lt.ID
您可以将mt.Market = X移动到where
如果您只有两个表,那么Base Table就是市场表,您可以删除市场表。市场应该只在一个表中。