【问题标题】:Optimizing join filters with Globally unique keys使用全局唯一键优化连接过滤器
【发布时间】:2015-11-29 14:37:23
【问题描述】:

我有 2 个表,一个 Base 表引用了另一个 Link 表。

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

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

  1. 内连接
  2. 左连接 示例查询:

/内连接/

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

/左连接/

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 个查询的执行计划,如下所示。希望他们有所帮助。

基础视图被命名为“订单” 并且链接视图被命名为“调用” Order 有 call id,所以指的是 call。两个视图都有一个指示市场的列

在两个表上使用市场过滤器: Filter on both tables

基表上的市场过滤器: Filter on base table

【问题讨论】:

  • 什么是过滤器?发布示例查询。
  • @Frisbee - 将它们添加到问题中。
  • 为什么bt.link_column - lt.ID 中的减号?
  • 如果没有架构信息,这是无法回答的。所有可能的 3 个变体在性能方面可以按任意顺序排列。

标签: sql sql-server performance join


【解决方案1】:

如果您无法查看索引,那么您可能无法查看查询计划。

这将取决于。如果 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2016-10-28
    • 2014-09-20
    • 2013-09-25
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多