T-SQL 1 = 1性能命中

Adr*_*ong 18 t-sql sql-server

对于我的SQL查询,我通常对SELECT语句执行以下操作:

SELECT ...
FROM table t
WHERE 1=1
  AND t.[column1] = @param1
  AND t.[column2] = @param2
Run Code Online (Sandbox Code Playgroud)

如果我需要添加/删除/注释任何WHERE子句,这将使它变得容易,因为我不必关心第一行.

使用此模式时是否有任何性能损失?

附加信息:

绵羊模拟器和所有其他未获得使用的实例.

假设上面的查询,我需要将@param1更改为不包含在查询中:

1 = 1时:

...
WHERE 1=1 <-- no change
  --AND t.[column1] = @param1 <-- changed
  AND t.[column2] = @param2 <-- no change
...
Run Code Online (Sandbox Code Playgroud)

没有1 = 1:

...
WHERE <-- no change
  --t.[column1] = @param1 <-- changed
  {AND removed} t.[column2] = @param2 <-- changed
...
Run Code Online (Sandbox Code Playgroud)

Qua*_*noi 17

不,SQL Server足够聪明,可以从执行计划中省略这种情况,因为它总是如此TRUE.

Oracle,MySQL和PostgreSQL也是如此.


The*_*TXI 11

如果您使用分析器并且看起来很可能,您最终会看到优化器最终会忽略它,因此在宏观方案中,可能不会有太多性能收益或损失.


Rem*_*anu 5

这对性能没有影响,但是 SQL 文本看起来已经被 SQL 注入攻击破坏了。“1=1”技巧出现在许多基于 SQL 注入的攻击中。您只是冒着有一天您的某些客户部署一个监视 SQL 流量的“黑匣子”的风险,您会发现您的应用程序被标记为“被黑客攻击”。源代码分析器也可能会标记这一点。当然,这是一个遥远的目标,但值得权衡。

  • 我想说这不是一个有效的观点。SQL注入使用“OR 1=1”而不是“1=1 AND”。这两者明显不同,如果应用程序无法区分它们,您确定其他结果可靠吗? (5认同)