当前位置: 首页 > 面试题库 >

内联vs内

燕飞文
2023-03-14
问题内容
SELECT C.* FROM StockToCategory STC 
INNER JOIN Category C ON STC.CategoryID = C.CategoryID 
WHERE STC.StockID = @StockID

VS

SELECT * FROM Category
WHERE CategoryID IN
    (SELECT CategoryID FROM StockToCategory WHERE StockID = @StockID)

哪种被认为是 正确的 (语法上)且性能最高的方法,为什么?

后一个示例中的语法对我来说似乎更合乎逻辑,但我的假设是JOIN会更快。

我看过查询计划,还无法从中解密任何内容。

查询计划1
查询计划2


问题答案:

两种语法有不同的用途。假设使用Join语法,则需要StockToCategory和Category表中的某些内容。如果每个类别的StockToCategory表中有多个条目,则将重复“类别”表的值。

使用IN函数可以假定您只需要类别中ID符合某些条件的项目。如果给定的CategoryId(假设它是Category表的PK)在StockToCategory表中多次存在,则仅返回一次。

在您的确切示例中,它们将产生相同的输出,但是IMO,后面的语法使您的意图(仅想要类别)更加清晰。

顺便说一句,第三种语法类似于使用IN函数:

Select ...
From Category
Where Exists    (
                Select 1
                From StockToCategory
                Where StockToCategory.CategoryId = Category.CategoryId
                    And StockToCategory.Stock = @StockId
                )


 类似资料:
  • 问题内容: 我们有下面的查询。使用LEFT OUTER联接需要9秒钟才能执行。将LEFT OUTER更改为LEFT INNER可以将执行时间减少到2秒,并且返回 相同 数量的行。由于正在处理dbo.Accepts表中相同数量的行,而不论联接类型如何,为什么外层要花3倍的时间? 问题答案: 返回相同行数的事实是事后事实,查询优化器无法预先知道Accepts中的每一行在Marker中都有匹配的行,可以

  • Fonts can be really difficult to get right. First of all we have typically 4 different formats, but only one of them will be used by the respective browser. You do not want to inline all 4 formats, as

  • Until HTTP/2 is here you want to avoid setting up too many HTTP requests when your application is loading. Depending on the browser you have a set number of requests that can run in parallel. If you l

  • 问题内容: 我重构了从另一家公司继承来的应用程序的慢速部分,以使用内部联接而不是子查询,例如: 重构后的查询运行速度提高了约100倍。 (约50秒,约0.3秒),我期望有所改善,但谁能解释为什么如此剧烈?where子句中使用的列均已建立索引。SQL是否在where子句中每行执行一次查询? 更新 -说明结果: 区别在于“(())中的id”查询的第二部分- vs 1带有连接的索引行: 问题答案: “相

  • 我正在构建一个Spark应用程序,我必须在其中缓存大约15GB的CSV文件。我在这里读到了Spark 1.6中引入的新: https://0x0fff.com/spark-memory-management/ 作者在和之间有所不同(火花内存又分为)。正如我所了解的,Spark内存对于执行(洗牌、排序等)和存储(缓存)东西是灵活的——如果一个需要更多内存,它可以从另一个部分使用它(如果尚未完全使用)