【发布时间】:2015-02-02 21:13:51
【问题描述】:
为什么这两个查询在时间上有这么大的差异?
此查询大约需要 51 秒才能完成:
SELECT TOP 1000 *
FROM [PHONER].[dbo].[V_PhonerSubjects]
WHERE ProjectID = 137;
但是,此查询大约需要 1 秒才能完成:
SELECT TOP 1000 *
FROM [PHONER].[dbo].[V_PhonerSubjects]
WHERE ProjectID = 107;
注意:唯一的区别是键的值。
两者的记录总数均超过 1000 条。项目 107 有 26000 条记录,项目 137 有 4500 条记录。
ProjectID 是索引主键。
我注意到第二个查询在 1 秒内完成并将所有行发送到结果窗口。第一个 Query 大约 3 秒后开始发送行,大约 51 秒后完成。
这是视图V_PhonerSubjects的SQL:
SELECT
dbo.PhonerEmner.PhonerEmID AS SubjectID, dbo.PhonerEmner.FK_ProID AS ProjectID,
dbo.PhonerProjekt.PhonerTitel AS ProjectName, dbo.Medlemsdata.Vennenr AS FriendNo,
dbo.Medlemsdata.OpretteDato AS CreatedDate, dbo.Medlemsdata.OpretteID AS CreatedID,
dbo.Bruger.Intialer AS CreatedBy, dbo.Medlemsdata.ÆndretDato AS ChangedDate,
dbo.Medlemsdata.ÆndretID AS ChangedID,
Bruger_3.Intialer AS ChangedBy,
ISNULL(dbo.Medlemsdata.Organisation, N'') + N' ' + ISNULL(dbo.Medlemsdata.Fornavn, N'') + N' ' + ISNULL(dbo.Medlemsdata.Efternavn, N'') AS Name,
dbo.MedlemsAdresse.AdrID AS AddressID, dbo.MedlemsAdresse.Adresse AS Address1,
dbo.MedlemsAdresse.Adresse2 AS Address2, dbo.MedlemsAdresse.Postnr AS ZIP,
dbo.Postnumre.[By] AS City, dbo.Medlemsdata.CPRnr AS CPRno,
dbo.Medlemsdata.Køn AS Gender, dbo.Medlemsdata.Telefon AS Phone01,
dbo.Medlemsdata.TlfNote1 AS Phone02Type, dbo.Medlemsdata.Tlf1 AS Phone02,
dbo.Medlemsdata.TlfNote2 AS Phone03Type, dbo.Medlemsdata.Tlf2 AS Phone03,
dbo.Medlemsdata.TlfNote3 AS Phone04Type,
dbo.Medlemsdata.Tlf3 AS Phone04, dbo.Medlemsdata.TlfSMS AS PhoneMobile,
dbo.Medlemsdata.[E-mail] AS Email, dbo.Medlemsdata.SPFelt1 AS SPField01,
dbo.Medlemsdata.SPFelt2 AS SPField02, dbo.Medlemsdata.SPFelt3 AS SPField03,
dbo.Medlemsdata.SPFelt4 AS SPField04, dbo.Medlemsdata.SPFelt5 AS SPField05,
dbo.Medlemsdata.SPFelt6 AS SPField06, dbo.Medlemsdata.SPFelt7 AS SPField07,
dbo.Medlemsdata.SPFelt8 AS SPField08, dbo.Medlemsdata.SPFelt9 AS SPField09,
dbo.Medlemsdata.SPFelt10 AS SPField10, dbo.Medlemsdata.SPFelt11 AS SPField11,
dbo.Medlemsdata.SPFelt12 AS SPField12, dbo.Medlemsdata.SPFelt13 AS SPField13,
dbo.Medlemsdata.SPFelt14 AS SPField14, dbo.PhonerEmner.SidsteKontakt AS LastContact,
dbo.PhonerEmner.AntalKontakt AS ContactTimes, dbo.PhonerEmner.KontaktDage AS ContactDays,
dbo.PhonerEmner.KontaktEfter AS ContactAfter,
dbo.PhonerEmner.PhonerIgen AS ContactAfterPhonerID,
Bruger_1.Navn AS ContactAfterPhonerName, dbo.PhonerEmner.PhonerNote,
dbo.PhonerEmner.Stemning AS Mood, dbo.PhonerEmner.Status,
dbo.PhonerEmner.PhonerAft AS LastPhonerID, Bruger_2.Navn AS LastPhonerName,
dbo.PhonerEmner.SlutNote AS EndNote, dbo.PhonerEmner.SlutDato AS EndDate,
dbo.PhonerImport.PhonerImportID AS ImportID, dbo.PhonerImportData.Status AS ImportStatus,
dbo.PhonerImport.ImportFileName, dbo.PhonerImport.ImportTime,
dbo.PhonerProjekt.SvarerIkkeTid
FROM
dbo.Bruger AS Bruger_1
RIGHT OUTER JOIN
dbo.PhonerProjekt
RIGHT OUTER JOIN
dbo.PhonerEmner ON dbo.PhonerProjekt.PhonerProID = dbo.PhonerEmner.FK_ProID
LEFT OUTER JOIN
dbo.PhonerImportData ON dbo.PhonerEmner.PhonerEmID = dbo.PhonerImportData.FK_PhonerEmID
LEFT OUTER JOIN
dbo.Bruger AS Bruger_2 ON dbo.PhonerEmner.PhonerAft = Bruger_2.BrugerID ON Bruger_1.BrugerID = dbo.PhonerEmner.PhonerIgen
LEFT OUTER JOIN
dbo.Bruger
RIGHT OUTER JOIN
dbo.Bruger AS Bruger_3
RIGHT OUTER JOIN
dbo.Medlemsdata ON Bruger_3.BrugerID = dbo.Medlemsdata.ÆndretID ON dbo.Bruger.BrugerID = dbo.Medlemsdata.OpretteID ON dbo.PhonerEmner.FK_Vennenr = dbo.Medlemsdata.Vennenr
LEFT OUTER JOIN
dbo.Postnumre
RIGHT OUTER JOIN
dbo.MedlemsAdresse ON dbo.Postnumre.Postnummer = dbo.MedlemsAdresse.Postnr ON dbo.Medlemsdata.FK_AdrID = dbo.MedlemsAdresse.AdrID
LEFT OUTER JOIN
dbo.PhonerImport ON dbo.PhonerImportData.FK_PhonerImportID = dbo.PhonerImport.PhonerImportID
项目 107 的客户统计数据:
Client Execution Time 14:04:24
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0 0.0000
Rows affected by INSERT, DELETE, or UPDATE statements 0 0.0000
Number of SELECT statements 2 2.0000
Rows returned by SELECT statements 1001 1001.0000
Number of transactions 0 0.0000
Network Statistics
Number of server roundtrips 3 3.0000
TDS packets sent from client 3 3.0000
TDS packets received from server 241 241.0000
Bytes sent from client 340 340.0000
Bytes received from server 976874 976874.0000
Time Statistics
Client processing time 95 95.0000
Total execution time 391 391.0000
Wait time on server replies 296 296.0000
项目 137 的客户统计数据:
Client Execution Time 13:58:28
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0 0.0000
Rows affected by INSERT, DELETE, or UPDATE statements 0 0.0000
Number of SELECT statements 2 2.0000
Rows returned by SELECT statements 1001 1001.0000
Number of transactions 0 0.0000
Network Statistics
Number of server roundtrips 3 3.0000
TDS packets sent from client 3 3.0000
TDS packets received from server 217 217.0000
Bytes sent from client 340 340.0000
Bytes received from server 877700 877700.0000
Time Statistics
Client processing time 129596 129596.0000
Total execution time 130297 130297.0000
Wait time on server replies 701 701.0000
【问题讨论】:
-
如果您分别为两个语句提供查询执行计划,这可能会有所帮助。在 SQL Management Studio 中,选择“包括实际执行计划”的图标(或使用 Ctrl + M 切换),并在查询完成后获取执行计划,该执行计划将在查询结果窗格。对于每个查询,这些执行计划是什么样的?
-
统计数据是否过时?在执行计划中检查估计的行与返回的实际行
-
请发布2个查询计划。
-
您有以下评论:“ProjectID 是索引主键。”但是,在视图
V_PhonerSubjects中返回的ProjectID值是dbo.PhonerEmner.FK_ProID AS ProjectID,我假设它不是主键,而是返回dbo.PhonerProjekt表的外键。如果在视图中将dbo.PhonerEmner.FK_ProID AS ProjectID更改为dbo.PhonerProjekt.PhonerProID AS ProjectID,有帮助吗? -
你说得对,“fk_”表示外键。但是,它仍然是主键的一部分。它是由 Vennenr 和 FK_ProID 组成的共享密钥的一部分。因此,一位朋友可以参与多个项目。但每个项目只有一次。不过我确实尝试了你的建议,但没有效果。
标签: sql sql-server performance select sql-server-2012