当前位置: 首页 > 面试题库 >

SQL NOT IN可能存在性能问题

谢承
2023-03-14
问题内容

我试图重构一些旧代码…我重构了下面的当前代码,并突出显示了NOT IN导致性能问题的语句。我试图NOT IN用左外部联接重写该部分。

任何人都可以提供帮助,或者在可能的情况下提出更好的建议吗?

SELECT 
    left(unique_id,16) AS casino_id , 
    right(unique_id,24) AS game_id   
FROM (  
        SELECT 
            distinct o.casino_id + g.game_id AS unique_id      
        FROM 
            game g INNER JOIN Bet b
            ON g.game_id = b.game_id
            INNER JOIN CasinoUser u 
            ON b.user_id = u.user_id
            INNER JOIN onewalletcasino o  
            ON u.casino_id = o.casino_id
        WHERE 
            game_start between dateadd(mi, -180, getdate()) 
            and dateadd(mi, -5, getdate())  
            and b.[status] <> 'P'
     ) t 
WHERE  
   unique_id NOT in  
    ( SELECT casino_id + game_id  AS casino_id 
      FROM 
        thirdpartysettlecalled  
      WHERE 
        [status] = 'Y')
ORDER BY casino_id

问题答案:

您有一个列级联,可防止任何索引的使用

尝试不存在将分别支持2列

SELECT distinct
     o.casino_id, g.game_id
FROM 
    game g 
    INNER JOIN 
    Bet b ON g.game_id = b.game_id
    INNER JOIN
    CasinoUser u ON b.user_id = u.user_id
    INNER JOIN
    onewalletcasino o  ON u.casino_id = o.casino_id
WHERE 
    game_start between dateadd(mi, -180, getdate()) 
                       and dateadd(mi, -5, getdate())  
    and
    b.[status] <> 'P'
    AND
    NOT EXISTS (SELECT *
           FROM 
              thirdpartysettlecalled   tp
           WHERE 
              tp.[status] = 'Y'
              AND
              tp.casino_id = o.casino_id AND tp.game_id = g.game_id)
ORDER BY
    casino_id

之后,检查您的索引或课程…

这也是EXCEPT的一个很好的用法(ORDER BY像UNION一样结束了:感谢@Damien_The_Unbeliever)

SELECT distinct
     o.casino_id, g.game_id
FROM 
    game g 
    INNER JOIN 
    Bet b ON g.game_id = b.game_id
    INNER JOIN
    CasinoUser u ON b.user_id = u.user_id
    INNER JOIN
    onewalletcasino o  ON u.casino_id = o.casino_id
WHERE 
    game_start between dateadd(mi, -180, getdate()) 
                       and dateadd(mi, -5, getdate())  
    and
    b.[status] <> 'P'

EXCEPT
SELECT tp.casino_id, tp.game_id
FROM thirdpartysettlecalled   tp
WHERE tp.[status] = 'Y'

ORDER BY
    casino_id


 类似资料:
  • 在Python中,有没有一种简单的方法可以删除一个字典的属性,当这个属性可能一开始就不存在的时候? 如果使用语句,则结果为KeyError: 使用if语句有点冗长,必须键入和两次: 正在查找与类似的内容,如果该属性不存在,则默认为值:

  • 我一直在尝试在SpringMVC中使用thymeleaf布局方言,如中所述https://github.com/ultraq/thymeleaf-layout-dialect.我的springservlet如下所示 我已将所有模板文件保存在/WEB-INF/templates/中。当我在thymeleaf中使用以下代码创建和使用诱惑时 我发现以下错误: 如果我不布局:decorator=“layo

  • 我看到有一条eslint规则,,用于禁止。 在规则的描述中,它声明一个添加。 但是,当我查看MDN函数文档时,“简单示例”显示了一个包含的示例,但没有说明这可能是性能问题的原因。 是否如eslint文档所建议的那样是一个实际的性能问题? 如果是,怎么做?

  • 前言 在应用程序运行过程中,如果内存出现了问题,具体有怎样的体现 内存问题的外在表现 1.页面出现延迟加载或经常性暂停(限定网络情况正常) 2.页面持续性出现糟糕的性能(限定网络情况正常) 3.页面的性能随时间延长越来越差(限定网络情况正常) 界定内存问题的标准 1.内存泄漏:内存使用持续走高 2.内存膨胀:在多数设备上都存在性能问题 3.频繁垃圾回收:通过内存变化图进行分析 监控内

  • 问题内容: 我在Java2D方面表现有些古怪。我知道sun.java2d.opengl VM参数可以为2D启用3D加速,但是即使使用该参数也有一些奇怪的问题。 这是我运行的测试结果: 在JComponent上绘制具有32x32像素图块的25x18地图, 图像1 = .bmp格式,图像2 = .png格式 没有-Dsun.java2d.opengl = true 使用.BMP图像1的120 FPS使

  • 最近,我们将数据库从11g更新为19c。 在新数据库版本中测试应用程序时,我们遇到了一个特定视图的性能问题,该视图工作得非常好,但在19c中会导致性能问题。 在分析计划时,我们看到执行计划发生了巨大变化,这导致了19c中视图的性能非常差。 令人惊讶的是,其他观点的效果很好。 如果你能对这个问题有所了解,那就太好了。 谢谢你,JD