sql server-sql视图优化



我正在尝试构建一个视图,它基本上可以做两件事,即表1中的记录是否在表2中,以及到另一个表的链接是否仍然存在。它处理了一个子集的数据,但当我尝试运行完整查询时,它在视图设计器中超时了。

该视图运行良好,直到我添加检查以查看是否存在指向另一个表的链接。

最初,它将表A连接到表B,并过滤掉表B 中ID列中不存在A.ID的地方

然后我被告知,如果这个人和地址表(存储在表C中)之间的链接被删除,那么我们将无法知道,只能再次获取该表的完整摘录,看看哪些链接不再存在。我正在尝试使用该检查来确定是否在特定列中显示一些数据

我使用以下结构近60次来选择是否在列中显示信息:

Column1 = case when exists (select LinkID from LinkTable C
          where cast(C.LinkAddressID as varchar) = A.AddressID
            and cast(C.LinkID as varchar) = A.ID)
          then Column1
          else NULL
          end

表A中约有160万条记录,林克表中有400多万条记录。

有没有更好的方法来编写这个查询/视图,并且会得到更好的优化?

请告诉我是否需要更多信息

Select C.LinkID
   From A
   Left Join C On C.LinkAddressID = A.AddressID And C.LinkID = A.ID

如果在这两个条件上存在匹配,这将为您提供C.LinkID;如果两个条件都不满足,则为NULL。

拥有索引/键(如A.ID上的主键)和基于联接子句中内容的外键关系将提供非常好的性能。

正如Joe所建议的,如果对于所有60列,您使用相同的AddressId和Id字段来匹配两个表,我相信您可以使用以下查询

SELECT
    Column1 = CASE WHEN C.LinkID IS NULL THEN NULL ELSE A.Column1 END,
    ....
FROM A
Left Join LinkTable C
    ON C.LinkAddressID = A.AddressID AND C.LinkID = A.ID 

强制转换数据类型肯定会使索引失去优势。因此,如果可能的话,请在联接和WHERE子句

中避免数据类型转换

最新更新