我有一个简单的问题,有两个选项来获取SQL服务器中的行数(2005)。我正在使用VS 2005.有两种方法可以计算:
SELECT id FROM Table1 WHERE dt >= startDt AND dt < endDt;;
我从缓存中的上面调用中得到一个id列表,然后我按List.Count计算。另一种选择是
SELECT COUNT(*) FROM Table1 WHERE dt >= startDt AND dt < endDt;
以上通话将直接获得计数。问题是我在第二种方法中遇到了几种例外情况:超时。我发现table1太大了,有数百万的数据。当我使用第一个选项时,似乎没问题。
我对Count()比获取所有行所花费的时间更多感到困惑(是真的吗?)。不确定使用Count()的聚合调用是否会导致SQL服务器在服务器端创建临时表或缓存,并且当表太大时会导致性能降低?我不确定获得点数的最佳方式是什么?
答案 0 :(得分:1)
您应该在dt
列上add an index ,然后它应该非常快。
CREATE INDEX ix_Table1_dt ON Table1 (dt)
如果你有很多行(我假设你这样做),创建索引可能需要很长时间。
答案 1 :(得分:1)
将索引放在dt
字段上并使用COUNT(id)
(假设id设置为NOT NULL)
SELECT COUNT(id) FROM Table1 WHERE dt >= startDt AND dt < endDt;
另外,COUNT(id)
vs COUNT(*)
在您的情况下并不重要。
答案 2 :(得分:1)
执行此操作时会发生什么
SELECT COUNT(id) FROM Table1 WHERE dt >= startDt AND dt < endDt;
请记住,当COUNT(*)执行
时,COUNT(id)不计算NULLS你的WHERE子句中的列有索引吗?
答案 3 :(得分:0)
正如Mark建议的那样,添加一个索引,然后使用COUNT(*)。你在选项1中传输大量数据只是为了计算它然后扔掉它。