在 OrientDB 中为空

Is Null in OrientDB

在我的数据库中IM_0609 OrientDB version 2.0.8 is a class MARKS:

CALIBRATION_DATE:date.
DEVICE_MARK:string
DEVICE_NAME:string
END_MARK_NUM:decimal
MARK_NUM:decimal
PERIOD:decimal
SERIAL_NUM:string

在 42898973 行的 class MARKS 中,我创建了如下索引: CREATE INDEX MARK_NUM_END_MARK_NUM on MARKS(MARK_NUM,END_MARK_NUM) NOTUNIQUE

我运行以下查询很快:

select * from MARKS where (MARK_NUM =84278511 AND END_MARK_NUM
=84278511 AND END_MARK_NUM IS NOT NULL)

找到 1 个项目。查询在 0.097 秒内执行。

这需要创建索引或更新查询的请求:

select * from MARKS where MARK_NUM =84278511 AND END_MARK_NUM IS NULL

服务器显示以下消息:

2015-05-12 15:46:43:129 INFO {db=IM_0609} [TIP] Query 'select * from MARKS where MARK
_NUM =84278511 AND END_MARK_NUM IS NULL' fetched more than 50000 records: to speed up
the execution, create an index or change the query to use an existent index [OProfiler
]

问:为什么要运行第二个查询?

似乎您只是有太多与查询匹配的记录。另外,您的意思是第一个查询中有 'IS NOT NULL' 而第二个查询中有 'IS NULL' 吗?

尝试限制

select * from MARKS where MARK_NUM =84278511 AND END_MARK_NUM IS NULL LIMIT 10

此查询立即运行:

select * from index:MARKS.MARK_NUM_END_MARK_NUM where key=[84278511,NULL]

问:但是如何获取我的 class MARKS 的字段?

如果您没有特别说明,Orientdb 不会为空值保留索引。为此,您必须按如下方式设置元数据标签:

CREATE INDEX addresses ON Employee (address) notunique METADATA {ignoreNullValues : false}

但是你的第一个查询

select * from MARKS where (MARK_NUM =84278511 AND END_MARK_NUM =84278511 AND END_MARK_NUM IS NOT NULL)

表示 END_MARK_NUM=84278511 的特定值,因此它可以使用索引并限制记录读取 < 50000

但是你的第二个查询

select * from MARKS where MARK_NUM =84278511 AND END_MARK_NUM IS NULL

没有说明 END_MARK_NUM 的具体值,因此它不能使用您的索引。因此记录读取的数量增加了,它给出了提示 "try to reduce the number of record reads that orientdb has to perform"

编辑:ignoreNullValues 功能中似乎存在错误。 (https://github.com/orientechnologies/orientdb/issues/4508)