我说不,伙伴说是的。我们都很固执。我们将测试,但我需要一些弹药来支持我的情况,即下面的伪代码不是那么大的瓶颈。我们正在做的是运行两个查询。第一个是针对一个大表(100k记录),下面称为BigTable。然后,我们采取我们发现的(通常是30个左右的记录)并运行这些记录(在一个循环中,参见下面的第二个'foreach')对一个名为SmallTable的小得多的表,通常有大约200条记录。我的合作伙伴希望将SmallTable中的记录组合在一起,以便它们出现在BigTable的记录中,但如果这样做,则会失去灵活性,数据库不再处于正常状态。我的伴侣说他不关心普通形式,并声称以下是瓶颈。帮助我赢得这场战斗!当然,我的后备位置将是“让我们测试并看到”,但我现在可以使用一些火力。我们期望每秒10个请求(在这种情况下可能是瓶颈,如果有的话,是微不足道的)或高达1500秒(这可能会破坏我们的应用程序在其他地方!大声笑。但我们是乐观主义者。)
平台:Microsoft SQL Server 2008,使用以C#和Linq-to-Entities(EF)编写的Web服务,在远程服务器上运行,我们不拥有,但由GoDaddy等服务器公司拥有,位于' Per Call'/无状态基础。在SQL Server中设置为默认值的所有内容(例如,Max Pooling = 100,Load Balance Timeout = 0,Pooling = True)。我没有进行任何缓存,因为我已经读过某个地方,缓存不适用于分布式数据库,我认为这是服务器公司使用的。
我很感激。这是伪代码:
Public string MyWebMethod()
{
List<Record> myrecords = new List<Records>();
try //try block 1
{
using (AEntityFramework context = new AEntityFramework())
{
var RecordsReturned = (from x in context.BigTable
//some conditions deleted
select x);
//do some stuff with these records, typically 30 records returned from BigTable, which has 10000 to 100000 records total
foreach (Record r in RecordsReturned)
{ myrecords.Add(r);} //add these records to the List myrecords, to be used later.
}
}
catch (Exception)
{
Try block 1 exceptions here
}
//end of try block 1
////////////////// now move to the next SQL query, which loops--is this a bottleneck?
foreach (Record R in myrecords)
{
try //try block 2
{
using (AEntityFramework context = new EntityFramework())
{
var SmallQuery = (from y in context.SmallTable
//some conditions deleted
select y);
//small table has 100 to 200 records, it is very small
//do a short operation with the Record R and anything collected by var SmallQuery, typically 2 to 3 entries.
}
}//end of try block 2
catch (Exception)
{
//try block 2 exceptions here
}
} //end of foreach
return “OK”;
}
[编辑]回复做JOIN的答案。如果在这里答案不对,我将打开第二个帖子。谢谢!可怜新手了。 好吧,我害怕这个。现在这个问题变形了,也许我会打开一个新的线程。
这是我的问题:
我需要选择表A中满足条件的所有记录,然后根据链接表A_C中找到的参数列表过滤这些记录。但我不知道参数列表的长度是多少,提前。它通过方法调用改变方法调用。
举一个具体的例子
表A列出了“客户ID”和“邮政编码”。表A_C具有包括“CustomerIDs”和“Categories”的主键。表C有“类别”。我发现表A中的客户生活在某个“邮政编码”中。然后,从这个子集中,我需要找到哪些客户选择了属于链接表A_C中的某些类别的某些产品:食品,服装等,但我的网络方法提前不知道这些类别是什么相反,它们作为列表传递:列出myCategoryList(可以是1类或100,通过方法调用改变方法调用)。
如何使用Linq-to-Entities编写投影?
List<string> CategoryList = new List<string>() { "Food", "Shelter", "Housing" }; // in one call to the web service method
List<string> CategoryList = new List<string>() { "Food", "Clothing" }; //in a second call--varies and I don't know ahead of time which is which.
那么如何使用Linq-to-Entities进行投影?我将打开第二个帖子。
答案 0 :(得分:5)
一般情况下,最好使用您正在处理的所有记录进行连接,并在代码中一次性处理它们。数据库服务器可能非常强大,并且针对这样的组合进行了优化。它会比你在这里做的'伪连接'要快得多(查询,循环另一个查询等)。
坚持(可能)第1范式。从长远来看,它会更好地为您服务。