2017-07-07 6 views
0

私は1億のレコードを持つデータベーステーブルを持っています。 Screen Shot is taken from Robomongo大きなdatadasesで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リストにVARを変換する00.0059207
  • 時間:01:00:00.7209163
  • リストの合計数: 1003154

私は与えられたコードに関連する質問はほとんどありません。

  1. ラインコレクション.Find(filt)を実行すると、フィルタリングされたレコードをデータベースからフェッチするか、フィルタを作成するだけですか?
  2. var list1 = list.ToList();実行するのに1分かかりますが、それはvarからリストに変換するだけですか?最初に変換するよりもデータを取得していますか?
  3. このクエリをどのように達成し、結果として可能な限り時間がかかるか。助けてください。

答えて

2

ラインcollection.Find(FILT)が実行されると、データベースから濾過 レコードを取得するか、単にフィルタを作成しますか?

フィルタを作成するだけです。

var list1 = list.ToList();実行するのに1分かかりますか? はvarからリストに変換されますか、または最初に変換するよりもデータを取得していますか?

データをフェッチして変換しています。

このクエリをどのように達成し、結果として最小限の時間がかかるか。助けてください。

データベースのフェッチ/フィルタリングがあなたの時間を食べています。それをスピードアップする最も簡単な方法は、フィルタリングしている列にインデックスを作成することです。

他にも、おおまかに日付を表​​示したり、これを索引付けしたり、タイムゾーン別にグループ化されたテーブルセクションなどを作成する列を作成するなど、私はデータベース管理者ではなく、適切な用語を知らないが、数十億のレコードを持つデータベースで誰かがそれをやっているのを覚えている;))

+0

ありがとう。値の列にインデックスを作成してみましたが、それは役に立ちませんでした。ソリューションに向かう他の方法? – Umer

関連する問題