优化SQL Server WHERE子句条件中的CASE WHEN语句

2023-12-23

我正在重写我的 sql 以减少执行成本,并想知道是否有一种有效的方法来编写 WHERE 条件中使用的以下 CASE WHEN 语句:

SELECT l.*,tg.*
FROM  RefTable tg, 
      InputTbl l
WHERE tg.areascheme = l.areascheme
  AND tg.countrycode = l.strareabriefnamel1  
  AND ( CASE WHEN l.strareabriefnamel2 IS NULL THEN '' ELSE tg.areacode END ) = COALESCE( l.strareabriefnamel2,'' )
  AND ( CASE WHEN l.strareabriefnamel3 IS NULL THEN '' ELSE tg.subareaname END ) = COALESCE( l.strareabriefnamel3,'' )
  AND ( CASE WHEN l.strareabriefnamel4 IS NULL THEN '' ELSE tg.postalname END ) = COALESCE( l.strareabriefnamel4,'' )
  option( MAXDOP 0 ); 

Execution Plan :- enter image description here

更多细节 :-

InputTable(466K记录)共有四个参与JOIN逻辑的字段,共有16种可能的(NULL,NOT NULL)组合。

L1,  L2,  L3,  L4
NULL,NULL,NULL,NULL
NULL,NULL,NULL,NOT NULL
NULL,NULL,NOT NULL, NULL
NULL,NULL,NOT NULL,NOT NULL
NULL,NOT NULL,NULL,NULL
NULL,NOT NULL,NULL, NOT NULL
NULL,NOT NULL, NOT NULL,NULL
NULL,NOT NULL,NOT NULL,NOT NULL
NOT NULL,NULL,NULL,NULL
NOT NULL,NULL,NULL,NOT NULL
NOT NULL,NULL,NOT NULL,NULL
NOT NULL,NULL,NOT NULL,NOT NULL
NOT NULL,NOT NULL,NULL,NULL
NOT NULL,NOT NULL,NULL,NOT NULL
NOT NULL,NOT NULL,NOT NULL,NULL
NOT NULL,NOT NULL,NOT NULL,NOT NULL

RefTable(45k 条记录)将参与与 InputTable 的 JOIN 逻辑,根据上述标准生成结果集,生成约 3.51 亿行。

我的输入数据目前只满足两种情况。

输入表:-

NULL,NULL,NULL,NULL - 225776 rows
NOT NULL, NOT NULL, NULL, NULL - 240360 rows

任何意见将不胜感激。谢谢。


简单规则:Never在中使用逗号FROM条款。Always使用明确、正确的JOIN syntax.

这可能不会改变查询的性能,但这是一种更典型的编写方式。我很确定其意图是:

SELECT l.*, tg.*
FROM RefTable tg JOIN
     InputTbl l
     ON tg.areascheme = l.areascheme AND tg.countrycode = l.strareabriefnamel1  
WHERE (l.strareabriefnamel2 IS NULL OR tg.areacode = l.strareabriefnamel2) AND
      (l.strareabriefnamel3 IS NULL OR tg.subareaname  = l.strareabriefnamel3) AND
      (l.strareabriefnamel4 IS NULL OR tg.postalname = l.strareabriefnamel4)
  option( MAXDOP 0 ); 

