Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 更高效的SQL用于检索视图上的数千条记录_Asp.net_Sql_Linq To Sql_C# 4.0 - Fatal编程技术网

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

Asp.net 更高效的SQL用于检索视图上的数千条记录,asp.net,sql,linq-to-sql,c#-4.0,Asp.net,Sql,Linq To Sql,C# 4.0,我使用LINQtoSQL作为我的ORM,我有一个多达几千个ID的列表传递到我的retriever方法中,我想用这个列表获取与这些唯一ID对应的所有用户记录。为了澄清,假设我有这样的东西: List<IUser> GetUsersForListOfIds(List<int> ids) { using (var db = new UserDataContext(_connectionString)) { var resu

我使用LINQtoSQL作为我的ORM,我有一个多达几千个ID的列表传递到我的retriever方法中,我想用这个列表获取与这些唯一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中的in子句似乎花费了超过30秒的时间。

需要有关数据库设置的更多信息,如索引和服务器类型Mitch Wheat的帖子。数据库的类型也会有所帮助,有些数据库在子句中处理得很差

从故障排除的角度来看……您是否隔离了sql server的时间延迟?您能否直接在服务器上运行查询并确认该查询占用了额外的时间

Select*也会对性能产生一些影响……您能否缩小返回到所需列的结果集的范围


编辑:刚刚看到您添加的“视图注释”…我过去在视图性能方面遇到过问题。这是一个物化的视图…还是你能把它变成一个?将视图逻辑重新创建为存储过程也可能有所帮助。

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

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秒以上的时间,那么我的猜测是视图本身需要那么长的时间来处理-或者-每次检索视图时都要传输10 MB的数据。不管怎样,我唯一的建议是直接访问表,只检索您需要的数据,重写视图,或者为此特定场景创建一个新视图。

EDIT:在我正在处理的实际场景中,我实际上使用了一个视图,一个非常讨厌、令人厌恶的视图…@Justin,存储过程可能比视图更有效。如果您可以强制用户提交一些参数,那么哈希连接的结果集将更小,因此返回faster@Justin我怀疑这种情况,为什么要将一个包含数千个ID的列表传递给SQL。也许你可以详细说明这个场景,但不管效率如何,这似乎不是一个好主意。@Brad:是的,看起来我必须在这个场景中使用存储过程。我将留下这个问题,只是想看看是否有人想出了另一种方法。@eglassius场景是,我正在为管理员创建图表,以查看有关其用户的统计信息等。我的一个管理员有几千个用户,这促使我想到了我们现在的问题所在。此外,我同意这不是很有效,而且可能是个坏主意-我希望有一些见解能引导我朝更好的方向发展MS SQL Server 2008,不幸的是,我的视图没有任何索引,因为db在将索引放置到视图上时受到限制。我的观点是多年前的老观点,非常复杂和令人厌恶,视图中的一些逻辑强制db约束,不允许我应用索引。是的,我已经隔离了它,运行sql中的in子句作为问题的查询。IN的效率相当低,尤其是向它传递了几千个参数。我希望有人会了解一些linq to sql,这会帮助我解决这个问题。我对linq to sql的了解还不足以确定,但我很难看到它能够比直接针对数据库运行查询更快。我认为你的评论@brad是对的……制作一个存储过程,并尝试限制返回的信息,以满足您的需要。最好将“in”语句中的ID放入临时表中,让存储的进程从该表开始工作,而不是试图将一个巨大的“in”变量传递给进程。是的,不幸的是,这就是我目前解决存储进程的方法。我会保持这个开放的状态,以防那个LinqtoSQL专家出来给我一个好主意。非常感谢您的帮助和快速回复:@Justin也许您应该共享您在问题更新中使用的sp,这样更有可能有人在LINQ中使用类似的东西。不幸的是,在我意识到视图中有多少记录之前,这绝对是一个选项。太多的记录无法在内存中转换。谢谢你!
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();
        }
}