1
7
你需要附加 SQL Profiler 或 an app level profiler like L2SProf 并在以下之前查看上下文中的实际查询成本:
当你做到了这一点,你就会明白什么是最好的方法,也就是说,选择计数是否支配一切,等等。 这样做之后,你也会知道你选择做的任何改变是否产生了积极或消极的影响。 |
2
8
总的来说
在处理单个表的简单情况下,通常会进行特定的优化,以使这样的操作更便宜。例如,做
例如,让我们考虑两个查询:
因为每个记录都满足查询,所以
在这种情况下,发动机最有可能使用
在这种情况下,
但是,如果两个目录上都有索引
|
3
2
正如其他人所说
如果您基准测试并确定成本可以忽略不计,则(当前)不会有问题。 如果这对你的场景来说太贵了,你可以让你的分页变得“模糊”,如“ 显示约30000的1到500 “通过使用
它将返回一个 近似值 行的数量(大约是因为直到检查点才更新)。 |
4
1
如果页面变慢,可以考虑的一件事是尽可能减少数据库往返次数。即使你
不是一次设置和执行5个单独的查询,而是运行
例如,如果您使用ado.net,请执行以下操作(为简洁起见省略了错误检查;为清晰起见,请执行非循环/非动态检查):
如果您使用某种orm,比如nhibernate,那么应该有一种方法来启用自动查询批处理。 |
5
0
count(*)可能特别昂贵,因为它可能导致加载(和分页)整个表,而您可能只需要主键上的count(在某些实现中,它是优化的)。 从它的声音来看,您每次都会导致一个表加载操作,这是很慢的,但除非它运行明显缓慢,或引起某种问题,不要优化:过早和不必要的优化可能会造成很大的麻烦! 对索引主键的计数要快得多,但由于有索引的代价,这可能没有任何好处。 |
6
0
所有的I/O都是昂贵的,如果没有它你可以完成任务,你应该这样做。但如果需要的话,我不会担心的。 您提到了在视图状态下存储计数,当然这是一个选项,只要该计数错误时代码的行为是可接受的,因为底层记录已丢失或已添加到。 |
7
0
这取决于您如何处理此表中的数据。如果它们经常变化,而您每次都需要它们,那么您可以创建触发器,它将填充另一个仅包含此表计数的表。如果需要单独显示这些数据,可能只需对一个特定表执行“select count(*)…”。我立刻想到了这一点,但我敢肯定还有其他方法可以加快速度。可能是缓存数据?:) |
ybou · 需要帮助从SQL 2005查询中删除过时的=*连接运算符 7 年前 |
Robert · 将多个分隔符分隔的字段视为不同的行 8 年前 |
hud · 执行存储过程会导致错误 8 年前 |
Gonzalo · 如何将存储过程的结果插入到新表中? 9 年前 |