更快地获取查询
Posted
技术标签:
【中文标题】更快地获取查询【英文标题】:Get Query Faster 【发布时间】:2016-08-12 11:30:01 【问题描述】:我创建一个表如下:
CREATE TABLE [dbo].[Table_10](
[Name] [nchar](10) NULL,
[Date] [datetime] NULL
)
在 [日期] 创建聚集索引后
CREATE CLUSTERED INDEX index_name10
ON dbo.table_10 ([Date]);
然后用 80K 的数据随机填充表格(但在有序的日期时间)
运行此查询并完成大约 1 分钟
我希望它运行得更快,因为我认为嵌套查询可以在对数时间内完成。但似乎不是,我错在哪里或者如何更快地做到这一点?
SELECT Table_10.[date], (SELECT COUNT(*) FROM
Table_10 AS t10
WITH(INDEX(index_name10))
WHERE table_10.[date] < t10.[Date])
FROM table_10
【问题讨论】:
这适用于哪个 RDBMS?请添加标签以指定您使用的是mysql
、postgresql
、sql-server
、oracle
还是db2
- 或其他完全不同的东西。
添加了sql-server标签
按日期时间排序插入并不重要。对于 DBMS,该表仍然是一组无序的数据。
【参考方案1】:
您似乎正在使用 SQL Server。为此,您可以使用rank()
:
select t.*,
(rank() over (order by [date]) - 1)
from table_10;
如果[date]
没有重复项,那么改用row_number()
会更清楚:
select t.*,
(row_number() over (order by [date]) - 1)
from table_10;
- 1
是唯一需要的,因为您似乎想从 0 而不是 1 开始编号。
【讨论】:
感谢另一个解决方案,但我的主要问题是为什么我的代码运行缓慢?通过创建索引,我希望执行速度更快 @mojtaba357 。 . .您的查询运行缓慢,因为这是表达您想做的事情的错误方式。 @GordonLinoff 你能解释一下吗?哪种方法是正确的? @MtwStark:Gordons 查询读取数据一次,排序,编号,完成。您的读取每条记录的记录,并为每条记录查找日期较短的所有记录。即使使用了索引,也必须一次又一次地扫描该索引树。这需要很长时间。很明显。 @ThorstenKettner 对不起。。我没有仔细看Gordon的问题,现在一切都非常清楚,非常聪明,谢谢以上是关于更快地获取查询的主要内容,如果未能解决你的问题,请参考以下文章