在客户决定转换后,我们从另一家公司接管了一个网站。
我们的表每天增加约25,000条记录,目前的记录为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 Express
答案 0 :(得分: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秒)。
答案 1 :(得分:1)
请注意COUNT(id)
通常会导致全表扫描,因此必须读取整个表才能获得计数。如果计数对你来说真的非常重要,你可能需要考虑创建一个触发器来将计数结果存储在其他表中。
在没有查询的情况下,我对inner join
的评论不多,但我的猜测是您没有id
或another_id
答案 2 :(得分:0)
15 million
上运行的 SQL Server 2005 Express
行
你正在使用什么样的硬件?您的数据库可以正确设置,但是如果您没有使用大量ram的专用服务器,那么像这样的大表上的查询会很慢。