Joh*_*Doe 1 sql-server optimization memory cache sql-server-2014
我想将整个数据库加载到内存中,但是我该怎么做呢?我有大约 256 GB 的内存,我的数据库大约有 200 GB,所以我可以轻松地处理内存。
当我执行select count(*) from table1
sqlserver 自动将表加载到内存之后,我可以非常快速地使用表,但我想知道如何将整个数据库加载到内存中?
如果我select count(*) from
在每个表上都这样做,我可以更快地工作,但是有没有其他方法可以将整个数据库加载到内存中?我想通过一个命令加载整个数据库,而不是一个select count(*) from
表一个表。
我想将整个数据库加载到内存中,但是我该怎么做呢?
在弄清楚“如何”做某事之前,通常最好先弄清楚“为什么”应该做某事。那么,为什么要将整个数据库加载到内存中呢?内存是一种有限资源,因此需要有效/明智地使用它。
我有大约 256 GB 的内存,我的数据库大约有 200 GB,所以我可以轻松地在内存中处理
好的,所以您似乎拥有超出数据库大小的 56 GB RAM。但这里是数据本身之外没有考虑的内容:
现在,关于那 200 GB 的数据,您应该考虑:您是否使用了所有200 GB 的数据?我非常怀疑。将数据页加载到内存中而不引用它们是低效和浪费的。您最好按需加载页面,因为用于获取它们的磁盘 I/O 以及它们占用的内存将值得这两种资源,因为您不会将它们浪费在没人想要的页面上。
我想通过单个命令而不是
SELECT *
逐表加载整个数据库。
不,没有一个命令可以做到这一点。
此外,该SELECT COUNT(*)
方法甚至没有实现这个目标。它所做的只是通过扫描加载它可以找到的最小对象,它可能是一个非聚集索引,或者它实际上可能是基表本身。但它不加载:
COUNT(*)
操作的任何对象。因此,如果操作使用非聚集索引,您仍然需要找到一种方法来强制对所有非聚集索引和/或表/聚集索引扫描进行索引扫描COUNT(*)
。但这会更加浪费,因为它们不仅不总是被使用,而且每次加载它们都会违背您使用索引 DMV 来确定哪些索引实际上未被使用的能力!