使用全局唯一键优化联接筛选器

时间:2015-11-29 14:37:23

标签: sql sql-server performance join

我有2个表,一个基础表,其中包含对另一个链接表的引用。

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

我的问题是,如果我要加入2个表(我希望了解内部联接和左联接的情况(Base_Table LEFT JOIN Link_Table))确实有一个市场过滤器两个表上的X有助于提高性能?数据方面,我需要的是在我的基表上有一个市场过滤器,以确保我获得Market X的数据,但是在我的链接表上使用过滤器会影响性能:

  1. 内部联接
  2. 左连接 示例查询:
  3. / 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

1 个答案:

答案 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就是市场表,您可以删除市场表。市场应该只在一个表中。