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

Sql 使用全局唯一键优化连接筛选器,sql,sql-server,performance,join,Sql,Sql Server,Performance,Join,我有两个表,一个基表引用另一个链接表 所有密钥在整个数据库中都是唯一的。每个表都有一列Market,告诉我们每行数据属于哪个市场。我只对特定市场的数据感兴趣,比如X 我的问题是,如果我要加入这两个表,我希望了解内部联接和左联接基表左联接链接表的情况。在这两个表上都有一个X的市场过滤器是否有助于提高性能?就数据而言,我所需要的只是在我的基表上有一个市场过滤器,以确保我获得市场X的数据,但在以下情况下,在链接表上有过滤器是否会影响性能: 内连接 左连接 示例查询: /内连接/ /左连接/ 过滤条款l

我有两个表,一个基表引用另一个链接表

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

我的问题是,如果我要加入这两个表,我希望了解内部联接和左联接基表左联接链接表的情况。在这两个表上都有一个X的市场过滤器是否有助于提高性能?就数据而言,我所需要的只是在我的基表上有一个市场过滤器,以确保我获得市场X的数据,但在以下情况下,在链接表上有过滤器是否会影响性能:

内连接 左连接 示例查询: /内连接/

/左连接/

过滤条款lt.Market=X是否会影响性能

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

编辑: 我刚刚与一位拥有提升权限的同事进行了检查,我所讨论的表实际上是视图,它们似乎没有定义任何索引。我们无法访问基础表。但是,我确实成功地获得了两个查询的执行计划,如下所示。希望他们能帮忙

基本视图名为Order 链接视图名为call 订单具有呼叫id,因此引用呼叫。这两种观点都有一个专栏来说明市场

使用两个表上的市场过滤器:

基本表上的市场过滤器:

如果无法查看索引,则可能无法查看查询计划

这要看情况而定。如果bt.link_column和lt.ID都被编入索引,那么这两个网站上的市场行情实际上可能会放缓。您必须查看查询计划

所有其他条件相同时,优化器通常会首先处理较小的表,因此将市场放在该表上

无法保证两个表中的市场是相同的。你的数据正好是这样的。在多个表或列中重复的数据不是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移动到何处


若你们只有两个表,那个么基础表就是市场表,你们可以删除市场表。市场应该只在一个表中

什么是过滤器?发布一个示例查询。@Frisbee-将它们添加到问题中。为什么bt.link_列-lt.ID中有负号?如果没有模式信息,这是不可能回答的。关于性能,所有可能的3种变体都可以按任何顺序排列。
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
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