【问题标题】:Best way to compare two sets of data w/ SQL使用 SQL 比较两组数据的最佳方法
【发布时间】:2019-04-06 10:23:19
【问题描述】:

我所拥有的是一个获取一组数据的查询。此查询在特定时间运行。然后,30 分钟后,我有另一个查询(相同的语法)运行并获取相同的数据集。最后,我有第三个查询(即有问题的查询)比较两组数据。它拉出的记录符合:如果“FEDVIP_Active”在第一个数据集中为 FALSE,在第二个数据集中为 TRUE,OR“UniqueID”不存在第一个数据集并在第二个数据集中做 AND FEDVIP_Active 为 TRUE。我质疑下面进行比较的查询的性能。 30 分钟后超时。有什么你可以看到我不应该做的事情,以便最高效地运行?我正在比较的两个完全相同的数据集各有大约一百万条记录。

获取初始数据集的第一个查询:

select Unique_ID, First_Name, FEDVIP_Active, Email_Primary
from Master_Subscribers_Prospects

第二次查询与第一次完全相同。

然后,下面的第三个查询比较数据:

select 
    a.FEDVIP_Active, 
    a.Unique_ID, 
    a.First_Name, 
    a.Email_Primary
from 
    Master_Subscribers_Prospects_1 a
inner join
    Master_Subscribers_Prospects_2 b
    on 1 = 1
where a.FEDVIP_Active = 1 and b.FEDVIP_Active = 0 or
(b.Unique_ID not in (select Unique_ID from Master_Subscribers_Prospects_1) and b.FEDVIP_Active = 1)

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    如果我理解正确,您需要第二个数据集中的所有记录,其中第一个数据集中的相应唯一 ID 不活动(不存在或将标志设置为不活动)。

    我建议exists:

    select a.*
    from Master_Subscribers_Prospects_1 a
    where a.FEDVIP_Active = 1 and
          not exists (select 1
                      from Master_Subscribers_Prospects_2 b
                      where b.Unique_ID = a.Unique_ID and
                            b.FEDVIP_Active = 1
                     );
    

    为了提高性能,您需要在Master_Subscribers_Prospects_2(Unique_ID, FEDVIP_Active) 上建立索引。

    【讨论】:

      【解决方案2】:

      1 = 1 上的内部连接是一种伪装的交叉连接,交叉连接产生的行数可以快速增长。它是所涉及的两个关系中的行数的乘积。为了提高性能,您希望中​​间结果尽可能小。

      那么当子查询的行数很大时,EXISTS 通常会比IN 表现更好。

      但我认为你根本不需要IN 或EXITS。

      假设unique_id 标识一条记录并且不为空,您可以将第一个表连接到公共unique_ids 上的第二个表。那么当且仅当第二个表中没有unique_id 的记录退出时,连接结果中第一个表的unique_id 为空,因此您可以检查。

      SELECT b.fedvip_active, 
             b.unique_id, 
             b.first_name,
             b.email_primary
             FROM master_subscribers_prospects_2 b
                  LEFT JOIN master_subscribers_prospects_1 a
                            ON b.unique_id = a.unique_id
             WHERE a.fedvip_active = 1 
                   AND b.fedvip_active = 0
                    OR a.unique_id IS NULL
                       AND b.fedvip_active = 1;
      

      对于 master_subscribers_prospects_1 (unique_id, fedvip_active) 和 master_subscribers_prospects_2 (unique_id, fedvip_active) 上的查询索引也可能有助于加快处理速度。

      【讨论】:

        【解决方案3】:

        在 where sats 中进行内部选择总是不好的。

        这是与left join 相同的版本,可能对您有用。

        select 
            a.FEDVIP_Active, 
            a.Unique_ID, 
            a.First_Name, 
            a.Email_Primary
        from 
            Master_Subscribers_Prospects_1 a
        inner join
            Master_Subscribers_Prospects_2 b on 1 = 1
        left join Master_Subscribers_Prospects_1 sa on sa.Unique_ID = b.Unique_ID 
        where (a.FEDVIP_Active = 1 and b.FEDVIP_Active = 0) or
        (sa.Unique_ID is null and b.FEDVIP_Active = 1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-03
          • 2012-02-25
          • 1970-01-01
          • 2018-03-02
          • 2015-07-04
          • 1970-01-01
          • 1970-01-01
          • 2013-06-20
          相关资源
          最近更新 更多