0

我正在使用 Java 开发 SQLite 数据库分析工具。我当前的目标是检查数据库中哪些表和视图不包含记录。我的问题是速度问题。当试图确定一个视图是否为空时,我最大的减速发生了。我已经针对 SQLiteSpy 中的单个视图测试了单个查询,但我无法将返回时间降低到 1-2 秒以下。放大到数百个视图,这种性能是不可接受的,甚至不关心该功能。使用我自己的代码,我可以检查大约 120 个表,最大的在 100,000 行左右,平均速度为 3.74 毫秒。

我目前的查询:

 SELECT exists(SELECT 1 FROM table LIMIT 1);

正如我所说,这对我的表来说很好,但是对于视图来说,它太慢了。

我还尝试了以下方法:

  SELECT count(*) FROM table;  
  SELECT count(1) FROM table;
  SELECT 1 FROM table LIMIT 1;

我还尝试选择一个限制为一的已知列,这需要几秒钟。

我最后的手段是先查询表,然后查询视图,并在整个过程中设置一次超时。我的测试数据库有大约 250 个表和视图,每个都不是很大。我的目标是能够在最多 1.5 秒内报告哪些是空的。我希望能够提供像 SQLiteSpy 这样的功能,其中树视图中的表和视图用绿色加号或红色减号标记。我只是想不通他们怎么能这么快地标记它们。

4

2 回答 2

0

我想我明白为什么查询视图可能很昂贵。与普通表不同,对视图的查询可能必须检查基础表中的许多行,以确定它至少有一行。结合 SQLlite 查询优化器可能不是那么“聪明”的事实。

所以我怀疑答案是不管你怎么做,检查空视图可能会很慢。

于 2013-06-12T13:08:56.007 回答
0

这是特定于 SQLite的。

您可以尝试运行ANALYZE命令,然后查询sqlite_statN表以查看哪些表的行数为零。

于 2013-06-12T15:52:16.327 回答