我有一个包含很多行(300 万行)的表,我需要从中查询我应用程序中多个点的一些行。我发现这样做的方法是在第一次需要任何数据时查询所有数据,并将其存储在 static DataTable
中,其余时间使用 SqlAdapter.Fill()
应用程序生命周期。
这很快,因为当我需要某些东西时,我会使用 DataTable.Select("some query")
,应用程序会很好地处理信息。
问题是这张表需要大约 800MB 的 RAM,我必须在 PC 上运行这个应用程序,因为它可能太多了。
我想到的另一种方式是每次查询我需要的数据。这占用的内存很少,但性能很差(对数据库的大量查询,该数据库位于一个网络地址,并且有 1000 个查询,您开始注意到 ping 等等......)。
性能和内存使用之间是否存在中间点?
编辑:我正在检索的是销售额,其中包含日期、产品和数量。我按产品查询,但没有以这种方式建立索引。但是无论如何,进行 1000 次查询,即使查询花费了 0.05 秒,0.2 秒的 ping 总共需要 200 秒...
最佳答案
先和dba谈性能
如果您要下载整个表,与执行单个查询相比,您实际上可能会给网络和 SQL 带来更多的负载。
作为一名 dba,如果我知道您正在下载整个大表,我会立即在产品上添加索引。
为什么要执行 1000 次查询?
如果您在创建产品时寻找销售额,那么缓存就会有问题。您还没有销售数据。缓存的问题是过时的数据。如果你知道数据不会改变——你要么拥有它,要么不拥有它,那么你就可以消除对陈旧数据的担忧。
顺序和同时之间有某种东西。您可以在单个请求中打包多个选择。这样做是进行单次往返并且效率更高。
select * from tableA where ....;
select * from tableB where ....;
使用 DataReader 只需调用 SqlDataReader.NextResult Method ()
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
}
rdr.NextResultSet();
while (rdr.Read())
{
}
}
很确定您可以对 DataSet 中的多个 DataTable 执行相同类型的操作。
另一个选项是 LocalDB .它是针对开发人员的,但对于您正在做的事情来说,它会工作得很好。没有内存问题的 DataTable 速度。您甚至可以在 ProductID 上放置一个索引。与内存相比,写入光盘需要更长的时间,但您不会用完内存。
然后是 (nolock) 带来的恶果。知道你在做什么,我不会深入探讨所有可能的弊端,但我可以告诉你我经常使用它。
关于c# - 如何从 SQL Server 缓存一个大表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250044/