如何优化此查询(或内部 AND 验证)?

     2023-04-14     5

关键词:

【中文标题】如何优化此查询(或内部 AND 验证)?【英文标题】:How Can I optimize this query (OR inside AND validation)? 【发布时间】:2011-11-29 19:25:20 【问题描述】:

我遇到了这个查询的问题:

SELECT col1, col2,col3,...,coln FROM MyTable
WHERE col1 = @value1
AND
(
ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c'))
OR
ISNULL(col3,'c') = ISNULL(@value2,ISNULL(col3,'c'))
)
 AND coln = 'valueN'

我必须停止执行,太慢了。但编辑:

SELECT col1, col2,col3,...,coln FROM MyTable
WHERE col1 = @value1
AND
(
ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c'))
)
AND coln = 'valueN'

这个查询速度更快。有人能帮我吗?如何替换 or 语句或替换查询但验证 col1 和 col2?。 谢谢。

更新:

非常感谢你们。真的,我的查询不使用'=',而是使用'Like',对此感到抱歉。但是,我使用您的建议来构建我的查询并且效果很好:

SELECT col1, col2,col3,...,coln FROM MyTable
WHERE col1 like '%' + @value1 + '%'
AND
(
 (@value2 IS NULL)
 OR
  (col2 IS NOT NULL AND col2 LIKE '%' + @value2 + '%')
 OR
 (col3 IS NOT NULL AND col3 LIKE '%' + @value2 + '%')
)
 AND coln = 'valueN'

我将此查询与一个页面一起使用,其中我有许多字段来过滤搜索,并且我需要一个 col2 文本框也适用于数据库中的 col3,我的意思是,数据库中只有一个用于 name1 和 name2 的文本框。

对不起,我的错误问题,感谢您的建议。

【问题讨论】:

您能否根据 value2 是否为空来更改参数化查询?坏情况的查询计划有什么明显的地方吗? 感谢您的回答。 Adrian 解决方案工作正常,查询必须验证必要的,而不是像我总是验证的旧查询。 【参考方案1】:
ISNULL(col2,'c') = ISNULL('value2',ISNULL(col2,'c'))

一样
col2 = 'value2' or (col2 is null and 'value2' is null)

替换出现的次数,您很可能会获得更好的性能。

更新

此解决方案与@onedaywhen 提出的解决方案有一个根本区别:当'value2' 中提供的值(我想这只是一个组装成SQL 字符串的参数)是NULL 时,OP 只想带仅返回 col2 为 NULL 的记录。仔细看看 OP 的逻辑,你会在那里看到。 OP的逻辑总是过滤:当参数为NULL时,OP想要col2 is NULL的记录。

@onedaywhen 的解决方案在参数为NULL 时带来every 记录。虽然这是一个非常常见的查询,但这不是 OP 正在寻找的

【讨论】:

工作正常!!。非常感谢。 您的断言(“相同”)是错误的。考虑ISNULL('value2',ISNULL(col2,'c')) 将始终评估为“value2”。 ...即使您将'value2' 更正为@value2,您的建议也不等同于OP! @onedaywhen 我同意value2 应该是@value2。也就是说,仔细查看 OP 的逻辑,您会看到 OP 的要求:查询将始终过滤!如果参数为 NULL,OP 只想带 col2 为 NULL 的记录,不是每条记录。 你同意如果列和参数值都为空,那么ISNULL逻辑会认为它们都是c吗?这有效地改变了 SQL 的 3VL 逻辑,以便NULL = NULL 为该谓词计算 TRUE。请参阅我的更新答案以进行演示:)【参考方案2】:
ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c'))

一样
( ( col2 = @value2 ) OR ( @value2 IS NULL ) ) 

但我不确定这是否会提高性能:我已经阅读过 to get an efficient, scalable and performant solution either use IF ELSE control of flow blocks (one per parameter combination) or use dynamic SQL,至少对于 SQL Server 2005 及更早版本。


更新:...这是证据:


查询一:当参数为非空值时:

DECLARE @value2 VARCHAR(10);
SET @value2 = 'Apples';
WITH T 
     AS 
     (
      SELECT * 
        FROM (
              VALUES (1, 'When col2 is null', NULL), 
                     (2, 'When col2 is the same value as @value2', 'Apples'), 
                     (3, 'When col2 is not the same value as @value2', 'Oranges')
             ) AS T (ID, narrative, col2)
     )
