相关疑难解决方法(0)

子查询与连接

我重构了一个从另一家公司继承的应用程序的缓慢部分,以使用内部连接而不是子查询

WHERE id IN (SELECT id FROM ...)
Run Code Online (Sandbox Code Playgroud)

重构的查询运行速度提高了约100倍.(约50秒到约0.3)我预计会有所改善,但任何人都可以解释为什么它如此激烈?where子句中使用的列都已编入索引.SQL是否每行执行一次where子句中的查询?

更新 - 解释结果:

不同之处在于"where in in()"查询的第二部分 -

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where
Run Code Online (Sandbox Code Playgroud)

vs 1带连接的索引行:

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index
Run Code Online (Sandbox Code Playgroud)

mysql sql performance database-design join

157
推荐指数
9
解决办法
6万
查看次数

如何将SQL子查询转换为连接

我有两个表与1:n关系:"content"和"versioned-content-data"(例如,文章实体和该文章创建的所有版本).我想创建一个显示每个"内容"的顶级版本的视图.

目前我使用此查询(使用简单的子查询):

SELECT 
   t1.id, 
   t1.title, 
   t1.contenttext,
   t1.fk_idothertable
   t1.version
FROM mytable as t1
WHERE (version = (SELECT MAX(version) AS topversion
                  FROM mytable
                  WHERE (fk_idothertable = t1.fk_idothertable)))

子查询实际上是对同一个表的查询,该表提取特定项的最高版本.请注意,版本化项目将具有相同的fk_idothertable.

在SQL Server中,我尝试创建此查询的索引视图,但似乎我无法在索引视图中使用子查询.所以...这是我的问题...你能想到一种方法将这个查询转换成某种类型的JOIN查询吗?

似乎索引视图不能包含:

  • 子查询
  • 常用表表达式
  • 派生表
  • 有条款

我很绝望.欢迎任何其他想法:-)

非常感谢!

sql sql-server join subquery

8
推荐指数
1
解决办法
3万
查看次数

标签 统计

join ×2

sql ×2

database-design ×1

mysql ×1

performance ×1

sql-server ×1

subquery ×1