首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Virtual Table Indexing Information

代码语言:javascript
复制
struct sqlite3_index_info {
  /* Inputs */
  int nConstraint;           /* Number of entries in aConstraint */
  struct sqlite3_index_constraint {
     int iColumn;              /* Column constrained.  -1 for ROWID */
     unsigned char op;         /* Constraint operator */
     unsigned char usable;     /* True if this constraint is usable */
     int iTermOffset;          /* Used internally - xBestIndex should ignore */
  } *aConstraint;            /* Table of WHERE clause constraints */
  int nOrderBy;              /* Number of terms in the ORDER BY clause */
  struct sqlite3_index_orderby {
     int iColumn;              /* Column number */
     unsigned char desc;       /* True for DESC.  False for ASC. */
  } *aOrderBy;               /* The ORDER BY clause */
  /* Outputs */
  struct sqlite3_index_constraint_usage {
    int argvIndex;           /* if >0, constraint is part of argv to xFilter */
    unsigned char omit;      /* Do not code a test for this constraint */
  } *aConstraintUsage;
  int idxNum;                /* Number used to identify the index */
  char *idxStr;              /* String, possibly obtained from sqlite3_malloc */
  int needToFreeIdxStr;      /* Free idxStr using sqlite3_free() if true */
  int orderByConsumed;       /* True if output is already ordered */
  double estimatedCost;           /* Estimated cost of using this index */
  /* Fields below are only available in SQLite 3.8.2 and later */
  sqlite3_int64 estimatedRows;    /* Estimated number of rows returned */
  /* Fields below are only available in SQLite 3.9.0 and later */
  int idxFlags;              /* Mask of SQLITE_INDEX_SCAN_* flags */
  /* Fields below are only available in SQLite 3.10.0 and later */
  sqlite3_uint64 colUsed;    /* Input: Mask of columns used by statement */
};

sqlite3_index_info结构及其子结构被用作虚拟表接口的一部分,以便将信息传递到虚拟表模块的xBestIndex方法中并从中接收答复。** Inputs **下的字段是xBestIndex的输入并且是只读的。xBestIndex将其结果插入** Outputs **字段。

aConstraint []数组记录窗体的WHERE子句约束:

column OP expr

其中OP是=,<,<=,>或> =。使用SQLITE_INDEX_CONSTRAINT_值之一将特定运算符存储在aConstraint []。op中。该列的索引存储在aConstraint []。iColumn中。aConstraint []。如果可以评估右侧的expr(因此约束可用),则可用值为TRUE,否则为false。

优化程序自动将表达式“expr OP列”的条件反转,并对WHERE子句进行其他简化操作,试图将尽可能多的WHERE子句条目转换为上面显示的形式。aConstraint []数组仅报告与正在查询的特定虚拟表相关的WHERE子句条款。

有关ORDER BY子句的信息存储在aOrderBy []中。aOrderBy的每一项记录ORDER BY子句的一列。

colUsed字段指示当前扫描可能需要虚拟表的哪些列。虚拟表列按照它们在传递给sqlite3_declare_vtab()的CREATE TABLE语句中出现的顺序从零开始编号。对于前63列(列0-62),如果列可能被SQLite需要,则在colUsed掩码内设置相应的位。如果该表至少有64列,并且需要第63列右侧的任何列,那么colUsed的第63位也被设置。换句话说,如果表达式(colUsed&((sqlite3_uint64)1 <<(iCol> = 63?63:iCol)))的计算结果为非零,则可能需要列iCol。

xBestIndex方法必须使用有关传递给xFilter的参数的信息来填充aConstraintUsage []。如果argvIndex> 0,则对相应的aConstraint []的右侧进行求值并且成为argv中的argvIndex-th条目。如果aConstraintUsage []。omit为true,那么假定约束完全由虚拟表处理,并且不会被SQLite再次检查。

记录idxNum和idxPtr值并将其传递给xFilter方法。当且仅当needToFreeIdxPtr为true时,才使用sqlite3_free()来释放idxPtr。

orderByConsumed表示xFilter / xNext的输出将以正确的顺序出现以满足ORDER BY子句,因此不需要单独的排序步骤。

估计成本值是特定策略成本的估计值。N的代价表明该策略的成本类似于具有N行的SQLite表的线性扫描。日志成本(N)表示该操作的开销类似于在具有N行的SQLite表的唯一索引字段上的二进制搜索的开销。

estimatedRows值是策略将返回的行数的估计值。

xBestIndex方法可以选择性地使用SQLITE_INDEX_SCAN_ *标志的掩码来填充idxFlags字段。目前只有一个这样的标志 - SQLITE_INDEX_SCAN_UNIQUE。如果xBestIndex方法设置此标志,则SQLite会假定该策略最多只能访问一行。

此外,如果xBestIndex设置了SQLITE_INDEX_SCAN_UNIQUE标志,那么SQLite还假定如果对xUpdate()方法的调用是作为删除或更新虚拟表行的同一语句的一部分进行的,并且实现返回SQLITE_CONSTRAINT,则不需要回滚任何数据库更改。换句话说,如果xUpdate()返回SQLITE_CONSTRAINT,则数据库内容必须与调用xUpdate之前的内容完全相同。相比之下,如果未设置SQLITE_INDEX_SCAN_UNIQUE并且xUpdate返回SQLITE_CONSTRAINT,则由xUpdate方法所做的任何数据库更改都将由SQLite自动回滚。

重要提示:estimatedRows字段已添加到SQLite 版本3.8.2(2013-12-06)的sqlite3_index_info结构中。如果虚拟表扩展名与早于3.8.2的SQLite版本一起使用,则试图读取或写入estimatedRows字段的结果是未定义的(但可能会包含应用程序崩溃)。仅当sqlite3_libversion_number()返回大于或等于3008002的值时,才会使用estimatedRows字段。同样,为版本3.9.0(2015-10-14)添加了idxFlags字段。因此,它只能在sqlite3_libversion_number()返回大于或等于3009000的值时使用。

代码语言:txt
复制
 SQLite is in the Public Domain.

扫码关注腾讯云开发者

领取腾讯云代金券