gpt4 book ai didi

sql - 运行封装查询的最有效方式

转载 作者:行者123 更新时间:2023-11-29 13:02:26 24 4
gpt4 key购买 nike

运行封装在另一个查询中的查询的最有效方法是什么?

1。在查询中查询:

select
id_user
from table1
where
foo in (select foo from table2 where dt_signin > '2014-01-01 00:00')

2。通过使用临时表:

create table tmp_table as
select
foo
from table2
where
dt_signin > '2014-01-01 00:00'

然后查询临时表

select
id_user
from table1 t1
join tmp_table tmp
on t1.foo = tmp.foo

使用方法 1where 子句 中的查询运行 (# rows of table1) 次或只运行一次并存储在内存中以便与 foo 进一步比较?

最佳答案

你的两个查询不做同样的事情。为了使第二种方法等效,您需要select distinct:

select distinct id_user
from table1 t1 join
tmp_table tmp
on t1.foo = tmp.foo;

由于这个额外的操作,我可能希望 in 表现得更好。但是,一般来说,当您遇到特定的性能问题时,您应该在系统上的数据上对其进行测试。

至于您在问题中的查询,有许多不同的方法可以解决这个问题。这里有一些:

  • 使用 in 的子查询
  • 具有joindistinct 的两个表
  • 中的两个表
  • 存在两个表
  • 存在的子查询
  • 存在的两个表
  • CTE 与 join
  • CTE
  • CTE 存在

在理想情况下,SQL 编译器会简单地研究查询并获得最佳执行计划,而不管查询是如何表达的。唉,那个世界不是我们生活的世界。

临时表有时有用(我更喜欢单一查询解决方案)的一个原因是出于优化目的:

  1. 临时表的统计信息是已知的,因此优化器可以选择更好的计划。
  2. 您可以在临时表上建立索引以提高性能。

您的子查询不是很复杂,所以这些可能不是问题。

在不同的情况下,不同的方法可能会更好。默认情况下,我会在 tmp_Table(dt_signin, foo) 上构建索引并使用 exists

关于sql - 运行封装查询的最有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25512106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com