Tuc*_*ker 5 sql performance between
我通常必须查询一个非常大的表,查找每个变量有多个条件的多个变量.通常,需要在多个范围内查询变量.例如,我可能需要VAR_1的所有记录,其中VAR_1在200-300,350-400,450-500之间.
通常我会写如下,但有人告诉我使用IN()而不是多个OR会更有效率.
SELECT * FROM table
WHERE VAR_1 BETWEEN '200' AND '300' OR
VAR_1 BETWEEN '350' AND '400' OR
VAR_1 BETWEEN '450' AND '500'
Run Code Online (Sandbox Code Playgroud)
有没有办法压缩这些信息,并OR通过嵌套LIKE或BETWEEN条款摆脱s IN()?有点像:
WHERE VAR_1 IN (BETWEEN '200' AND '300', BETWEEN '350' AND '400', BETWEEN '450' AND '500')
要么
WHERE VAR_1 IN ('[200-300]','[350-400]','[450-500]')
我尝试过这样的东西,但语法显然不正确.您可以指出我的任何想法或方向都很棒,对SQL来说仍然是新手.
一些评论否认 IN 子句比使用 OR 更有效 - 我认为这对于一般情况是不正确的。
它仅取决于数据库的查询优化器。
如果查询优化器足够聪明,它会将 OR 和 IN 子句转换为相同的执行计划(如果它们在语义上相等)。在这种情况下,进一步的计划处理对于两个计划将具有相同的成本,一个小的差异可能是转换的成本可能会产生微小的差异。
另一方面,查询优化器可能不会注意到 OR 谓词的强相关性,并在执行计划中独立评估每个范围谓词(每个范围谓词都是一个单独的运算符),而 IN 子句可能由所有范围谓词的查找表处理in 子句中的值(只有一个运算符)会导致明显的运行时差异。
所以总体答案是它在很大程度上取决于您的 DBMS,我建议您在系统上的小型基准设置中尝试这两个版本。
对于 SQL-92 来说,没有特殊的语法,例如
WHERE VAR_1 IN ('[200-300]','[350-400]','[450-500]')
Run Code Online (Sandbox Code Playgroud)
所以实际上你只有 OR 或 IN 列表。
请注意,更通用的表示法
WHERE VAR_1 IN ( '200', '201' )
Run Code Online (Sandbox Code Playgroud)
是
WHERE VAR_1 = ANY ('200','201' )
Run Code Online (Sandbox Code Playgroud)
(运算符“=”可以替换为任何其他比较运算符,例如“<=”)
| 归档时间: |
|
| 查看次数: |
9703 次 |
| 最近记录: |