有没有办法让 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
我正在考虑制作某种向量并使表格成为一行(而不是 10 个属性乘以 10 行,制作一个大小为 100 的向量。有没有办法做到这一点?
你可能会问我为什么要这样做,这是因为我想在内存中进行一些微积分,避免写入或使用磁盘,然后用 C++ 或 .NET(也许是 C#?)访问内存或向量
我正在考虑创建一个可以将表转换为数组的 UDF,但希望这个过程全部在内部进行。
所以我希望内存中的表避免导出和导入,也避免写入磁盘......
- 有没有办法执行 UDF、存储过程来做到这一点?
- 有没有办法将该表存储在连续的内存中?
答案1
在 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 可能只会写入磁盘一次。这取决于您是否弄乱了恢复内部标志、数据更改量等。我想此时信息太多了。