分段索引

对索引进行分段,通常可以提高文本搜索的性能,尤其是在多处理器计算机上。然而,不合适的分段索引可能会降低某些查询的性能。仔细考虑分段如何影响您的数据和查询。

对于所有数据库和索引方法而言,将文本数据和 etx 索引散布到多个磁盘驱动器上可以提高性能。在提供有足够的磁盘驱动器的情况下,通过使用基于表达式的分段或循环分段将表数据散布到多个数据库空间或智能大对象空间上也很有用。

基于表达式的分段是实现更小索引分段的最佳机制,因为每个索引分段都充当一个孤立的索引,并且只带来与该分段的大小成比例的打开开销。不要针对索引使用循环分段,因为它可能导致性能比根本没有分段时还差。

文本搜索是通过 etx_contains() 运算符来执行的,该运算符作为索引扫描来执行。降低索引扫描开销的关键在于,使用选择性搜索条件以减少通过索引扫描选择的行数,或者缩小所读取的索引分段的大小。

例如,请考虑具有以下定义的简单表:
CREATE TABLE recipes
(
    id           INTEGER,
    recipe      CLOB,
    meal_type      CHAR(1),
    ingredients      LVARCHAR
);
假设用户大部分时间都是在思索就餐(在一天的某个时间点)的食谱:他们不想在正餐时吃薄烤饼或者在早餐时不吃烤宽面条:如果根据 meal_type 列来对索引数据进行分段,那么可以提高查询性能,如以下示例中所示:
CREATE INDEX recipes_idx ON recipes (recipe etx_clob_ops)
    USING etx (PHRASE_SUPPORT = 'MAXIMUM')
    FRAGMENT BY EXPRESSION
    meal_type = 'B' in sbsp1,
    meal_type = 'L' in sbsp2,
    meal_type = 'D' in sbsp3;
要查找使用 zucchini 的正餐食谱,请使用类似于下面的 SQL 语句:
SELECT id FROM recipes
    WHERE etx_contains ( recipe, 'zucchini')
    AND meal_type = 'D';

这立刻消除对使用分段的考虑,从而使查询执行更快。

此外,请考虑在用户更新数据时分段对查询性能和并行度的影响。您希望尽快地锁定索引。在写入某个智能大对象时,GBase 8s 会对该对象执行互斥写锁定操作。由于文本索引存储在智能大对象中,所以在更新每个索引分段时会对它执行互斥锁定操作。

最多可将索引分段为 6 个分段。尝试调整具体的 DBMS 可确定适合您数据的最佳索引分段数。

过多的索引分段可能会降低某些情况下的性能。例如,如果将索引分段为很多个分段并且查询要从每个分段检索信息,那么该查询的总体性能可能比根本没有对索引进行分段时还差。