`
hdu0704
  • 浏览: 12783 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

是否该用max(id)查询最大值

 
阅读更多

       在数据库中,当你需要查出某表中sts=‘Y’的最大id时,你是否会认为select max(id) from table_name where sts='Y';便是最优解。OK,我们可以先看下执行计划(以oracle为例,可以通过PL/SQL Developer的F5查看)


从执行计划中可以看出,首先进行全表扫描(TABLE ACCESS FULL),全表扫描是为了筛选sts='Y'的记录,然后经过排序(SORT AGGREGATE)才得到id最大值的那条记录。如果当数据量达到上百万或者上千万的时候,这将是一个非常耗时的操作(对某张1000W数据的表进行测试,用了将近20秒)。这里最大的问题是没能用上索引,id由于没能在筛选条件中,所以用不到,由于sts='Y'的比例过高,CBO(Cost-Based Optimization,基于代价的优化方式)模式下的优化器根据统计信息也不会将sts作为索引进入。

 

       那如何能用上id列的索引呢?我们可以使用子查询的方式select * from (select id from table_name where sts='Y' order by id desc)where rownum=1;同样贴上执行计划

由于使用了order by id desc对id进行排序,所以执行时会先进行索引倒序扫描(INDEX FULL SCAN DESCENDING),通过索引一条条地获取表数据,当判断获取的数据为sts='Y'时则停止(COUNT STOPKEY,使用where rownum=n时均是这种流程,只要获取到足够的数据就返回结果),返回那条记录。所以当筛选条件并不严格时,很有可能查第一条就会返回结果。

 

那什么时候使用max(id)的方式,什么时候使用where rownum=1的方式呢?主要取决于数据。

我可以举这么一个简单的例子:某一本书记录着企业每个员工的信息,包括姓名、性别、生日、联系电话、籍贯等等。假设该书有两份目录,一份是以籍贯为目录,即可以很直观得看出来自某某省的员工在哪些页码,另一份是以生日为目录,以升序排列,只要知道员工的生日就能马上翻到对应的页码。现在要你找出浙江省年纪最大的员工的生日是哪一天,你会怎么做?

对应max(id)的做法是:从籍贯目录找到浙江的部分,然后扫描浙江部分的页码,找出生日最大的那个。如果当浙江的员工占了大多数的时候,你可能宁愿一页页得翻整本书,逐一比较找出浙江省生日最大的。

对应where rownum=1的做法是:从生日目录最后一条记录对应的页码开始找,如果这个人刚好是浙江的,那么恭喜你,这次的查找非常高效。如果这个公司只有一个来自浙江的,并且这个人年纪还是最小的,那么很遗憾,你要翻完整本书才能找到。

 

所以,当你对自己所要查询的数据有一个基本了解的时候,就很容易决定到底是用max(id)还是where rownum=1来查询了。

  • 大小: 10.6 KB
  • 大小: 15 KB
分享到:
评论

相关推荐

    最大值和最小值获取

    在编程领域,寻找一个数组中的最大值和最小值是一项基础且重要的任务。这通常涉及到遍历数组元素并比较它们的大小。"最值"这个标签表明我们要探讨的是关于找到数值序列中的最高和最低数值的问题。这里,我们有一个...

    SQL排除重复结果只取字段最大值分享

    如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条)。 代码如下:select * from [Sheet1$] awhere ID not exists (select 1 from [Sheet1$] where PID=a.PID and...

    getMaxMises_pythonabaqus_abaqus最大值_python_abaqus最大_

    标题“getMaxMises_pythonabaqus_abaqus最大值_python_abaqus最大_”暗示了我们要讨论的主题是使用Python脚本在ABAQUS中找到三维模型的最大von Mises应力。描述进一步明确了这个过程,即通过Python实现自动遍历计算...

    Max.rar_MPI 最大值_mpi二维数组

    在本文中,我们将深入探讨如何使用MPI(Message Passing Interface)在C++环境下,特别是在Visual C++(VC)编译器上实现一个并行算法来寻找二维数组中的最大值。MPI是一种标准化的并行计算接口,它允许程序员在...

    sql获得自动增加字段的下一个编号,不是max(id)+1

    传统的做法是通过查询当前表中的最大ID值(`MAX(id)`),然后在此基础上加1来得到下一个可用的ID。然而这种方法存在一些局限性,比如在并发环境下可能会导致ID重复的问题。因此,某些数据库系统提供了更高效且安全的...

    maxmax:从多维矩阵中找到最大值和位置-matlab开发

    [max_value max_id]=maxmax(x) max_value是矩阵x中的最大值,max_id结构在[dim1 dim2 dim3...]中,max_id的长度等于矩阵x的维数。 这种方法也可以应用于 min 和其他函数。 例如 x=rand(2,8,4); [max_value max_id]=...

    如何启用和禁用数据库连接池以及如何设置连接池最大值和最小值

    - **连接池最大值(Max Pool Size)**:定义了连接池可以拥有的最大连接数量。一旦达到这个限制,新的连接请求将等待现有连接释放。 在数据库连接字符串中设置这两个参数的方式如下: ```csharp Data Source=...

    max_str_len.rar_*[MAX_LOT_ID_LEN]_MAX_STR_LEN_max str len_maxcom

    标题中的"max_str_len.rar_*[MAX_LOT_ID_LEN]_MAX_STR_LEN_max str len_maxcom"似乎是一个压缩包文件的名称,其中包含了几个关键词,如`MAX_LOT_ID_LEN`、`MAX_STR_LEN`、`max str len`和`maxcom`。这些可能代表程序...

    django 获取字段最大值,最新的记录操作

    from django.db.models import Max Argument.objects.all().aggregate(Max(‘rating’)) 如果是从已经存在的model列表获取 from django.db.models import Max args = Argument.objects.all() args.aggregate(Max('...

    linux 进程数最大值修改方法

    实际的系统进程数上限收到3个配置项的影响: ...这个值表示进程ID的上限。为了兼容旧版,默认为32768(即两个字节)。 <code class=hljs ruby has-numbering style=display: block; padding: 0

    国家开放大学 MySQL数据库应用 实验训练2:数据查询操作

    使用 SUM() 函数查询该商城每天的销售额。使用 AVG() 函数查询所有订单的平均销售金额。使用 MAX() 函数查询所有商品中的数量最大者和所有用户按字母排序中名字最靠前者。使用 MIN() 函数查询所有商品中价格最低者。...

    百分表最大值与最小值 数据库.docx

    在SQL查询中,`SELECT MAX(score)` 和 `SELECT MIN(score)` 分别用于查找表中`score`字段的最大值和最小值。在这个例子中,查询结果显示最大分数为93,最小分数为35。这通常用于了解数据的分布范围,比如在教育场景...

    ThinkPHP5联合(关联)查询、多条件查询与聚合查询实例详解

    聚合查询经常用于统计数据,如求最大值(MAX)、最小值(MIN)、总和(SUM)等。ThinkPHP5中可以通过模型的聚合方法来实现,比如查找最大值。例如: ```php "model('admin/Package') ->where("project_id = $...

    解决SQLServer最大流水号的方法

    然后,我们使用 NEWID 函数来生成一个唯一的 GUID 值,并将其插入到 max_tradeid 表中。最后,我们使用 SELECT 语句来取得刚刚插入的最大流水号。 比较两种方法 这两种方法都可以解决 SQL Server 最大流水号的问题...

    Oracle Max函数使用中出现的问题

    Oracle Max函数是数据库查询中常用的一个聚合函数,用于找出指定列中的最大值。然而,在实际使用过程中,可能会遇到一些问题,比如在特定情况下无法正确捕获异常或返回预期结果。以下将详细解释这个问题以及可能的...

    Android关于SeekBar无法点击到最大值问题解决方法记录(推荐)

    通常情况下,当我们在布局文件中设置了一个SeekBar控件的最大值时,例如: ```xml android:id="@+id/my_seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="10...

    mysql获取分组后每组的最大值实例详解

    因此,对于获取分组后每组的最大值,正确的方法是使用`INNER JOIN`结合`GROUP BY`和`MAX`函数。这不仅能确保每个分组只返回一条记录,而且返回的是该分组内分数最高的记录。在实际应用中,要根据数据库的特性和需求...

    js代码-查找table表格数据中每一列的最大值与最小值

    该脚本提供了一个名为`findMinMax`的函数,用于查找指定表格ID的表格数据中每一列的最大值和最小值。确保表格中的数据可转换为数字。 ## 使用方法 1. 将`main.js`文件导入到你的HTML页面中。 2. 在JavaScript代码中...

    T-SQL高级查询

    按照年龄分组,年龄汇总,id找最大值 select id, age from student where age > 20 order by age compute sum(age), max(id); compute进行汇总前面是查询的结果,后面一条结果集就是汇总的信息。compute子句中可以...

    取代游标的方案:使用min()函数或max()函数;用表函数;使用临时表

    `MIN()`和`MAX()`是SQL中的聚合函数,分别用于返回一列中的最小值和最大值。在游标替换的场景下,它们可以用来实现数据的逐行访问,避免了传统游标带来的资源消耗。 #### 示例代码分析 ```sql -- 初始化变量 ...

Global site tag (gtag.js) - Google Analytics