sql如何更快地获取数据?首先获取计数,然后获取数据或直接获取数据

时间:2013-09-20 18:35:46

标签: java sql

我想要让我的程序运行得更快,这是我的主要目标。 我用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')

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

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

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

但是,如果您像20个表一样加入posts表,并且最终希望每个帖子都比日期更新,那么您可以先检查,如果有任何帖子,则比给定日期更新。