在OrientDB中是空的

时间:2015-05-12 13:39:29

标签: orientdb

在我的数据库IM_0609中,OrientDB版本2.0.8是MARKS类:

    Hibernate: alter table Category drop foreign key FK_p6elut499cl32in8b8j8sy2n4
    Hibernate: alter table Product drop foreign key FK_b7afq93qsn7aoydaftixggf14
    Hibernate: drop table if exists Category
    Hibernate: drop table if exists Product
    Hibernate: create table Category (id bigint not null auto_increment, name varchar(255), parent_id bigint, primary key (id))
    Hibernate: create table Product (id bigint not null auto_increment, dataTableJson varchar(255), jargonCode varchar(255), order integer not null, category_id bigint, primary key (id))
    Hibernate: alter table Category add constraint FK_p6elut499cl32in8b8j8sy2n4 foreign key (parent_id) references Category (id)
    Hibernate: alter table Product add constraint FK_b7afq93qsn7aoydaftixggf14 foreign key (category_id) references Category (id)

在42898973行的MARKS类中,我创建了索引如下: CALIBRATION_DATE:date. DEVICE_MARK:string DEVICE_NAME:string END_MARK_NUM:decimal MARK_NUM:decimal PERIOD:decimal SERIAL_NUM:string

我快速运行以下查询:

CREATE INDEX MARK_NUM_END_MARK_NUM on MARKS(MARK_NUM,END_MARK_NUM) NOTUNIQUE

找到1件物品。查询以0.097秒(s)执行。

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

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

服务器显示以下消息:

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

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

3 个答案:

答案 0 :(得分:1)

如果您没有特别说明,那么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的具体值,因此无法使用您的索引。因此,记录读取的数量增加,并且提示"尝试减少orientdb必须执行的记录读取次数"

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

答案 1 :(得分:0)

好像你只是有太多的记录匹配查询。另外,你的意思是在第一个查询中是'IS NOT NULL',而在第二个查询中是'IS NULL'吗?

尝试使用限制

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

答案 2 :(得分:0)

此查询立即运行:

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

问:但我如何获得班级MARKS的字段?