sql - 出于分析/测试目的编写相同 SQL 查询的替代方法

标签 sql database ingres vectorwise

我正在测试 Ingres Vectorwise 数据库,试图找到一种更快的方式来运行查询,因为我们在文本查找方面遇到了一些缓慢的情况。

如果我根据 char() 列查找大约 5000 个项目,下面的实现#1 非常快。不幸的是,查找 50 个项目所需的时间与查找 5000 个项目所需的时间大致相同。

另一方面,实现 #2 对于 50 个项目来说非常快,但对于 5000 个项目根本无法扩展。

实现 #3 显然会比实现 #1 更糟糕,但我只是提供我尝试过的示例。

我的问题是:假设我的表只有两列,q = bigint,r = char() 字段,您能否想出任何其他方法来使用基本 SQL 编写此查询,以便我可以有更多的选择吗?我希望有一个选项可以在 50 和 5000 的情况下合理执行(可以像您在数据库中所期望的那样进行扩展)。

请注意,我将接受具有执行相同功能的替代查询的任何答案;越多越好。我不希望任何东西会按照我希望的方式扩展,但在我尝试更多之前我不会知道。


实现#1:

select q
from test_table
where r in ('a', 'b', 'c', 'd', 'e')

实现#2:

select q
from test_table
where r = 'a' or r = 'b' or r = 'c' or r ='d' or r = 'e'

实现#3:

select q
from test_table a
where exists (
    select r
    from testtable
    where r in ('a', 'b', 'c', 'd', 'e')
    and a.r = r)

最佳答案

Vectorwise 不会“像您期望的那样缩放”,因为它没有 B 树索引。它使用每个 block 的高值和低值元数据来选择要读取的 block ,就像大多数列式分析 DBMS 一样。当从非常大的表中提取许多行时,这会提供出色的性能,但提取几行时性能会很差,因为它将遍历许多不需要的行。

您可以通过手动或使用“创建索引”命令对“r”表进行排序来进行优化(这将防止首次加载后批量加载)。这将使元数据更加精确,从而减少读取的 block 。

我注意到示例中只有两列,没有联接,也没有聚合函数。列式数据库真的是您所需要的还是 Lucene 更合适?

关于sql - 出于分析/测试目的编写相同 SQL 查询的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15160916/

相关文章:

php - MySQL 如何避免来自 PHP 的重复条目

mysql - 如何将 2 列合并为一列并使用该合并列来保存多个值

database - H2数据库批量插入数据

SQL 语法

sql - 如何按查询顺序获取一组的所有日期?

python - PostgreSQL:如何根据阈值将文本字符串拆分为多个片段?

sql - MySQL - 使用 UNION ALL 和 GROUP BY 进行搜索

SQL查询根据同一表中其他列的值从表中提取日期?

sql - ORDER BY 是否应该影响返回 SELECT 查询的行数?