优化此查询的起点是索引。我会建议:RefTable(areascheme, countrycode) and InputTbl(areascheme, strareabriefnamel1).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化SQL Server WHERE子句条件中的CASE WHEN语句 的相关文章

  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • SQL Server 数据库架构版本控制和更新

    对于我的应用程序 我必须支持更新方案 并且数据库可能会受到影响 我希望能够从旧版本更新到最新版本 而无需安装中间版本 例如 假设我有版本 A 最旧的版本 B 中间版本 和 C 新版本 我希望能够将版本 A 直接更新到版本 C 对于应用程序文
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR
  • 在 SQL Server 中选择 XML 元素

    我有一些 XML 需要使用 SQL Server 2008 进行解析 我想我已经接近得到我想要的了 但是我没有正确的语法 我相信 我有以下内容 DECLARE doc XML SET doc
  • 如何在 sql 2005 或 2008 中使列区分大小写

    是否可以根据列更改默认排序规则 我想让 1 列区分大小写 但其他所有列都不区分大小写 ALTER TABLE ALTER COLUMN允许更改单个列的排序规则 alter table Foo alter column Bar ntext c
  • 如何创建从表中最大值开始的 Oracle 序列?

    尝试在 Oracle 中创建一个以特定表中的最大值开始的序列 为什么这不起作用 CREATE SEQUENCE transaction sequence MINVALUE 0 START WITH SELECT MAX trans seq
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • SQL Server 选择所需存储过程的查询帮助

    我正在努力解决在存储过程中构造 sql select 查询所需的逻辑 我的数据库使用股票市场数据 我有一个 2012 年交易日期表 一个股票代码表以及一个通过网络服务列出这些代码和交易日期的每日定价数据表 我正在尝试从我正在处理的选择查询中
  • 如何在SQL Server中获取与正则表达式匹配的字符串的一部分

    我有一个要求 我需要解析列值以获取与其关联的工作请求编号 例如 列值可能包含 致力于 AB 0012589 or AB 0012589 已完成 或其中包含工作请求编号的任何内容 Here AB 0012589是工作请求编号 工作请求编号的格
  • 发布Oracle和SQL Server性能测试是否违反许可? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想对Oracle和SQL Server中的空间索引进行性能测试 我想将其纳入我的理学硕士工作中 发布此类结果是否违反 dbms 的许可 也许有人已经
  • SQL Server 列的默认随机 10 个字符串值

    我有一个专栏rndm在我的桌子上 客人 现在 对于领域Default value or Binding对于表 每当插入新行时 我想自动将 10 个字符的随机字符串插入到该列中作为默认值 该随机字符串不能包含特殊字符 只能包含以下字符a zA

