gpt4 book ai didi

sql-server - 编码内连接的两种方法哪一种更快?

转载 作者:行者123 更新时间:2023-12-02 16:57:35 25 4
gpt4 key购买 nike

我更喜欢使用实际上是内联联接的 t-sql 代码,而不是在存储过程或 View 末尾有一长串联接。

例如,我编码:

SELECT      PKey  ,    Billable, 
(SELECT LastName FROM Contact.dbo.Contacts WHERE (Pkey = Contacts_PKey)),
(SELECT Description FROM Common.dbo.LMain WHERE (PKey= DType)),
(SELECT TaskName FROM Common.dbo.LTask WHERE (PKey = TaskType)) ,
StartTime, EndTime, SavedTime
FROM dbo.TopicLog where StartTime > '7/9/09' ORDER BY StartTime

而不是

SELECT t.PKey, t.Billable, c.LastName, m.Description, lt.TaskName, t.StartTime, t.EndTime, t.SavedTime
FROM dbo.TopicLog AS t
inner join Contact.dbo.Contacts as c on c.Pkey = t.Contacts_PKey and t.StartTime > '7/9/09'
inner join Common.dbo.LMain as m on m.PKey = t.DType
inner join Common.dbo.LTask as lt on lt.PKey = t.TaskType
ORDER BY t.StartTime

我更喜欢这种类型的语法,因为它在编写或调试时不会那么困惑,特别是当有许多表被连接或其他东西正在进行时(case语句、t-sql函数、自连接等)

但我的问题是 - 通过这种方式查询数据库会影响性能。

我还没有收集到足够的数据来衡量差异,但我会在未来的某个时候进行测量。

在继续下一步之前,我想先了解一下。我不想稍后再回去重新编码所有内容以提高性能。

最佳答案

通常是第二个(实际的内部联接)。第一个(子查询)对每行执行 3 次查询,但这通常由编译器管理,以便减少差异。

最好的:Check the query execution plans为了你自己!

由于您的性能下降,我猜测您的表没有正确索引。您应该在所有主键上拥有聚集索引,并在外键(用于进行联接的索引)上拥有非聚集索引。

我应该注意,当且仅当您在所有连接条件中都有匹配的值时(即始终返回主表中的所有行),这两个查询才是等效的。否则,如果没有匹配项,您将从子查询中得到 null。内连接会主动过滤掉任何不符合连接条件的行。子查询方法实际上相当于左外连接(在结果方面,而不是速度或执行方面)。

关于sql-server - 编码内连接的两种方法哪一种更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1100241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com