TSQL加入效率

时间:2009-11-03 02:31:08

标签: sql sql-server tsql

我正在开发一个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

3 个答案:

答案 0 :(得分:2)

可能 没有 与您的查询和 所有 进行数据传输。<登记/>

  • 查询在查询分析器中运行的速度有多快?
  • 这与网页相比如何?

如果要恢复整个数据集,可能需要引入分页,比如说每页100条记录。

答案 1 :(得分:2)

我通常建议的第一件事就是 profile 来寻找潜在的索引来帮忙。但是当问题是零星的这样的情况并且正常情况是查询在<1秒内运行时,更可能是由于锁争用而不是缺少索引。这意味着原因是系统中的其他原因导致此查询需要更长时间。也许插入或更新。也许是另一个选择查询 - 您通常会期望花费更长时间的查询,以便在结束时留出额外的时间。

答案 2 :(得分:1)

我会从索引开始,但我有一个第三方应用程序的数据库。创建自己的索引不是一种选择。我读了一篇文章(对不起,找不到引用),当你在查询中有多个表时(不确定幻数是多少),建议将查询分解为表变量或临时表(取决于记录数)。

从dbo.ca_CompanyConnections,dbo.ca_CompanyConnectors,dbo.ca_Connections开始。包括您需要的字段。然后用temp表替换这三个连接表。

不确定是什么问题(想在这里推荐)但似乎当你超过5个表时性能似乎下降。