2017-07-07 60 views
0

我有一個數據庫表有1億條記錄。 Screen Shot is taken from Robomongo如何優化大型數據庫上的C#mongodb查詢?

表模式: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()); 

出的說就是:

  • 時間以取得實錄:00:00:00.0059207
  • 時間轉換VAR列出:00:01:00.7209163
  • 在列表
  • 總數: 1003154

我有幾個問題與給定的代碼有關。

  1. 當行collection.Find(filt)執行時,它是否從數據庫中提取過濾的記錄或者只是創建過濾器?
  2. var list1 = list.ToList();需要1分鐘執行,它只是從var轉換爲列表或第一次獲取數據比轉換?
  3. 如何實現此查詢並儘可能縮短時間。請幫忙。

回答

2

當行collection.Find(FILT)執行,它從數據庫中獲取過濾 記錄或只是創建過濾器?

它只是創建過濾器。

var list1 = list.ToList();需要1分鐘執行,是否只有 從var轉換爲列表或第一次獲取數據比轉換?

它正在提取數據和轉換。

如何實現此查詢並導致儘可能少的時間。請幫忙。

對數據庫的讀取/過濾正在消耗您的時間。加速它的最簡單方法是在您要過濾的列上創建一個索引。如創建一個更粗略地顯示日期的列(例如按日期分組)和索引這一個,或者創建類似按給定時間段(I')分組的表格部分之類的東西(其他部分需要更多努力或數據庫技術) m不是DB-Admin,也不知道這個適當的條款,但我記得有人在數據庫上做了數十億條記錄;))

+0

感謝您提供的信息。我試圖通過在Value列上創建索引,但它沒有幫助。任何其他方式向解決方案邁進? – Umer