一个旧的系统已经到达我们的办公室进行一些更改和修复,但是它也遭受性能问题的困扰。我们不确切知道这种缓慢性的根源是什么。
在重构旧代码时,我们发现了一些遵循以下模式的sql查询(出于示例目的,对查询进行了简化):
SELECT
(
SELECT X
FROM A
WHERE A.id = TABLE.id
) AS COLUMN1,
(
SELECT Y
FROM B
WHERE B.id = TABLE.id
) AS COLUMN1,
(
SELECT Z
FROM C
WHERE C.id = TABLE.id
) AS COLUMN1,
...
FROM
TABLE
WHERE
TABLE.id = @param;
这些查询从它们返回的 每一 列中进行几个内部子查询。
我们计划按照以下模式重写这些查询:
SELECT
A.X, B.Y, C.Z
FROM
TABLE
INNER JOIN A on A.ID = TABLE.ID
INNER JOIN B on B.ID = TABLE.ID
INNER JOIN C on C.ID = TABLE.ID
WHERE
TABLE.id = @param;
使用内部联接,它们 更易于阅读和理解
,但是真的更快吗?这是写它们的更好的方法吗?不幸的是,我们改写的第一个查询并没有缩短查询时间,这使查询速度变慢了。
这是我的问题:我们应该重写所有这些查询吗?这些子查询是完成这项工作的好方法吗?它们在内部联接方式上是否更快?
如果我正确理解了您的问题,那么您将开始重写某些SQL语句的操作,因为您认为它们可能存在问题。
我的建议是停止并首先开始确定您当前在哪里花费时间。只有在发现带有这些标量子选择的查询中,并且是由于这些标量子选择之后,才应该重写它们。在此之前:开始跟踪和检查。
这是OTN的两个线程,用于指导有性能问题的人员:
http://forums.oracle.com/forums/thread.jspa?messageID=1812597
http://forums.oracle.com/forums/thread.jspa?threadID=863295
问候,
罗布。
并且:由于标量子查询缓存,您的原始查询可能比使用联接的重写查询快得多。
问题内容: 我知道我们可以进行相关的子查询并加入。但是哪一个更快?有黄金法则还是我必须同时衡量这两者? 问题答案: 首先,相关子查询实际上是联接的一种。关于哪一个产生最佳执行计划没有黄金法则。如果您对性能感兴趣,则需要尝试不同的表格以查看最有效的方法。或者,至少,看看执行该决定的执行计划。 通常,出于两个原因,我倾向于避免关联子查询。首先,几乎总是可以在没有相关性的情况下编写它们。其次,许多查询引
问题内容: 我有两个包含“任务”和“注释”的表,并且想要检索一个任务列表,以及每个任务的关联注释数。这两个查询可以完成任务: 它们之间有区别吗?我应该在一个之上使用另一个,还是它们只是完成同一工作的两种方式?谢谢。 问题答案: 在小型数据集上,当涉及到性能时,它们会被淘汰。索引时,LOJ会好一些。 我发现在大型数据集上,内部联接(内部联接也将起作用。)将在很大的因素(抱歉,没有数字)方面优于子查询
问题内容: 我正在使用MySQL存储视频游戏数据。我有用于标题,平台,标签,徽章,评论,开发人员,出版商等的表… 当某人正在观看游戏时,最好有一个查询来返回与游戏相关的所有数据,还是最好使用多个查询?直观地,由于我们具有评论,将它们包括在同一查询中似乎毫无意义,因为它们需要分页。但是在其他情况下,我不确定是否要分解查询或使用两个查询… 我有点担心性能,因为我现在加入游戏下表:开发人员,发行者,元标
问题内容: 我绝对是SQL的新手,我一直在努力用Postgresql中的以下表结构编写一个复杂的查询: 查询的目的是获取每个用户的报告类型数量,并将其显示在一列中。有三种不同类型的报告。 使用group-by的简单查询将解决问题,但将其显示在不同的行中: 问题答案:
我最近看到我的朋友编写的一个 类有很多方法。该类与图像有关,并且具有诸如 我问他为什么要使用。我知道编译器会更改 到 他只是说,它减少了对函数的调用,并且只在实用程序方法上使用它们。每次复制相同的代码不会增加程序大小吗? 现在需要这个吗?如果需要,应该在什么时候使用它们? 编辑 我在Patrick提供的一个列表中列出了大多数问题和优点,以帮助那些不想浏览链接的未来观众。 问题 用扩展的函数体替换调
我有以下与MongoDB数据库设计相关的问题。这是我的情况: 我收藏了大约50k份文件(每份15kB), 每个文档都有一个存储数据样本的字典, 我的查询总是从文档中获取所有数据, 每个查询都使用一个索引, 集合只有一个索引(基于单个日期时间字段), 在大多数情况下,我需要从许多文档中获取数据(通常为25 我有两种选择查询的可能性: 执行单个查询检索我感兴趣的所有文档, 执行N个查询,每个人都得到一