更高效的SQL,用于检索视图上的数千条记录

时间:2010-10-05 15:37:27

标签: asp.net sql linq-to-sql c#-4.0

我使用Linq to Sql作为我的ORM,并且我有一个Ids列表(最多几千个)传递到我的检索器方法中,并且我希望获取与这些唯一ID相对应的所有用户记录。澄清一下,想象一下我有这样的事情:

List<IUser> GetUsersForListOfIds(List<int> ids)
{
        using (var db = new UserDataContext(_connectionString))
        {
            var results = (from user in db.UserDtos
                           where ids.Contains(user.Id)
                           select user);

            return results.Cast<IUser>().ToList();
        }
}

基本上它被转换为sql as

select * from dbo.Users where userId in ([comma delimmited list of Ids])

我正在寻找一种更有效的方法。问题是sql中的in子句似乎花了太长时间(超过30秒)。

2 个答案:

答案 0 :(得分:1)

需要有关数据库设置的更多信息,例如索引和服务器类型(Mitch Wheat的帖子)。数据库类型也有帮助,一些数据库处理条款很差。

从故障排除的角度来看......你有没有把时间延迟隔离到sql server?您是否可以直接在服务器上运行查询并确认查询是否需要额外的时间?

选择*也会对性能产生一些影响......您是否可以缩小返回到所需列的结果集?

编辑:刚刚看到您添加的“查看评论”...过去我的视图效果存在问题。它是物化视图......还是你可以把它合二为一?将视图逻辑重新创建为存储过程也可以提供帮助。

答案 1 :(得分:0)

您是否尝试将其转换为列表,因此应用程序在内存中执行此操作?即:

List<IUser> GetUsersForListOfIds(List<int> ids)
{
        using (var db = new UserDataContext(_connectionString))
        {
            var results = (from user in db.UserDtos.ToList()
                           where ids.Contains(user.Id)
                           select user);

            return results.Cast<IUser>().ToList();
        }
}

如果这是在受到重创的网站上面向公众的页面上运行,那么这显然会占用大量内存。如果在暂存/开发中这仍然需要30多秒,那么我的猜测是View本身需要花费很长时间才能处理 - 或者 - 每次检索视图时都要传输10 MB的数据。无论哪种方式,我唯一的建议是直接访问表,只检索您需要的数据,重写视图,或为此特定方案创建新视图。