首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL性能差异WHERE IN UNION与WHERE IN临时表from with子句

基础概念

SQL中的WHERE INUNION以及WITH子句都是用于数据查询和处理的工具,但它们在实现方式和适用场景上有所不同。

  • WHERE IN:用于筛选出符合指定条件的记录。
  • UNION:用于合并两个或多个SELECT语句的结果集,并去除重复的行。
  • WITH子句(公用表表达式):允许你创建一个临时的结果集,这个结果集可以在同一个查询中被多次引用。

性能差异

WHERE IN UNION

当使用WHERE IN结合UNION时,实际上是执行了多个查询,并将它们的结果合并。这种方式的性能取决于每个子查询的复杂性和数据量。

代码语言:txt
复制
SELECT * FROM table1 WHERE column IN (SELECT column FROM table2)
UNION
SELECT * FROM table3 WHERE column IN (SELECT column FROM table4);

WHERE IN 临时表 from WITH子句

使用WITH子句创建临时表,然后在WHERE IN中使用这个临时表,可以减少查询的复杂性和提高性能,因为临时表只需要被创建一次。

代码语言:txt
复制
WITH temp_table AS (
    SELECT column FROM table2
    UNION
    SELECT column FROM table4
)
SELECT * FROM table1 WHERE column IN (SELECT column FROM temp_table)
UNION
SELECT * FROM table3 WHERE column IN (SELECT column FROM temp_table);

优势

  • WHERE IN UNION:适用于需要合并多个独立查询结果的场景。
  • WHERE IN 临时表 from WITH子句:适用于需要多次使用相同查询结果的场景,可以减少重复计算,提高性能。

应用场景

  • WHERE IN UNION:当你需要从多个表中获取数据,并且这些表的数据结构相似时。
  • WHERE IN 临时表 from WITH子句:当你有一个复杂的查询,需要多次使用相同的结果集时。

遇到的问题及解决方法

性能问题

如果使用WHERE IN UNION时性能不佳,可能是因为每个子查询都执行了全表扫描或者数据量过大。解决方法是优化子查询,比如添加索引或者使用临时表。

代码语言:txt
复制
-- 添加索引
CREATE INDEX idx_table2_column ON table2(column);

-- 使用临时表
WITH temp_table AS (
    SELECT column FROM table2
    UNION
    SELECT column FROM table4
)
SELECT * FROM table1 WHERE column IN (SELECT column FROM temp_table)
UNION
SELECT * FROM table3 WHERE column IN (SELECT column FROM temp_table);

数据重复问题

如果使用UNION时出现数据重复,确保每个SELECT语句中的列数和数据类型一致,并且使用UNION ALL来保留重复行(如果需要)。

代码语言:txt
复制
SELECT * FROM table1 WHERE column IN (SELECT column FROM table2)
UNION ALL
SELECT * FROM table3 WHERE column IN (SELECT column FROM table4);

参考链接

通过以上方法,可以根据具体的查询需求和数据量选择合适的方式来优化SQL性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SQL 查询条件放到 JOIN 子句 WHERE 子句的差别

我们再写 SQL 的时候,最常碰到一个问题就是,把查询条件放到 JOIN 子句和放到 WHERE 子句有什么不同呢?...比如: 查询条件放到 JOIN 语句: SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts JOIN wp_skus sku ON sku.post_id...wp_posts.ID FROM wp_posts JOIN wp_skus sku ON sku.post_id = wp_posts.ID WHERE 1=1 AND wp_posts.post_type...但是语义上:JOIN - 描述两个之间的关系,WHERE - 从结果集中删除行。这两种方法直接存在显著的语义上的差别,尽管两种方法对结果和性能都无影响,但是选择正确的语法将有助于代码更易于被阅读。...OUTER JOIN:如果使用的是 OUTER JOIN,可能会不同,比如上面的 SQL 改成 LEFT JOIN,并且连接条件失败,则查询条件放到 JOIN 子句仍将获得一行,但是如果放到 WHERE

2.4K20

SQL Server 性能优化之——T-SQL 临时变量、UNION

