2011-07-13 10 views
0

dblinqで使用するデータベースをセットアップしました。速度差dblinq結果対プロンプトでのSQL照会

CREATE TABLE 'quotes' (                          
     'DBDate' int(8) unsigned NOT NULL,                       
     'TickerID' int(11) unsigned NOT NULL,                      
     'Open' double(12,4) NOT NULL,                        
     'High' double(12,4) DEFAULT NULL,                       
     'Low' double(12,4) DEFAULT NULL,                       
     'Close' double(12,4) DEFAULT NULL,                       
     'AdjClose' double(12,4) DEFAULT NULL,                      
     'Volume' int(11) unsigned NOT NULL,                       
     PRIMARY KEY ('TickerID','DBDate'),                       
     CONSTRAINT 'quotes_ibfk_1' FOREIGN KEY ('TickerID') REFERENCES 'tickers' ('TickerID') ON DELETE CASCADE ON UPDATE CASCADE 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC    

上記MySQLサーバが異なるマシン上にあるMySQLのテーブルスケジュール あります。私は(サーバとそうではない同じマシン)私のテストマシン上でこのMySQLのクエリを実行すると は

を選択します。*、B *引用符から内はa.DBDate = Bの引用符bを登録しよう。 DBDateとa.TickerID = 956、b.TickerID = 957の順番でa.dbdate asc。

私は期待通りの出力が得られます:私はこのようなDBLinqを使用して、私のC#のenvirementで同じ結果を取得したいときセットで 2934行(0.03秒)

をしかし:

var tradeAbleA = (from a in _db.Quotes where a.TickerID == 956 select a); 
var tradeAbleB = (from a in _db.Quotes where a.TickerID == 957 select a); 
var myDataSet = (from a in tradeAbleA.AsEnumerable() join b in tradeAbleB.AsEnumerable() on a.DbdAte equals b.DbdAte orderby a.DbdAte ascending select new { a, b }).ToList(); 

リストがいっぱいになるまでには1秒以上かかります。これは長すぎます。どうすればこれをスピードアップできますか? について(私はリストにそれを必要とする)、

Matthijs

答えて

0

は、SQLは、次のLINQに翻訳していないでしょうか?現在のバージョンで

var myDataSet = (from a in _db.Quotes 
    join b in db.Quotes on a.DbdAte equals a.DbdAte 
    where a.TickerID == 956 && b.TickerID == 957 
    orderby a.DbdAte ascending select new { a, b }).ToList(); 

は、あなたがのためのクエリを作成し、B別々に、そしてあなたのLINQの式の第3回あなたがそれらを強制的にそれらの上.AsEnumerable()を呼び出すことによって評価されます。結果をメモリに移動すると、Linqがオブジェクトに結合します(高価になる可能性があります)。その後、残りのアイテムをメモリ内で注文します。

上記の手順をすべて実行すると、となる傾向があるクエリプロバイダに多くのメッセージが届きます。

+0

面白いのは、あなたが提案したようなlinqクエリを実際に持っていたことですが、aとbの型が一致しなかったというエラーメッセージが表示されます(明示的なメッセージを明日掲載します)。 。だから私は2つの別々のクエリでそれを分割し、3番目のクエリに参加させています。私は明日あなたの質問をテストし、問題があればそれが何であるかを知らせます。応答してくれてありがとう。 – user369122

+0

OK、ラップトップでクエリをテストしました。私の分割方法を使用すると、それをリストに入れるのに約750ミリ秒かかります(リストは前のテストのサイズの半分で、長さは1358行です)。しかし、あなたが示唆するようにクエリを使用すると、約3分23秒かかり、代わりに2763418行が返されます。 a.DbdAteはb.DbdAteと正しく対応しません。私はなぜ...どんな提案も見ませんか? – user369122

+0

@ user369122これはちょっと聞こえません...どのタイプがDbdAteですか?首都と言うのは難しいが、私はそれが日付だったと仮定していたのだろうか? – Smudge202

関連する問題