优化查询性能
通过正确使用索引以及了解查询优化器的工作原理,可以提高 SmartESQL 的查询性能。请使用以下链接获取有关 SmartESQL 查询优化器的详细说明。
覆盖索引和包含索引
在许多情况下,对内存(临时)数据库类的查询性能也可以通过使用覆盖索引来优化。如果查询的 select 列表中请求的所有列都在索引中可用,那么查询引擎就不必再次查找表,这可以显著提高查询性能。由于所有请求的列都在索引中可用,因此该索引“覆盖”了查询。因此,这种查询被称为覆盖查询,而该索引就是覆盖索引。
SmartEDB 数据定义语言编译器支持使用 <*>
语法为类定义覆盖索引的语法。例如:
class Tab
{
string name;
int4 code;
string body;
tree<*> pk;
};
这里的覆盖索引包含了类 Tab 中的所有字段。例如,如果只有名称和代码字段与查询相关,那么覆盖索引可以定义如下:
class Tab
{
string name;
int4 code;
string body;
tree<name, code> pk;
};
在 SQL 中定义覆盖索引时,可以使用“(*)”语法:
create index pk on Tab(*);
或者,再次仅涵盖字段name
和code
:
create index pk on Tab(name,code);
键值包含型
通过使用“键值包含型”索引来利用比普通随机存取存储器(RAM)快得多的 CPU 缓存内存,可能进一步优化性能。(有关详细说明,请参阅键值包含型和覆盖索引页面。)在 SmartEDB 数据定义语言(DDL)中,使用关键字 inclusive 定义“键值包含型”索引,如下所示:
class Tab
{
string name;
int4 code;
string body;
inclusive tree<name,code> pk;
};
或
create index pk on Tab(name,code) using INCLUSIVE;
请注意,这些“覆盖”和“键值包含”索引优化仅对 MURSIW 事务管理器有意义,并且应当与之结合使用,因为即使字段值存在于索引中,MVCC 事务管理器仍需要访问对象头以确定值的正确版本。
外部排序
有时,SQL 引擎在对大型数据集进行排序时会消耗过多内存,或者内存不足。为解决此问题,SQL 引擎通过临时文件实现了外部排序功能。要调整此外部排序操作,可以通过 SqlOptimizerParameters 结构的 workMemLimit 参数设置内存限制,或者通过向 SQL 函数 setworkmem() 传递限制值来设置。例如:
select setworkmem(4*1024*1024*1024);
一旦达到设定的限制,预先排序的临时数组就会被写入(序列化)到一个文件中。因此可能会有多个文件。当所有的排序文件都创建完成后,“读取器”会同时打开它们,并逐条记录地读取内容。
查询完成后,所有临时文件都会被删除。这些文件在当前服务器的目录中创建,文件名的构成方式如下:
sprint( "sort-%p-%p.%d", mco_get_pid(), runtime->engine, (int)++nFiles);
如果由于任何原因,在服务器停止运行时文件被遗留下来,可以手动删除这些文件。