代码之家  ›  专栏  ›  技术社区  ›  Rashmi Pandit

这两个查询效率更高?

  •  3
  • Rashmi Pandit  · 技术社区  · 17 年前

    我有一个带有用户ID、电子邮件、默认列的表。默认存储“y”或“n”,具体取决于电子邮件是否为用户默认电子邮件。每个用户只能有一个默认电子邮件。

    当用户在表上执行更新或插入操作时,在我的SP中,我将检查用户是否已将isdefault传递为“y”。如果是这样,我需要更新该用户的所有条目,使其成为默认的“n”。我的问题是:考虑到没有锁定问题(不超过一个线程将为特定用户从表中请求数据),以下查询中的一个最耗时:

    update table
    set default = 'N'
    where user_id = 'abc'
    and default = 'Y'
    

    (当默认值为“Y”时的开销)

    或

    update table
    set default = 'N'
    where user_id = 'abc'
    

    (更新用户所有记录的开销)

    5 回复  |  直到 17 年前
        1
  •  1
  •   Lucas Wilson-Richter    17 年前

    这里没有明确的答案。如果大多数记录的默认值为“n”,那么在第一种情况下,您的效率将是最好的。在第二种情况下,最好是在大多数情况下默认为“Y”。

    因此,如果大多数用户只有一个电子邮件地址,请使用第二个查询。如果大多数用户至少有2个,请使用第一个。

        2
  •  5
  •   Aaron Alton    17 年前

    有99%的把握,我可以说第一个查询会更有效。

    很可能你的集群密钥是用户ID,所以你的更新语句会很快找到要更新的行。在SQL Server中,更新从逻辑上实现为先删除后插入,因此它可能是一个相当昂贵的操作(相对于简单的查找而言)。

    再加上更新需要对记录使用独占锁这一事实,所有符号都指向语句1。

        3
  •  1
  •   Jonathan Parker    17 年前

    为什么不自己试试呢?在SQL Management Studio中,逐个运行这两个查询,并启用“包括实际执行计划”。百分比越高,查询越慢。

        4
  •  1
  •   Gary Myers    17 年前

    在Oracle方面,我会选择选项1。某种程度上。

    我有一个独特的索引强制每个用户只有一个默认条目,然后我将使用该索引中的函数作为更新的一部分。只更新需要更新的行。此外,唯一索引还可以最小化为给定用户获取默认电子邮件所需的工作,不仅是为了更新,而且还可以在使用该函数获取行的任何地方进行。

    drop table user_email;
    
    create table user_email 
    (userid varchar2(4) not null, default_ind varchar2(1) not null, 
    email varchar2(30));
    
    create unique index ue_x on user_email 
      (userid, decode(default_ind,'Y','Y',email));
    
    insert into user_email (userid, default_ind, email) values ('fred','N','a');
    insert into user_email (userid, default_ind, email) values ('fred','N','b');
    insert into user_email (userid, default_ind, email) values ('fred','Y','c');
    
    update user_email
    set default_ind = 'N'
    where userid = 'fred'
    and decode(default_ind,'Y','Y',email) = 'Y';
    
    update user_email
    set default_ind = 'Y'
    where userid = 'fred'
    and email = 'a';
    

    ps.“where default='y'check”的开销非常小,因为您无论如何都需要访问该列来更新它。

        5
  •  0
  •   Jeremy    17 年前

    查询的速度取决于几个因素,例如表中的行数、索引、检查约束以及外键和主键。

    至少在SQL Server中,确定哪个更快的最佳方法是在运行查询时使用include客户机统计信息和执行计划。比较每种方法的时间并选择最佳方法。