有没有办法让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,存储过程会执行此操作?
>有没有办法将此表存储在连续的内存中?
解决方法
在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可能只写入一次磁盘.这取决于你是否已经搞乱了恢复内部标志,数据量的变化以及类似的东西.我猜这时候它的信息太多了.