我想要让我的程序运行得更快,这是我的主要目标。 我用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')
这是更有效的方式还是我应该直接获取数据?
答案 0 :(得分:1)
假设parentFolderID
和status
被编入索引,我只是直接获取数据而不使用count。在我的情况下,这两种查询方法会更慢,因为它是两个独立的磁盘IO操作。
在空结果的情况下,两个查询应该具有相同的执行时间,因为它们只是从索引树中读取并且不会执行任何后续的随机磁盘IO来获取实际数据
答案 1 :(得分:1)
在您的问题的特殊情况下,我会避免count
查询。 where
- 子句是相同的:即使用或不使用索引:物理"工作量"找到匹配的rowids
(不是为了获取找到的数据)对于两个查询都是相同的。
如果找不到匹配的行,则两个查询的性能开销几乎相同,并且没有给出额外的信息。
如果找到匹配的行,则无论如何都会调用第二个查询:第一个查询不提供其他信息。
性能改进的关键可能是获得parentFolderID
的价值的方式:也许您可以将两个不同的查询合并为一个 - 具体取决于您的数据库产品。
答案 2 :(得分:0)
这个问题没有黑白分明。如果您的实际提取是一个非常复杂的查询,那么最好先看看是否有结果。
如果第二个查询非常简单,首先获取计数可能只是一个额外的(不是必需的)查询,因为您始终可以检索最终结果的大小。
显然,它不会运行相同的查询,只能使用count()而不是值。 (除了延迟加载和分页,你需要所有匹配结果的计数)
但是,如果您像20个表一样加入posts
表,并且最终希望每个帖子都比日期更新,那么您可以先检查,如果有任何帖子,则比给定日期更新。