2012-03-19 54 views
1

我有一个页面,它需要太长时间才能加载,因为它必须计算每个类别中成员的数量。 http://www.storeboard.com/counties/default.asp?cou=1196更快的SQL计数

经进一步调查,我偶然发现这个页面:http://blogs.msdn.com/b/martijnh/archive/2010/07/15/sql-server-how-to-quickly-retrieve-accurate-row-count-for-table.aspx

我的问题是我如何改变这样的:在我引用的页面的解决方案4

SELECT COUNT(MemberID) AS MembersInCountyCat 
FROM Member 
WHERE NYKACountyID = @NYKACountyID 
AND (
    NYKACatID = @NYKACatID 
OR NYKACatIDExtra1 = @NYKACatID 
OR NYKACatIDExtra2 = @NYKACatID 
OR NYKACatIDExtra3 = @NYKACatID 
OR NYKACatIDExtra4 = @NYKACatID 
OR NYKACatIDExtra5 = @NYKACatID 
OR NYKACatIDExtra6 = @NYKACatID 
OR NYKACatIDExtra7 = @NYKACatID 
OR NYKACatIDExtra8 = @NYKACatID 
OR NYKACatIDExtra9 = @NYKACatID 
OR NYKACatIDExtra10 = @NYKACatID 
) 
AND ProfileTypeID <> 1 

走进建议。

任何帮助,您可以提供将不胜感激。

非常感谢,保罗

+3

为表这些例子查询对象/索引级统计的MemberIds,你不能给他们应用一个条件 - 你的示例页面看起来像是希望为每个类别计算X,但是你的查询示例似乎并不适用于它们的集合,那么你使用的整个sql – 2012-03-19 17:15:18

回答

2

如果你真的需要搜索所有这些领域,然后对其进行索引适当 - 使用探查器和数据库引擎优化顾问的一个很好的起点。

一种替代方法是将这10个NYKACatIDExtra字段提取到单独的表中,并将它们排列为一对多关系。然后使用加入找到物品的类别和计数应该更快...

3

你必须规范你的数据库,即移动NYKACatID,NYKACatIDExtra1 .. NYKACatIDExtra10到单独的表。为该表定义适当的索引并使用连接重写你的查询。

+1

正如Vitaliy所述,你真正的问题是您已经对数据模型进行了非规范化。现在你必须使用一系列的OR。 OR使DBMS很难使用索引。解决这个问题,你的表现问题也会消失。您不必规范化数据模型。您可以调整SQL,使其可以在未规范化的数据模型上工作(如您所示)。但这将是困难和缓慢的。使用Flow,SQL在规范化的数据模型上效果最佳。 – Wim 2012-03-19 17:54:56

-1

像这样的事情也许采取指数的优势(如果您有任何):

select MembersInCountyCat = count(*) 
from (
SELECT MemberID 
FROM Member 
WHERE NYKACountyID = @NYKACountyID 
AND NYKACatID = @NYKACatID 
AND ProfileTypeID <> 1 
union 
SELECT MemberID 
FROM Member 
WHERE NYKACountyID = @NYKACountyID 
AND NYKACatIDExtra1 = @NYKACatID 
AND ProfileTypeID <> 1 
union 
... 
union 
SELECT MemberID 
FROM Member 
WHERE NYKACountyID = @NYKACountyID 
AND NYKACatIDExtra10 = @NYKACatID 
AND ProfileTypeID <> 1 
) t 

union会让独特

+0

不幸的是,这证明比我的解决方案更慢。 – neojakey 2012-03-19 18:35:03

+0

@neojakey您需要在这些列上单独使用“包含列的已过滤索引”来利用此方法; '在成员(nykacountyid,nycacatidextra1)上创建非聚集索引ix_m_nykacid_nykacide1 include(memberid)其中profiletypeid <> 1'(其中10个) – 2012-03-19 18:49:17