使用 select count(*) 更新查询速度较慢
我必须计算 table2 中的数字在 table2.a 和 table2.b 范围内的数字之间出现的次数
,即我们想知道有多少次这样的情况: a <开始< b
我运行了以下查询:
UPDATE table2
SET occurrence =
(SELECT COUNT(*) FROM table1 WHERE start BETWEEN table2.a AND table2.b);
table2
ID a b occurrence
1 1 10
2 1 20
3 1 25
4 2 30
table1
ID start col1 col2 col3
1 1
2 7
3 10
4 21
5 25
6 27
7 30
table2 作为
- a、b 上的 3 个索引,出现
- 1567 行(因此我们将在 table2 上 SELECT COUNT(*) 1567 次..)
- ID 列作为 PK
table1 作为
- 上的 1 个索引
- 开始42,000,000 行
- 列开始是“按列开始排序”
- ID 列为 PK
==>花了2.5个小时才完成了2/3。我需要加快速度...有什么建议吗? :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以尝试将 id 列添加到表 1 的索引中:
并将查询重写为
这称为“覆盖索引”: http://www.simple-talk.com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/
->对表1的整个查询可以通过索引中的数据来服务->无需对实际记录进行额外的页面查找。
You could try to add the id column to the index on table 1:
And rewrite the query to
This is called "covering index": http://www.simple-talk.com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/
-> The whole query on table 1 can be served through the data in the index -> no additional page lookup for the actual record.
使用存储过程。将 COUNT 的结果保存在局部变量中,然后使用它来运行 UPDATE 查询。
Use a stored procedure. Keep the result from COUNT in a local variable, then use it to run the UPDATE query.
我会这样做
I will do this
我认为 count(*) 使数据库读取数据行,而在您的情况下它只需要读取索引。尝试:
I think count(*) makes the database read the data rows when in your case it only needs to read the index. Try: