我有很大的列表(大约 20 000 个项目)和标准的 Sharepoint 2010 显示表单,它在内部调用方法 SPList.GetItemById(id)。此方法执行 sql 查询以通过其 id 从内容数据库中获取项目。
问题是方法 SPList.GetItemById(id) 对非特权用户执行的时间是站点管理员的 10-20 倍。因此,为非特权用户打开显示表单需要 10 秒,而对于站点管理员则需要不到 1 秒。
我在探查器的帮助下发现瓶颈存在于 Sharepoint 2010 为非特权用户构建的 SQL 查询中。
SQL 查询对于非特权用户和站点管理员是不同的。
您能否建议解决方案或解决方法以提高非特权用户的性能?
我使用标准的 Sharepoint 2010 显示表单,因此无法用其他更快速的方法替换 SPList.GetItemById(id) 方法。
可能会有所帮助:非特权用户的 SQL 查询对站点管理员有一些额外的连接:
INNER JOIN (SELECT CAST(val AS uniqueidentifier) AS InValues
FROM dbo.fn_UnpackCsvString(@L3TXP) ) AS Scopes ON (t1.ScopeId = Scopes.InValues)
LEFT OUTER JOIN (SELECT * FROM AllUserData AS t32_u
WITH(NOLOCK,INDEX=AllUserData_PK) INNER JOIN Docs AS t32_d
WITH(NOLOCK) ON (t32_d.DoclibRowId =t32_u.tp_ID AND
t32_u.[tp_CalculatedVersion] = 0 AND
t32_u.[tp_DeleteTransactionId] = 0x AND
t32_u.[tp_IsCurrentVersion] = CONVERT(bit,1) ) AND
(t32_d.SiteId=t32_u.tp_SiteId) AND
(t32_d.SiteId = @SITEID) AND
(t32_d.ParentId = t32_u.tp_ParentId) AND
(t32_d.Id = t32_u.tp_DocId) AND
( (t32_u.tp_Level = 1) ) AND
(t32_d.Level = t32_u.tp_Level) AND
(t32_d.IsCurrentVersion = 1) AND
(t32_d.Level = 1 OR t32_d.Level = 2)
INNER JOIN (SELECT CAST(val AS uniqueidentifier) AS InValues
FROM dbo.fn_UnpackCsvString(@L3TXP) ) AS Scopes ON
(t32_d.ScopeId = Scopes.InValues)) AS t32 ON
(t32.[tp_ListId] = @L2) AND
表 Docs AS t1