1

在客户决定切换后,我们从另一家公司接管了一个网站。

我们有一张表每天增长大约 25k 条记录,目前是 15MM 条记录。

该表看起来像:

id (PK, int, not null)
member_id (int, not null)
another_id (int, not null)
date (datetime, not null)

SELECT COUNT(id) FROM tbl 最多可能需要 15 秒。

'another_id' 上的简单内部连接需要 30 多秒。

我无法想象为什么要花这么长时间。有什么建议吗?

SQL Server 2005 速成版

4

3 回答 3

3

如果您需要行数,但您可以接受一个近似值(不是 100% 保证准确 - 但给您一个大概),您可以使用 SQL Server 中的系统目录视图来实现这一点,如下所示:

SELECT 
    t.Name AS TableName,
    sum(p.rows) as RowCounts
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
WHERE 
    t.Name = 'Your Table Name'
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 

给定数据库中的任何表,这将为您提供该表中行数的近似值,并且速度非常快(不可测量 - 不到 0.01 秒。)

于 2010-04-09T07:22:08.837 回答
1

请注意,这COUNT(id)通常会导致全表扫描,因此必须读取整个表才能获得计数。如果计数对您来说真的很重要,您可能需要考虑创建一个触发器来将计数结果存储在其他表中。

如果没有查询,我不能说太多关于inner join,但我的猜测是你没有索引id或者another_id

于 2010-04-09T00:12:44.497 回答
0

15 million运行的行SQL Server 2005 Express

你使用什么样的硬件?您的数据库可以正确设置,但是如果您不在具有大量内存的优质专用服务器上,那么在这样的大表上查询会很慢。

于 2010-04-09T11:55:20.950 回答