这次看一下临时变量和Union命令方面是否可以被优化呢? 一、临时变量 很多数据库开发者使用临时变量将代码分解成小块代码来简化复杂的逻辑。...在必须使用临时的情况下,可以参照一下预防措施: 使用临时(create table #Temp)而不是使用变量(Declare @table table),这样做的原因是可以在临时上使用索引。...使用临时时,用小型数据量的小来限制性能影响。 如果临时中使用inner join , group by , order by 或 where,要确保临时有聚集索引或非聚集索引。...SQL Server 2008以后,参数是可以用的。...选择/改善Union : · 使用Case When 子句代替,它们可以做聚合和详细的查询 · 使用动态查询:用强大的sp_executesq来节省每次运行查询执行计划,节省时间消耗。

3.3K41
  • MySQL十二:索引分析

    转载~ 数据库优化是一个很常见的面试题,下面就针对这一问题详细聊聊如何进行索引sql的分析优化。...例如: explain select * from student where id > 2; 这里需要注意一下版本差异 「MySQL 5.6.3」 MySQL 5.6.3以前只能 EXPLAIN...student where id > 1; 因为「union会对结果去重,内部创建了一个 名字的临时,把查询 1 和查询 2 的结果集都合并到这个临时中,利用唯一键进行去重,...PRIMARY 若查询中包含有子查询,最外层查询会别标记为PRIMARY UNION 若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT...对应(name)、(age)两个索引 explain select id from user order by name,age; WHERE子句ORDER BY子句,使用了不同的索引 #对应(name

    1.4K20

    挽救数据库性能的30条黄金法则

    优化查询,应尽量避免全扫描,应该在用于检索数据和排序数据的字段上建立索引,如where子句用于搜索,order by子句用于排序,所以在这两个子句涉及到的字段上需要建立索引。 2....如下面的SQL语句可能会带来性能问题 select id,name,age from persons where name = 'Bill' or age > 30...应该尽量避免在where子句中使用参数,否则也将导致全扫描。这是因为参数需要在SQL运行时才进行替换,而SQL优化(使用索引属于优化的一部分)是在编译时进行的。...尽量用union all代替union unionunion all的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的cpu运算,加大资源消耗及延迟。...) 复制代码 在上面的SQL语句中,数据库引擎会先对外表a执行全查询,然后根据product_id逐个执行子查询,如果外层(a)中的数据非常多,查询性能会非常糟糕。

    44530

    MySQL DQL 数据查询

    SELECT [列名称] FROM [名称] WHERE [条件] 一个完整的 SELECT 语句包含一些可选的子句。...最终结果 每个子句执行后都会产生一个中间数据结果,即所谓的临时视图,供接下来的子句使用,如果不存在某个子句则跳过。...需要注意的是,不同的数据库管理系统可能会有一些差异,但一般情况下,上述顺序适用于大多数SQL查询。 MySQL 和标准 SQL 执行顺序基本是一样的。...(2)UNION UNION ALL 的区别 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去合并后的重复行。UNION ALL 则保留重复行。...ref:索引比较的列或常量。 rows:扫描的行数。 filtered:过滤的行百分比。 Extra:额外的信息,如使用了临时、使用了文件排序等。

    24320

    【数据库】数据库优化(SQL优化)

    10.临时 慎重使用临时可以极大的提高系统性能。 11.对查询进行优化,应尽量避免全扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。...12.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全扫描,如: select id from t where num is null 可以在num...上设置默认值0,确保中num列没有null值,然后这样查询: select id from t where num=0 13.应尽量避免在 where 子句中使用!...14.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全扫描,如: select id from t where num=10 or num=20 可以这样查询...: select id from t where num=10 union all select id from t where num=20 15.in 和 not in 也要慎用,否则会导致全扫描

    5K40

    数据库查询优化

    6 选择最有效率的名顺序: SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的名,因此FROM子句中写在最后的(基础driving table)将被最先处理,在FROM子句中包含多个的情况下...首先,扫描第一个FROM子句中最后的那个)并对记录进行排序;然后扫描第二个FROM子句中最后第二个);最后将所有从第二个中检索出的记录第一个中合适记录进行合并。...如果WHERE子句不是可SARG的,这意味着WHERE子句不能利用索引(或至少部分不能利用),执行的是全或索引扫描,这会引起查询的性能下降。...10 临时的使用: 临时有很多特殊的用途,象用来替代游标,不过它们仍能引起性能问题,如果这个问题能消除,SQLServer将执行得更快。...如果是直接在存储大量数据的永久上执行操作(如:统计、循环等),其性能将大打折扣。所以,使不使用临时,何时使用临时,需要具体情况决定。

    4.3K20

    《MySQL开发规范》过时了,视图的查询性能提升了一万倍

    dt WHERE f1 11 # 优化器转换后SQL SELECT f1, f2 FROM (SELECT f1, f2 FROM t1 WHERE f1 < 3 AND f2...以往在很多场景下,譬如MySQL视图的定义中包含了group by 或者union等聚合条件,那么视图上的查询就无法使用到基的索引,而是对所有基进行全扫描后,将返回结果保存到临时,再进行过滤,这也就直接导致了视图的查询性能非常之差...不过随着MySQL 8.0中派生条件下推特性的引入,这一条规范估计要改写;尤其是MySQL 8.0.29 之后即使视图定义中使用了union子句的派生,也可以应用派生条件下推的特性来提升视图的查询性能...2.2 MySQL 8.0前后版本的视图查询性能对比 如上所述,MySQL 8.0中引入的派生条件下推特性,尤其是MySQL 8.0.29 之后即使视图定义中使用了union子句的派生也可以应用派生条件下推的特性...对比MySQL 5.7.26 和 MySQL 8.0.29 版本,我们创建一个视图,基于两张sysbench的测试表的union结果;然后在视图上使用where条件过滤查询,对比不同版本的执行计划的区别和查询性能差异

    6.4K43

    MySQL 性能优化总结

    1.1,Sql优化的规则 不要有超过5个以上的连接(JOIN) 考虑使用临时变量存放中间结果。 少用子查询 视图嵌套不要过深,一般视图嵌套不要超过2个为宜。  ...* from student where name like '姜小鱼%' --不会造成全扫描 1.3.2,:where子句使用 !...select * from table ,用具体的字段列表替换"*",不要返回用不到的字段 1.3.8,:使用“临时”暂存中间结果    采用临时暂存中间结果好处:     (1)避免程序中多次扫描主表...1.4.6,尽量用 union all 替换 union   unionunion all的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的cpu运算...in()只执行一次,把B中的所有id字段缓存起来,之后检查A的id是否B中的id相等,如果id相等则将A的记录加入到结果集中,直到遍历完A的所有记录。

    1K11

    SQL优化的意义是什么?你用过哪些优化方式

    4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全扫描, 可以 使用UNION合并查询: select id from t where num=10 union...他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图索引匹配。一个关键的问题是否用到索引。...FROM子句中的名,FROM子句中写在最后的(基础 driving table)将被最先处理,在FROM子句中包含多个的情况下,你必须选择记录条数最少的作为基础。...id from t where num=10 union all select id from t where num=20 http://5.in 和 not in 也要慎用,否则会导致全扫描,如...26.使用基于游标的方法或临时方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。 27.临时一样,游标并不是不可使 用。

    1.4K20

    什么是MySQL的执行计划(Explain关键字)?

    (注意,如果 from 中包含子查询,仍会执行该子查询,将结果放入临时中)。 Explain可以用来分析SQL语句和结构的性能瓶颈。...*注意,MySQL不同版本Explain表现差异很大,有些场景,从语句层面看,是要使用到索引,但经过优化器分析,结合中现有数据,如果MySQL认为全扫描性能更优,则会使用全扫描。...5)union:表明当前行对应的select是在 union 中的第二个和随后的 select 6)union result:表明当前行对应的select是从 union 临时检索结果的 select...这时,可以通过优化where子句,增加恰当的索引来提升查询性能。 【key列】 这一列表明优化器实际采用哪个索引来优化对该的访问。如果没有使用索引,则该列是 null。...2)使用where子句order by子句条件列组合满足索引最左前列。 3. 尽量在索引列上完成排序,遵循索引建立(索引创建的顺序)时的最佳左前缀法则。

    2.2K11

    52 条 SQL 语句性能优化策略

    4、应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全扫描,可以使用UNION合并查询:select id from t where num=10 union all...而select id from t where name like‘abc%’才用到索引。 7、如果在where子句中使用参数,也会导致全扫描。...17、使用“临时”暂存中间结果 : 简化SQL语句的重要方法就是采用临时暂存中间结果,但是临时的好处远远不止这些,将临时结果暂存在临时,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表...的undo空间的功能,能采用临时提高并发性能的,不要用nolock。...他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高。多个OR的字句没有用到索引,改写成UNION的形式再试图索引匹配。一个关键的问题是否用到索引。

    64260

    SQL命令 FROM(一)

    SQL命令 FROM(一) 一个SELECT子句,指定要查询的一个或多个。 大纲 SELECT ......连接 当在FROM子句中指定多个名时, SQL将对这些执行连接操作。 执行的连接类型由每对表名之间的连接关键字短语或符号指定。 当两个名用逗号分隔时,将执行交叉连接。...为避免这种情况,建议在外部联接一起使用%INORDER时,仅ANSI样式的左外部联接或完全外部联接一起使用。 视图和子查询按照它们在FROM子句中指定的顺序进行处理。...此优化选项通过将子查询作为内联视图添加到查询的FROM子句来禁用对包含子查询的查询的优化;子查询查询字段的比较将作为联接移动到查询的WHERE子句。...然而,在某些情况下,这些UNION/OR转换会带来很大的开销负担。 %NOUNIONOROPT对与此FROM子句关联的WHERE子句中的所有条件禁用这些自动UNION/OR转换。

    2.1K40

    52条SQL语句性能优化

    SQL语句性能优化 1, 对查询进行优化,应尽量避免全扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。...4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全扫描, 可以 使用UNION合并查询:select id from t where num=10 union...而select id from t where name like ‘abc%’ 才用到索引 7, 如果在 where 子句中使用参数,也会导致全扫描。...他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图索引匹配。一个关键的问题是否用到索引。...FROM子句中的名,FROM子句中写在最后的(基础 driving table)将被最先处理,在FROM子句中包含多个的情况下,你必须选择记录条数最少的作为基础

    80210

    mysql数据库优化大全

    一,SQL语句性能优化 1, 对查询进行优化,应尽量避免全扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。...4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全扫描, 可以 使用UNION合并查询: select id from t where num=10 union...他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图索引匹配。一个关键的问题是否用到索引。...id from t where num=10 union all select id from t where num=20 5.in 和 not in 也要慎用,否则会导致全扫描,如:select...26.使用基于游标的方法或临时方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。 27.临时一样,游标并不是不可使 用。

    1.1K20

    实用排坑帖:SQL语句性能优化操作策略大全

    本文会提到52条SQL语句性能优化策略。 1、对查询进行优化,应尽量避免全扫描,首先应考虑在where及order by涉及的列上建立索引。...4、应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全扫描,可以使用UNION合并查询:select id from t where num=10 union all...而select id from t where name like‘abc%’才用到索引。 7、如果在where子句中使用参数,也会导致全扫描。...,能采用临时提高并发性能的,不要用nolock。...他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高。多个OR的字句没有用到索引,改写成UNION的形式再试图索引匹配。一个关键的问题是否用到索引。

    85121

    52 条SQL语句性能优化策略

    今天,带胖友们看看 52 条 SQL 语句性能优化策略。 1 对查询进行优化,应尽量避免全扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。...4 应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全扫描, 可以使用 UNION 合并查询: select id from t where num=10 union...而select id from t where name like ‘abc%’才用到索引。 7 如果在 where 子句中使用参数,也会导致全扫描。...17 使用“临时”暂存中间结果简化SQL语句的重要方法就是采用临时暂存中间结果,但是,临时的好处远远不止这些,将临时结果暂存在临时,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,...他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图索引匹配。一个关键的问题是否用到索引。

    55430

    Mysql性能优化一:SQL语句性能优化

    4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全扫描, 可以 使用UNION合并查询: select id from t where num=10 union...而select id from t where name like ‘abc%’ 才用到索引 7, 如果在 where 子句中使用参数,也会导致全扫描。...17,使用“临时”暂存中间结果  简化SQL语句的重要方法就是采用临时暂存中间结果,但是,临时的好处远远不止这些,将临时结果暂存在临时,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表...他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图索引匹配。一个关键的问题是否用到索引。...FROM子句中的名,FROM子句中写在最后的(基础 driving table)将被最先处理,在FROM子句中包含多个的情况下,你必须选择记录条数最少的作为基础

    1.9K21

    52 条 SQL 语句性能优化策略,建议收藏!

    4 应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全扫描, 可以 使用UNION合并查询:select id from t where num=10 union...而select id from t where name like ‘abc%’ 才用到索引 7 如果在 where 子句中使用参数,也会导致全扫描。...17 使用“临时”暂存中间结果 简化SQL语句的重要方法就是采用临时暂存中间结果,但是,临时的好处远远不止这些,将临时结果暂存在临时,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表...他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图索引匹配。一个关键的问题是否用到索引。...FROM子句中的名,FROM子句中写在最后的(基础 driving table)将被最先处理,在FROM子句中包含多个的情况下,你必须选择记录条数最少的作为基础

    92900
    领券