Thi*_*ave 9 c# mysql linq-to-entities entity-framework database-performance
我使用MySQL Connector/Net 6.5.4与LINQ实体,我经常得到糟糕的查询性能,因为实体框架生成使用派生表的查询.
这是我多次遇到的简化示例.在C#中,我写了一个这样的查询:
var culverCustomers = from cs in db.CustomerSummaries where cs.Street == "Culver" select cs;
// later...
var sortedCustomers = culverCustomers.OrderBy(cs => cs.Name).ToList();
Run Code Online (Sandbox Code Playgroud)
而不是像这样生成简单的查询:
SELECT cust.id FROM customer_summary cust WHERE cust.street = "Culver" ORDER BY cust.name
Run Code Online (Sandbox Code Playgroud)
实体框架使用派生表生成一个查询,如下所示:
SELECT Project1.id FROM (
SELECT cust.id, cust.name, cust.street FROM customer_summary cust
WHERE Project1.street = "Culver"
) AS Project1 -- here is where the EF generates a pointless derived table
ORDER BY Project1.name
Run Code Online (Sandbox Code Playgroud)
如果我解释两个查询,我得到第一个查询:
id, select_type, table, type, possible_keys, rows
1, PRIMARY, addr, ALL, PRIMARY, 9
1, PRIMARY, cust, ref, PRIMARY, 4
Run Code Online (Sandbox Code Playgroud)
......对于实体框架查询来说,这样的事情很糟糕
id, select_type, table, type, possible_keys, rows
1, PRIMARY, <derived2>, ALL, 9639
2, DERIVED, addr, ALL, PRIMARY, 9
2, DERIVED, cust, ref, PRIMARY, 4
Run Code Online (Sandbox Code Playgroud)
请注意第一行,其中MySQL解释说它正在扫描9000多条记录.由于派生表,MySQL正在创建临时表并加载每一行.(或者我根据这样的文章推断:派生表和视图性能)
如何防止实体框架使用派生表,或者如何说服MySQL对此类查询进行明显的优化?
为了完成,以下是该linq查询的源视图:
create view customer_summary as
select cust.id, cust.name, addr.street
customers cust
join addresses addr
on addr.customer_id = cust.id
Run Code Online (Sandbox Code Playgroud)
小智 1
我认为您的查询语句缺少“选择”。您尚未确定所需的记录。您的查询:
var culverCustomers = from cs in db.CustomerSummaries
where cs.Street == "Culver";
Run Code Online (Sandbox Code Playgroud)
//没有选择
你从表中选择什么?尝试这个
例子:
var culverCustomers = from cs in db.CustomerSummaries
where cs.Street == "Culver"
select cs;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1883 次 |
| 最近记录: |