I have some SQL Server instances used to support an app with single tenant DBs, so each instance has roughly 50-80 databases, ranging in data from 500-600GB for all databases combined. This is running on SQL Server 2016 standard. I have a server with the maximum 128GB RAM provisioned, and it still appears to be insufficient. Performance suffers with a lot of concurrent requests and there's a lot of I/O on the server. I can't say I'm surprised given the ratio of ram to data is roughly 1:5.
The one consideration is that a lot of the data is old, and I doubt that customers really need to access this data. So I'm trying to determine if there's any way to reduce the amount of RAM SQL Server needs if it's going to only be storing the actual data accessed. I'm not a DBA, so not sure how SQL Server will load data into memory. Is it safe to assume that if there's a table scan or index scan performed, it will load all that data into memory? So if I have a large table that I search through and for whatever reason the query plan decides a scan is better, even though it will not return all the data, will the table scan load everything in memory?
With the above in mind, all I can think of as a solution is to archive data to a separate table that does not get frequently accessed so the data does not get loaded to memory. So when running a search, it would only be accessing a table with 2 years of data, if they wanted to search older data there would be a checkbox to allow for it, which people would likely not use most of the time. Is that something that would help reduce the memory pressure? We could also consider shipping data to a completely separate data store. Are there other strategies people use besides data archival to reduce memory pressure given a database that may have 10+ years of data where clients are mostly interested in recent years?