将表存储在内存中

edg*_*tze 5 database sql-server sql-server-2008

有没有办法让 SQL Server 在内存上存储一个具有 10 个属性和 10 行的表?

a1   a2   a3  a4  a5  a6  a7  a8  a9 a10
----------------------------------------
138 498  365 345 500 473 498 125 134 800
448 498  362 348 500 463 498 625 165 700
468 498  625 329 500 435 498 625 345 600
437 701  365 326 500 453 498 625 645 500
438 498  326 329 500 438 498 625 745 400
439 499  626 329 500 438 498 525 685 300
440 500  327 328 500 423 498 627 655 200
444 214  331 334 500 428 498 125 615 100
448 498  362 348 500 463 498 225 165 700
468 498  625 329 500 435 498 425 345 600
Run Code Online (Sandbox Code Playgroud)

我正在考虑制作某种向量并使表格成为单行(而不是 10 个属性乘以 10 行制作一个大小为 100 的向量。有没有办法做到这一点?

你可能会问我为什么要这样做,因为我想在内存中进行一些微积分,避免写入或使用磁盘,然后在 C++ 或 .NET(也许是 C#?)中访问内存或向量。

我正在考虑创建一个可以将表转换为数组的 UDF,但希望这个过程全部在内部进行。

所以我希望内存中的表避免导出和导入,也避免写入磁盘......

  • 有没有办法执行 UDF、存储过程来执行此操作?
  • 有没有办法将此表存储在连续内存中?

San*_*ddy 6

在 SQL Server 2005 之前的早期版本中,DBCC PINTABLE 用于将表插入内存中,但它存在一些数据损坏的固有问题。虽然命令 DBCC PINTABLE 仍然存在,但它什么也不做。

我认为你把它弄得太复杂了。当内存中不存在数据时,SQL Server 才会从磁盘读取数据。一旦它在内存中,它就会一直留在那里,直到它一段时间不被使用或它让位于读取其他东西。如果您有足够的内存(这完全是相对的),那么您的表可能已经在内存中。我在这里简化了一点。它使用 LRU-k 算法将页面保存在缓存中。10 行和 10 列 smallint/int 数据将适合一页,即 8KB,您应该停止追求您的初始计划。

参考:http : //msdn.microsoft.com/en-us/library/ms191475.aspx

一个页面在缓存中,即使您更新数据,它也不会立即写入磁盘,并且有一个异步进程(CHECKPOINT,Lazy writer)稍后将此数据刷新到磁盘。您可以将数据更新 100 次,并且 SQL Server 可能只写入一次磁盘。这取决于您是否弄乱了恢复内部标志、数据更改量等等。我想此时它的信息太多了。