【发布时间】:2019-09-04 13:29:57
【问题描述】:
我在 T-SQL 中使用多个联接时遇到了性能问题,如果有人可以帮助我将这些联接转换为子查询,那就太好了。
每当我尝试将连接更改为子查询时,我都会丢失特定表的名称声明。例如,如果我尝试将专辑连接(这是下面代码的第一个连接)转换为子查询,我将失去别名“AS a”并且“a.Title AS Album”停止工作,所以我不知道这是怎么回事会完成的。如果有人给我一个例子,它应该如何适用于其中一种情况,我想我将能够重建所有这些情况。
SQL
SELECT
t.TrackId,
t.[Name] AS Track,
a.Title AS Album,
aa.[Name] AS Artist,
p.[Name] AS Playlist,
m.[Name] AS MediaType,
il.UnitPrice AS InvoicePrice,
CONCAT(c.FirstName, ' ', c.LastName) AS CustomerName,
CONCAT(e.FirstName, ' ', e.LastName) AS ResponsibleEmployeeName
FROM dbo.Track AS t
INNER JOIN dbo.Album AS a
ON t.AlbumId = a.AlbumId
INNER JOIN dbo.Artist AS aa
ON a.ArtistId = aa.ArtistId
INNER JOIN dbo.PlaylistTrack AS plt
ON t.TrackId = plt.TrackId
INNER JOIN dbo.Playlist AS p
ON p.PlaylistId = plt.PlaylistId
INNER JOIN dbo.MediaType AS m
ON t.MediaTypeId = m.MediaTypeId
INNER JOIN dbo.InvoiceLine AS il
ON t.TrackId = il.TrackId
INNER JOIN dbo.Invoice AS i
ON il.InvoiceId = i.InvoiceId
INNER JOIN dbo.Customer AS c
ON i.CustomerId = c.CustomerId
INNER JOIN dbo.Employee AS e
ON c.SupportRepId = e.EmployeeId
WHERE m.[Name] LIKE '%audio%'
ORDER BY t.[Name] ASC
【问题讨论】:
-
那里有很多连接。优化器可能无法找到查询的最佳计划。可以发一张查询计划的图片吗?
-
在子查询中加入连接以获得性能? ..似乎不是一个好主意..
-
m.[Name] LIKE '%audio%'也将成为性能问题。你能在你的表上发布索引吗? -
它很难发布查询计划,因为它真的很大,但索引基本上是我用于连接表的所有主键。为什么 '%audio%' 会降低性能?
-
@S.Minchev 将
like与以通配符开头的模式一起使用,例如%,禁止使用索引查找来定位匹配的行。这就像要求您在字典中查找所有包含“arf”的单词,但您不知道单词的开头是什么。唯一的方法是执行 scan 而不是 seek。提示:请参阅paste the plan 了解向您的问题添加执行计划的方法。
标签: sql sql-server tsql join subquery