更快地获取查询

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?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是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的问题,现在一切都非常清楚,非常聪明,谢谢

以上是关于更快地获取查询的主要内容,如果未能解决你的问题,请参考以下文章

如何优化限制查询以更快地从大表中访问数据?

是否有任何 jar 可用于在 java 中更快地执行 sql 查询? [关闭]

如何优化限制查询以便从庞大的表中更快地访问数据?

更快地查询一个二进制(1)字段或 8 位字段?

使用变量过滤器更快地进行 PostgreSQL 查询

如何在 Postgis 上更快地进行选择查询