SELECT *, 
       CASE WHEN ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c')) THEN 'T' END AS OP, 
       CASE WHEN ( ( col2 = @value2 ) OR ( @value2 IS NULL ) ) THEN 'T' END AS OneDayWhen, 
       CASE WHEN col2 = @value2 or (col2 is null and @value2 is null) THEN 'T' END AS Adrian
  FROM T;

输出 1:

ID          narrative                                  col2    OP   OneDayWhen Adrian
----------- ------------------------------------------ ------- ---- ---------- ------
1           When col2 is null                          NULL    NULL NULL       NULL
2           When col2 is the same value as @value2     Apples  T    T          T
3           When col2 is not the same value as @value2 Oranges NULL NULL       NULL

注意所有行都同意:)


查询2:当参数为空时:

DECLARE @value2 VARCHAR(10);
SET @value2 = NULL;
WITH T 
     AS 
     (
      SELECT * 
        FROM (
              VALUES (1, 'When col2 is null', NULL), 
                     (2, 'When col2 is the same value as @value2', 'Apples'), 
                     (3, 'When col2 is not the same value as @value2', 'Oranges')
             ) AS T (ID, narrative, col2)
     )
SELECT *, 
       CASE WHEN ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c')) THEN 'T' END AS OP, 
       CASE WHEN ( ( col2 = @value2 ) OR ( @value2 IS NULL ) ) THEN 'T' END AS OneDayWhen, 
       CASE WHEN col2 = @value2 or (col2 is null and @value2 is null) THEN 'T' END AS Adrian
  FROM T;

输出 2:

ID          narrative                                  col2    OP   OneDayWhen Adrian
----------- ------------------------------------------ ------- ---- ---------- ------
1           When col2 is null                          NULL    T    T          T
2           When col2 is the same value as @value2     Apples  T    T          NULL
3           When col2 is not the same value as @value2 Oranges T    T          NULL

注意 OP 和 OneDayWhen 匹配所有行,Adrian 仅匹配行 ID = 1。

【讨论】:

你是对的。但我敢打赌,OP 想要 Adrian 的逻辑。 @ypercube:我会接受这个赌注;) @ypercube 请花点时间阅读我的答案更新。谢谢

第15天sql进阶-查询优化-慢查询日志(sql小虚竹)

...-查询优化-慢查询日志初始化数据解法慢查询日志是什么如何开启慢查询日志第一种方式windows实战slow_query_log一直为off,没生效验证linux实战验证第二种方式实操验证关闭慢查询日志第一种方式 查看详情

使用 Oozie 在 Hive 上执行查询时,如何解决“只能使用 kerberos 或 Web 身份验证颁发委托令牌”?

】使用Oozie在Hive上执行查询时,如何解决“只能使用kerberos或Web身份验证颁发委托令牌”?【英文标题】:Howtofix"DelegationTokencanbeissuedonlywithkerberosorwebauthentication"whenexecutingqueryoverHiveusingOozie?【发布时间】:2017-06-0519:30:47【... 查看详情

如何对 Azure 时间序列洞察查询 API 进行身份验证?

】如何对Azure时间序列洞察查询API进行身份验证?【英文标题】:howtoauthenticatetoAzuretimeseriesinsightsqueryAPI?【发布时间】:2019-04-1106:57:03【问题描述】:在尝试查询/environments端点时,我不断收到AuthenticationFailed错误和InvalidAuthenticati... 查看详情

net命令用不了,提示:不是内部或外部命令

...台计算机是使用NET命令时,提示说不是内部或外部命令,如何解决?在线等候。。。参考技术A关于telnet命令的提示,判断是和NTLM身份验证有关.关于NTLM身份验证的设置可以通过修改注册表来达到.HKEY_LOCAL_MACHINESOFTWAREMicrosoftTelnetServ... 查看详情

如果它正在创建或更新项目,请区分内部模型“验证”?

【中文标题】如果它正在创建或更新项目,请区分内部模型“验证”?【英文标题】:Differentiateinsidemodel`validate`ifitiscreatingorupdatinganitem?【发布时间】:2016-04-0719:29:44【问题描述】:我正在寻找使用this.isNewRecord以外的其他方式。... 查看详情

PyTorch:为啥在训练时期循环内部或外部调用验证准确性会发生变化?

】PyTorch:为啥在训练时期循环内部或外部调用验证准确性会发生变化?【英文标题】:PyTorch:Whydoesvalidationaccuracychangeoncecallingitinsideoroutsidetrainingepochsloop?PyTorch:为什么在训练时期循环内部或外部调用验证准确性会发生变化?【... 查看详情