随机推荐

  • 使用 AutoFac 2 避免服务定位器

    我正在构建一个使用 AutoFac 2 进行 DI 的应用程序 我去过reading http code google com p autofac wiki BestPractices应避免使用静态 IoCHelper 服务定位器 IoCH
  • 什么样的下载代码违反了App Store审核指南?

    应用商店审查指南指出 以任何方式或形式下载代码的应用程序都将被拒绝 我想制作一个使用挑战响应进行身份验证的应用程序 该应用程序拥有 SHA 1 SHA 256 MD5 DES AES 等一组基本算法 挑战服务器制作包含随机排列的算法名称数组
  • PHP 一次提供一页服务

    我正在运行 Apache 2 和 PHP 5 2 配置 由于某种原因 PHP 一次只能提供一页服务 我有两个页面最能说明问题 test1 php 和 test2 php test1 php 中只有 sleep 120 test2 php 有
  • 2015 年的 signalr 3.0 beta 是否可用?

    想要将 Signalr 代码移植到 vnext 项目中 但我没有看到 SignalR 3 x 的参考 您需要在您的包中引用该包project json文件 像这样 dependencies Microsoft AspNet SignalR
  • 鼓励 JVM 进行 GC 而不是增加堆?

    请注意 当我说 JVM 时 我真正的意思是 热点 并且我正在运行最新的 Java 1 6 更新 示例情况 我的 JVM 正在运行 Xmx 设置为 1gb 目前 堆已分配 500mb 其中 450mb 已使用 该程序需要在堆上再加载 200
  • python中的正则表达式组重复

    string input ports 6012 6017 6016 m re match input ports s d 4 s d 4 s d 4 string print m groups gt 6012 6017 6016 但是当我想
  • elasticsearch聚合按聚合比率排序

    我在分析中有一个场景 我想计算表现最差的 20 个网点在 1000 多家门店中performance transactionCount VisitCount每月在折扣店 映射是 CustomerVisit properties outlet
  • 为什么 64 位机器上会出现内存碎片问题?

    在 32 位机器中 每个进程获得 4GB 的虚拟空间 在这种情况下 人们可能会担心我们可能会因为碎片化而遇到麻烦 但对于 64 位机器 理论上我们拥有巨大的可寻址虚拟内存 那么为什么内存碎片在 64 位机器中仍然是一个问题 如果有的话 您尝
  • HTML5 模板无法在 Internet Explorer 上运行,如何解决?

    我用 HTML5 制作了一个模板 它适用于 Chrome 和 Firefox 但不适用于 Internet Explorer 在 IE 8 上测试 我怎么解决这个问题 只需将 display none 添加到您的模板中即可 适用于 11
  • asyncio 的默认调度程序什么时候公平?

    我的理解是asyncio gather旨在运行其参数同时此外 当协程执行等待表达式时 它为事件循环提供了安排其他任务的机会 考虑到这一点 我惊讶地发现以下代码片段忽略了其中一个输入asyncio gather import asyncio
  • 通过 WSDL/SoapServer 解析 SOAP 响应

    我需要接受包含一些数据的不可修改的 SOAP 消息 它被发布到我的 WSDL 文件 然后是 PHP SoapServer 如何通过 wsdl 或 php 提取消息中的特定数据 封装在 xml 键中 Data flow actions are
  • 将值数组从 Android Activity 传递到 WebView 中的 JavaScript

    我正在使用 JS Charts 库在 Android 应用程序的 WebView 中绘制图表 我想提供 SQLite 数据库中的数据 此时此刻 我陷入了如何将数据数组从 Java 传递到 JavaScript 的困境 JavaScript
  • 在 jTable 中移动一行

    如何将一排移入jTable以便row1去row2的位置和row2去row1的立场 Use the moveRow 的方法DefaultTableModel 或者 如果您不使用 DefaultTableModel 则在自定义模型中实现类似的方
  • 禁用 VSCode 提示:“您要保存工作区配置吗”?

    使用最新发布的 VSCode 版本 在撰写本文时 2018 年 1 月 29 日 版本 1 19 3 我看到以下行为 根据我的需要 这不必要地耗时 每当我尝试关闭从多个不同目录打开文件的窗口时 我都会收到以下提示 您想将工作区配置保存为文件
  • RavenDB 嵌套可变长度数组上的 Map/Reduce/Transform

    我是 RavenDB 的新手 到目前为止我很喜欢它 我还需要为我的项目创建一个索引 问题 我有数千份调查回复 即 Submissions 并且每个提交都有一系列特定问题的答案 即 Answers 每个答案都有一系列已选择的选项 即 Valu
  • jQuery 选择器与 React 可以吗?

    我知道混合 jQuery 和 ReactJS 是不可取的 因为 ReactJS 不知道 jQuery 对 DOM 所做的任何修改 但是 如果您仅使用 jQuery 轻松便捷地查询 DOM 和查找节点 而将所有 DOM 编辑工作留给 Reac
  • 关于Python中numpy数组如何存储的一些困惑

    在 Python 中使用数据类型 numpy 数组时 我遇到了一些困惑 问题1 我在 python 解释器中执行以下脚本 gt gt gt import numpy as np gt gt gt L 1000 2000 3000 gt gt
  • 带参数的 Docker ENTRYPOINT shell 形式

    当我有一个包含以下行的 Docker 映像 Spring Boot 微服务 时 ENTRYPOINT java org springframework boot loader JarLauncher 我可以使用例如启动容器 docker r
  • 安装 pywin32 时出现问题

    我正在尝试为 Python 2 6 安装 pywin32 我安装了 python 但它不在常规的 c 驱动器中 而是在 d 驱动器上 pywin32 安装程序找不到它 我无法提供它的自定义路径 我查了一下 python文件夹就是路径 这个问
  • 优化SQL Server WHERE子句条件中的CASE WHEN语句

    我正在重写我的 sql 以减少执行成本 并想知道是否有一种有效的方法来编写 WHERE 条件中使用的以下 CASE WHEN 语句 SELECT l tg FROM RefTable tg InputTbl l WHERE tg areas