【发布时间】:2010-12-24 21:32:17
【问题描述】:
我想为报告执行此操作,但我的表中有 20,000,000 条记录,这会导致我的应用程序超时。
SELECT
T.transactionStatusID,
TS.shortName AS TransactionStatusDefShortName,
count(*) AS qtyTransactions
FROM
Transactions T
INNER JOIN TransactionTypesCurrencies TTC
ON T.id_Ent = TTC.id_Ent
AND T.trnTypeCurrencyID = TTC.trnTypeCurrencyID
INNER JOIN TransactionStatusDef TS
ON T.id_Ent = TS.ent_Ent
AND T.transactionStatusID = TS.ID
WHERE
T.id_Ent = @id_Ent
GROUP BY
T.transactionStatusID,
TS.shortName
据我所知,COUNT(*) 会导致全表扫描,这会使我的查询花费太多时间,我正在使用 MS SQL 2005,有什么帮助吗?
编辑:
项目负责人告诉我,查询只是一天,它可以提供帮助吗?
【问题讨论】:
-
“仅一天”是什么意思?事务表上是否有任何 datetime/smalldatetime 列?这些列是否被索引?索引是否聚集?正如其他人所问的,按计划执行的大部分工作是什么?您在上面说它会导致表扫描,但在下面您说它使用索引。让我们更好地了解实际存在的表结构和实际的执行计划属性,将使我们有更好的机会指出需要改进的地方。如果没有,我们只是在猜测。
-
该表有一个字段名 TransactionDate 是一个 SmallDateTime 字段 表的主要工作是存储互联网进行的交易,一旦我读到使用 Count(*) 比使用 Count(1) 更好,我必须为我的表创建索引,但要注意插入,因为用户会插入很多事务并且它必须非常快。谢谢(对不起我的英语)
-
@jmpena:在大多数现代数据库系统中(肯定是在SQL Server 2005)COUNT(*)和COUNT(1)的行为完全相同。对日期列的额外过滤需要更改索引,因此发布整个查询将帮助您更好地为您提供帮助。
标签: sql-server-2005 select large-data-volumes