2015-11-29 35 views
0

我有2个表,一个基地表与另一个链接表。使用全球唯一密钥优化联合过滤器

所有密钥在整个数据库中都是唯一的。每个表格都有一列Market来告诉我们每行数据属于哪个市场。我只对特定市场的数据感兴趣(比如说X)

我有这个问题,如果我要加入2个表(我希望了解内连接和左连接(Base_Table LEFT JOIN Link_Table))在两个表上是否有市场过滤器X有助于提高性能?数据明智的,所有我需要的是有我的基地台市场的过滤器,以确保我得到的数据为市场X,但在的情况下,也有我的链接表滤波器影响性能:

  1. 内连接
  2. LEFT JOIN 示例查询:

/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影响性能呢?

不幸的是,我们没有权限查看表上的索引。

编辑: 我刚刚与一位具有更高权限的同事进行了核对,我所采用的“表格”实际上是视图,而且他们似乎没有任何定义的索引。我们无法访问基础表。不过,我确实设法得到2个查询的执行计划,如下所示。希望他们帮助。

基本视图命名为“订单” ,链接视图名为“呼叫” 订单有呼叫ID,因此是指呼叫。这两种观点都有一列,以指示市场

随着这两个表的市场过滤器:在基表 Filter on both tables

市场筛选: Filter on base table

+0

什么是过滤器?发布示例查询。 – Paparazzi

+0

@Frisbee - 将它们添加到问题中。 –

+0

为什么减去'bt.link_column - lt.ID'? – trincot

回答

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到哪里

如果你只有两个表则基表市场表,您可以删除市场表。市场应该只在一张桌子上。