是否有SQL ANSI方法在表的末尾开始搜索?

时间:2010-08-10 14:35:37

标签: sql database database-design ansi-sql

在某个应用程序中,我必须不断查询可能在最后插入的行中的数据。由于这个表会增长很多,我想知道是否有一种标准的方法来优化查询,使它们在表结束时开始查找。如果数据库以类似堆栈的结构存储表的数据,我想我会得到相同的optmization,所以最后会搜索最后插入的行。

10 个答案:

答案 0 :(得分:4)

SQL规范没有提及有关维护插入顺序的任何内容。在实践中,大多数体面的DB也没有维护它。然后它停在这里。首先对表进行排序不会让它变得更快。只需索引感兴趣的列(至少是您在WHERE中使用的列)。

答案 1 :(得分:3)

没有标准的方法。

在某些数据库中,您可以指定索引的排序顺序。

SQL Server允许您在索引上编写ASC或DESC:

  

[ASC | DESC]

     

确定特定索引列的升序或降序排序方向。默认值为ASC。

MySQL中,您还可以在创建索引时编写ASC或DESC,但目前忽略此操作。它可能会在未来的版本中实现。

答案 2 :(得分:3)

适当的RDBMS的“原则”之一是,这类问题不应该与您或使用数据库的任何其他人有关。

数据库引擎“免费”使用它想要存储/检索记录的任何方法,因此如果你想强制执行“顶级”行为,请执行其他建议:向表(或表)添加时间戳字段,在其上添加索引并使用它作为排序和/或查询条件进行查询(例如:您每分钟轮询一次表,并询问时间戳记> = systime-1分钟的记录)

答案 3 :(得分:2)

在表格中添加计数器或时间字段,对其进行排序并获得最高行。

换句话说:您应该忘记默认情况下以任何特定顺序访问SQL表的想法。 seqscan并不意味着将首先搜索最旧的行,只检查所有行。如果要优化某些搜索,请在某些字段上添加索引。您正在寻找的可能是索引。

答案 4 :(得分:2)

  1. 如果您的数据已编入索引,则无关紧要。索引正在进行二进制搜索,而不是顺序扫描。
  2. 除非您正在进行TOP 1(或类似的事情),否则SELECT无论如何都必须扫描整个表格或索引。

答案 5 :(得分:2)

根据Data Independence你不应该在乎。也就是说,如果您通常寻找日期范围,聚集索引可能会满足您的需求。 (排序acs / desc应该没关系,但你应该尝试一下。)

如果您发现确实需要它,您还可以shard数据库以增加最近添加的数据的性能。

答案 6 :(得分:1)

如果你有足够的行实际上有问题,并且你知道有多少“最近插入的行”应该是,你可以尝试一种循环方法。

注意:即使对于相当大的表,这也是效率较低的,但是一旦你的主表变得足够大,我就会看到这个工作对于面向用户的性能感到奇怪。

创建一个完全模仿表格结构的“临时”表格。无论何时插入主表,还要插入“临时”区域。通过使用触发器在达到任意最大值的新行(例如,10,000)时删除表中最低 id行,将“暂存”区域限制为 n 行或者你的限制是什么。)

然后,查询可以首先查找该较小的表,然后查找该信息。由于该表仅限于最后的 n 行,因此它只查看最新的数据。只有当找不到匹配项时,您的查询(实际上,此时由于决策而存储过程)才会触及您的主表。

一些问题:
1)确保您的触发器设置正确,以保持“主”和“分段”表之间的正确同意。
2)如果处理不当,这很快就会成为维护的噩梦 - 根据你的情况,这可能会有点挑剔。
3)我不能强调这在非常具体的情况下只是有效/有用。如果您的不匹配,请使用其他答案之一。

答案 7 :(得分:1)

ISO / ANSI标准SQL根本不考虑优化。例如,广泛认可的CREATE INDEX SQL DDL未出现在标准中。这是因为标准没有对底层存储介质做出任何假设,也不应该这样做。我经常使用SQL来查询文本文件和Excel电子表格中的数据,这些数据都没有任何数据库索引的概念。

答案 8 :(得分:1)

你不能这样做。

然而,有一种方法可以做一些可能更好的事情。根据表的设计,您应该能够创建一个索引,使事物几乎按输入顺序排列。例如,如果您采用创建自动增量的id字段的常规做法,那么该索引几乎按时间顺序排列。

某些RDBMS允许您声明一个向后索引,即一个下降而不是上升的索引。如果在ID字段上创建向后索引,并且优化程序使用该索引,则它将首先查看最新的条目。这将为您提供第一行的快速响应。

下一步是让优化器使用索引。您需要使用说明计划来查看是否正在使用索引。如果按id递减的顺序请求行,优化器几乎肯定会使用向后索引。如果没有,您可以使用提示来指导优化器。

如果您仍然需要避免阅读所有行以避免浪费时间,您可以使用LIMIT功能声明您只需要10行,不多行,或1行而不是更多行。应该这样做。

祝你好运。

答案 9 :(得分:0)

如果你的表有一个创建日期,那么我将按此反向排序并取得前1个。