0

我想让我的程序运行得更快,这是我的主要目标。我的程序是用 java 编写的,从 3 个表中获取数据。现在,对于每个表,它首先使用这个查询来检查是否有任何数据要获取:

    SELECT COUNT(1) FROM FOLDER WHERE parentFolderID = ? " + 
"AND status NOT IN ('RM', 'TM')"

然后如果有使用此查询来获取它:

SELECT folderid, foldertype, foldername, owner, description, "
        + "cabinetid, folderlevel, parentfolderid, status, lastmodified FROM folder WHERE parentFolderID = ? "
    + "AND status NOT IN ('RM', 'TM')

这是更有效的方法还是我应该直接获取数据?

4

3 回答 3

1

假设parentFolderIDstatus被索引,我将直接获取数据而不使用计数。在我的情况下,这两种查询方法会更慢,因为它是两个独立的磁盘 IO 操作。

在空结果的情况下,两个查询应该具有相同的执行时间,因为它们只是从索引树中读取,并且不会执行任何后续的随机磁盘 IO 来获取实际数据。

于 2013-09-20T18:40:43.787 回答
1

在您的问题的特殊情况下,我会避免count查询。-where子句是相同的:即是否使用索引:查找匹配rowids项(而不是获取找到的数据)的物理“工作量”对于两个查询都是相同的。

  1. 如果未找到匹配行,则两个查询的性能开销几乎相同,并且不提供额外信息。

  2. 如果找到匹配的行,则无论如何都会调用第二个查询:第一个查询不提供其他信息。

可能提高性能的关键可能是您获得价值的方式parentFolderID:也许您可以将两个不同的查询合并为一个 - 取决于您的数据库产品。

于 2013-09-20T19:01:30.413 回答
0

这个问题没有黑白之分。如果您的实际获取将是一个非常复杂的查询,那么最好先查看(如果有结果)。

如果第二个查询非常简单,那么首先获取计数可能只是一个附加(非必需)查询,因为您始终可以检索最终结果的大小。

显然,运行相同的查询是没有意义的,但只能使用 count() 而不是值。(除了延迟加载和分页,您需要计算所有匹配结果的数量)

但是,如果您将 20 个表格与表格一起加入posts,最后想要每个比日期新的帖子,您可以先检查,如果有任何帖子,比给定日期更新。

于 2013-09-20T18:41:00.070 回答