c# - 如何从 SQL Server 缓存一个大表

标签 c# sql-server

我有一个包含很多行(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/

相关文章:

c# - 我可以在 Hololens 中录制也使用相机的应用程序的视频吗?有没有办法两全其美?

c# - 第 1 行数据太长

c# - 使用标签将每个表数据加载到 html 表

sql-server - Entity Framework 迁移 - 更改属性数据类型

c# - 首先附加现有数据库 Entity Framework 代码时出错

mysql - sql server 中的 mysql_insert_id() 函数相当于什么?

c# - 从 C# 中的列表访问对象参数

c# - c# - web api中 "$"关键字的用途是什么

c# - 数据表.选择

sql - 加入查询结果