vue不是内部或外部命令解决验证方案

...全局安装3.完成以上2步后,使用vue指令,会显示“vue不是内部或外部命令”二、解决步骤1.在电脑内搜索vue.cmd2.将vue.cmd的路径加入Path环境变量中,以;分隔,如我的路径是“E: odejs ode_modules pm ode_global_modules 查看详情

如何远程验证电子邮件或检查电子邮件是不是存在

】如何远程验证电子邮件或检查电子邮件是不是存在【英文标题】:HowtoRemotevalidateemailorcheckifemailexists如何远程验证电子邮件或检查电子邮件是否存在【发布时间】:2012-12-3113:19:51【问题描述】:我正在尝试检查注册时是否存在... 查看详情

Laravel 验证使用 eloquent 或 raw 查询

】Laravel验证使用eloquent或raw查询【英文标题】:Laravelvalidationuseseloquentorrawquery【发布时间】:2017-11-1312:36:42【问题描述】:我有一个与laravel验证相关的问题,我的问题是当我们应用唯一或存在等规则时,通过eloquent模型进行验证... 查看详情

由于设置不正确,触发器内部更新失败

...确用于索引视图和/或计算列上的索引和/或过滤索引和/或查询通知和/或XML数据类型 查看详情

如何优化 libsvm matlab 的交叉验证?

】如何优化libsvmmatlab的交叉验证?【英文标题】:howtooptimizethecrossvalidationforlibsvmmatlab?【发布时间】:2015-01-0804:30:17【问题描述】:我正在使用libsvm进行分类。我正在使用交叉验证来调整参数C和gamma。没有。我用于交叉验证的观... 查看详情

如何在 python 中以管理员身份进行身份验证、查询和变异 Hasura? [关闭]

】如何在python中以管理员身份进行身份验证、查询和变异Hasura?[关闭]【英文标题】:Howtoauthenticateasadmin,queryandmutateHasurainpython?[closed]【发布时间】:2020-09-0707:48:50【问题描述】:我正在尝试查找任何带有示例的文档,以在python... 查看详情

如何使用构建器模拟内部变量(代码片段)

...ssion.builder().attributeA(input.getA()).build();s.attributeB("someValue");如何编写测试以验证SessionS是否设置了字段A和B?谢谢!答案基本上你可以验证两件事:input.getA():模拟你提供给你的代码的SomeInput实例,然后你可以在以后验证该模拟对... 查看详情

如何验证openjpa增强实体成功发生

】如何验证openjpa增强实体成功发生【英文标题】:Howtoverifyopenjpaenhancingentitieshappenedsuccessfully【发布时间】:2017-03-3010:38:27【问题描述】:我们正在项目的构建时增强实体。运行增强器构建时,我们正在构建成功。但是当我们添... 查看详情

适用于所有(或大多数)数据库的高效 SQL 测试查询或验证查询

】适用于所有(或大多数)数据库的高效SQL测试查询或验证查询【英文标题】:EfficientSQLtestqueryorvalidationquerythatwillworkacrossall(ormost)databases【发布时间】:2011-04-0918:29:48【问题描述】:许多数据库连接池库都提供了测试其SQL连接... 查看详情

如何验证状态列的内部数据表?

】如何验证状态列的内部数据表?【英文标题】:howcanIvalidateinsidedatatableforstatuscolumn?【发布时间】:2017-05-0609:44:43【问题描述】:我想验证status==1如果不显示非活动状态则显示活动跨度,但是我如何使用数据表来做到这一点我... 查看详情

如何使用 Vue.js 和 Vuelidate 验证模糊字段

】如何使用Vue.js和Vuelidate验证模糊字段【英文标题】:HowtovalidatefieldonblurusingVue.jsandVuelidate【发布时间】:2020-01-1508:47:02【问题描述】:我正在使用Bootstrap-Vue表单输入,并使用Vuelidate进行验证。目前在用户输入中,我得到轮廓颜... 查看详情

如何批量验证字符串是有效的 IPv4 或 IPv6 地址?

】如何批量验证字符串是有效的IPv4或IPv6地址?【英文标题】:HowcanIverifythatastringisavalidIPv4orIPv6addressinbatch?【发布时间】:2021-05-1623:29:56【问题描述】:我需要在Batch脚本中验证字符串是否是有效的IPv4或IPv6地址,但显然Batch没有... 查看详情