我有一个拥有1亿条记录的数据库表。 Screen Shot is taken from Robomongo
表架构:There are 100 million records
当我运行以下代码时。我得到了结果,但需要大约1分钟才能完成。我需要优化查询以更快地获得结果。我到现在所做的就是这里。请告诉我实现优化结果的方法。
var collection = _database.GetCollection<BsonDocument>("FloatTable1");
var sw = Stopwatch.StartNew();
var builder = Builders<BsonDocument>.Filter;
int min = Convert.ToInt32(textBox13.Text); //3
int max = Convert.ToInt32(textBox14.Text); //150
var filt = builder.Gt("Value", min) & builder.Lt("Value", max);
var list = collection.Find(filt);
sw.Stop();
TimeSpan time = sw.Elapsed;
Console.WriteLine("Time to Fetch Record: " + time.ToString());
var sw1 = Stopwatch.StartNew();
var list1 = list.ToList();
sw1.Stop();
TimeSpan time1 = sw1.Elapsed;
Console.WriteLine("Time to Convert var to List: " + time1.ToString());
Console.WriteLine("Total Count in List: " + list1.Count.ToString());
Out Put是:
我几乎没有与给定代码相关的问题。
答案 0 :(得分:2)
当line collection.Find(filt)执行时,是否进行过滤 从数据库记录还是只创建过滤器?
它只是创建过滤器。
var list1 = list.ToList();需要1分钟才能执行,仅此而已 从var转换为列表OR首先获取数据而不是转换?
它正在获取数据并进行转换。
如何实现此查询并最少花费时间。请帮助。
数据库上的提取/过滤正在耗费你的时间。加快速度的最简单方法是在要过滤的列上创建索引。
其他一切都需要更多的努力或数据库技术,比如创建一个更粗略地显示您的日期的列(例如按天分组)并索引此一个,或创建类似于按给定时间跨度分组的表格部分(I&#39 ;我不是DB-Admin,也不知道这个的正确条款,但我记得有人在数据库上做了数十亿条记录;))