dblinq结果与SQL查询在提示中的速度差异



我已经设置了一个用于dblinq的数据库。

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查询时(所以和服务器不是同一台机器)

SELECT a.*, b.* FROM quotes a INNER JOIN quotes b ON a. dbdate =a.dbdate AND a.TickerID=956 AND b.TickerID=957 order by a.dbdate asc;

我将得到预期的输出:2934 rows in set (0.05 sec)

但是当我想在c#环境中使用DBLinq获得相同的结果时,像这样:

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();

需要超过一秒的时间来填充列表。这太长了。我怎样才能加快速度?(我需要一个列表)认为,

Matthijs

您的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();

在当前版本中,您分别为a和b创建查询,并通过在linq表达式的第三部分对它们调用.AsEnumerable()来强制对它们进行求值。您将结果移动到内存中,然后Linq to Objects为您连接(这可能是昂贵的)。然后对内存中剩余的项进行排序。

以上应该允许您将所有这些步骤传递给查询提供程序,这往往要快得多。

最新更新