我正在开发一个ASP.NET / C#/ SQL应用程序。我已经为特定的网格视图创建了一个查询,该查询涉及大量连接以获取所需的数据。在托管服务器上,查询已随机启动,最多需要20秒才能处理。我确定它部分是一个重载的主机服务器(因为有时查询需要< 1s),但我不认为查询(通过存储过程实际上是一个视图引用)无论如何都是最优的。
我不确定如何提高以下查询的效率: (目前有大约1500个匹配记录到这些连接)
SELECT dbo.ca_Connections.ID,
dbo.ca_Connections.Date,
dbo.ca_Connections.ElectricityID,
dbo.ca_Connections.NaturalGasID,
dbo.ca_Connections.LPGID,
dbo.ca_Connections.EndUserID,
dbo.ca_Addrs.LotNumber,
dbo.ca_Addrs.UnitNumber,
dbo.ca_Addrs.StreetNumber,
dbo.ca_Addrs.Street1,
dbo.ca_Addrs.Street2,
dbo.ca_Addrs.Suburb,
dbo.ca_Addrs.Postcode,
dbo.ca_Addrs.LevelNumber,
dbo.ca_CompanyConnectors.ConnectorID,
dbo.ca_CompanyConnectors.CompanyID,
dbo.ca_Connections.HandOverDate,
dbo.ca_Companies.Name,
dbo.ca_States.State,
CONVERT(nchar, dbo.ca_Connections.Date, 103) AS DateView,
CONVERT(nchar, dbo.ca_Connections.HandOverDate, 103) AS HandOverDateView
FROM dbo.ca_CompanyConnections
INNER JOIN dbo.ca_CompanyConnectors ON dbo.ca_CompanyConnections.CompanyID = dbo.ca_CompanyConnectors.CompanyID
INNER JOIN dbo.ca_Connections ON dbo.ca_CompanyConnections.ConnectionID = dbo.ca_Connections.ID
INNER JOIN dbo.ca_Addrs ON dbo.ca_Connections.AddressID = dbo.ca_Addrs.ID
INNER JOIN dbo.ca_Companies ON dbo.ca_CompanyConnectors.CompanyID = dbo.ca_Companies.ID
INNER JOIN dbo.ca_States ON dbo.ca_Addrs.StateID = dbo.ca_States.ID
答案 0 :(得分:2)
可能 没有 与您的查询和 所有 进行数据传输。<登记/>
如果要恢复整个数据集,可能需要引入分页,比如说每页100条记录。
答案 1 :(得分:2)
我通常建议的第一件事就是 profile 来寻找潜在的索引来帮忙。但是当问题是零星的这样的情况并且正常情况是查询在<1秒内运行时,更可能是由于锁争用而不是缺少索引。这意味着原因是系统中的其他原因导致此查询需要更长时间。也许插入或更新。也许是另一个选择查询 - 您通常会期望花费更长时间的查询,以便在结束时留出额外的时间。
答案 2 :(得分:1)
我会从索引开始,但我有一个第三方应用程序的数据库。创建自己的索引不是一种选择。我读了一篇文章(对不起,找不到引用),当你在查询中有多个表时(不确定幻数是多少),建议将查询分解为表变量或临时表(取决于记录数)。
从dbo.ca_CompanyConnections,dbo.ca_CompanyConnectors,dbo.ca_Connections开始。包括您需要的字段。然后用temp表替换这三个连接表。
不确定是什么问题(想在这里推荐)但似乎当你超过5个表时性能似乎下降。