.net 加快LINQ查询的技巧?
我有一个LINQ查询,它搜索一个大约250000条记录的SQL表,只搜索2个字段。这两个字段都已编制索引,但我发现其运行速度仍然相当慢 下面是代码,有人能提出一些建议来加速它吗 谢谢.net 加快LINQ查询的技巧?,.net,linq,.net,Linq,我有一个LINQ查询,它搜索一个大约250000条记录的SQL表,只搜索2个字段。这两个字段都已编制索引,但我发现其运行速度仍然相当慢 下面是代码,有人能提出一些建议来加速它吗 谢谢 var qryN = ( from bn in dbs.Uploads orderby bn.ID descending select new { ID = bn.ID, Serial = bn.serial_no, Manufact
var qryN = (
from bn in dbs.Uploads
orderby bn.ID descending
select new
{
ID = bn.ID,
Serial = bn.serial_no,
Manufacturer = bn.Mfgr,
Model = bn.model,
Code = bn.code,
Qty = bn.qty,
Description = bn.description,
Comments = bn.comments,
Location = bn.location,
Price = bn.price,
Email = "Register / Login for full details"
});
if (dlType.Text != " " && dlType.Text != "")
{
qryN = qryN.Where(bn => bn.Manufacturer == dlType.SelectedValue);
}
if (txtWord.Text != "")
{
qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text));
}
gvLoggedOff.DataSource =
from p in qryN
select new
{
p.ID,
p.Serial,
p.Manufacturer,
p.Model, p.Code,
p.Qty,
p.Description,
p.Comments,
p.Location,
p.Price,
p.Email
};
gvLoggedOff.DataBind(); var qryN = (
from bn in dbs.Uploads
orderby bn.ID descending
select new
{
ID = bn.ID,
Serial = bn.serial_no,
Manufacturer = bn.Mfgr,
Model = bn.model,
Code = bn.code,
Qty = bn.qty,
Description = bn.description,
Comments = bn.comments,
Location = bn.location,
Price = bn.price,
Email = "Register / Login for full details"
});
if (dlType.Text != " " && dlType.Text != "")
{
qryN = qryN.Where(bn => bn.Manufacturer == dlType.SelectedValue);
}
if (txtWord.Text != "")
{
qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text));
}
gvLoggedOff.DataSource =
from p in qryN
select new
{
p.ID,
p.Serial,
p.Manufacturer,
p.Model, p.Code,
p.Qty,
p.Description,
p.Comments,
p.Location,
p.Price,
p.Email
};
gvLoggedOff.DataBind();
两件事:
- 由于要添加过滤器,请将投影(选择新的匿名类型)移动到最后一行,而不是第一行,即
行DataSource
- 你订得很早。除非queryable或查询分析器足够聪明来分析和优化它,否则数据库必须在开始过滤之前订购250000行。尽可能晚地移动排序,可能就在投影发生之前
var qryN = dbs.Uploads.AsQueryable();
if (dlType.Text != " " && dlType.Text != "")
qryN = qryN.Where(bn => bn.Mfgr == dlType.SelectedValue);
if (txtWord.Text != "")
qryN = qryN.Where(bn => bn.description.Contains(txtWord.Text));
gvLoggedOff.DataSource = qryN.OrderByDescending(bn => bn.ID)
.Select(bn => new {
bn.ID, Serial = bn.serial_no, Manufacturer = bn.Mfgr,
Model = bn.model, Code = bn.code, Qty = bn.qty,
Description = bn.description, Comments = bn.comments,
Location = bn.location, Price = bn.price,
Email = "Register / Login for full details" });
gvLoggedOff.DataBind();
因为这被接受为一个答案:关于文本搜索可能也适用于某些情况。全文搜索可能会耗尽性能,这是您无法相信的。说明中的筛选器可能会出现问题:
qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text));
包含的
调用被转换为类似“%”++@p0++“%”的SQL描述
。这意味着,即使在description
列上有索引,SQL server也必须循环遍历完整的索引(甚至可能是完整的表)。如果可能,将该行更改为以下内容:
qryN = qryN.Where(bn => bn.Description.StartsWith(txtWord.Text));
这将转换为
描述,如@p0+'%'
,这允许您的数据库服务器有效地使用索引。描述。包含听起来很重,您可以尝试使用全文搜索
是一篇描述如何使用LINQ的FTS的帖子。你看过生成的SQL并对其进行分析了吗?制造商是否有FK?Jon完全正确。你的问题目前很模糊。我们不知道您的数据模型看起来如何,生成了什么,是否使用LINQ to SQL、实体框架、NHibernate等等。是的,我确实意识到了这一点,但这正是客户想要的。我采用了你的解决方案,然后将史蒂文斯放在一个领域,结果非常好——谢谢again@Pedro:哦,当然,我不是说“不要这样做”,我只是说“注意它”。一个小的补充:if(dlType.Text!=”“&&dlType.Text!=”)
可以是if(!string.IsNullOrWhiteSpace(dlType.Text))
以及其他改进。我选择不让它们更容易关联。