SQL数据库专家:这是一个瓶颈吗?

时间:2011-11-20 13:15:53

标签: sql sql-server-2008 profiling

我说不,伙伴说是的。我们都很固执。我们将测试,但我需要一些弹药来支持我的情况,即下面的伪代码不是那么大的瓶颈。我们正在做的是运行两个查询。第一个是针对一个大表(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的答案。如果在这里答案不对,我将打开第二个帖子。谢谢!可怜新手了。 好吧,我害怕这个。现在这个问题变形了,也许我会打开一个新的线程。

这是我的问题:

  • 表格客户(包含客户ID和邮政编码)
  • 表格类别(包含“食物”,“住所”,“服装”等类别) (链接)表A_C(因为表A和C链接为多对多):包含“客户ID”和类别,组合为主键

我需要选择表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进行投影?我将打开第二个帖子。

1 个答案:

答案 0 :(得分:5)

一般情况下,最好使用您正在处理的所有记录进行连接,并在代码中一次性处理它们。数据库服务器可能非常强大,并且针对这样的组合进行了优化。它会比你在这里做的'伪连接'要快得多(查询,循环另一个查询等)。

坚持(可能)第1范式。从长远来看,它会更好地为您服务。