Apache Ignite SQL查询结果差异

时间:2019-05-06 11:04:23

标签: java sql ignite

我遇到了Apache Ignite SQL的问题。目前,我使用的是Ignite v2.6,但以前的版本也遇到了同样的问题。

有一个这样定义的缓存:

    <bean class="org.apache.ignite.configuration.CacheConfiguration">
        <property name="name" value="Tasks"/>
        <property name="cacheMode" value="PARTITIONED" />
        <property name="backups" value="1" />
        <property name="storeKeepBinary" value="true" />
        <property name="atomicityMode" value="TRANSACTIONAL"/> 
        <property name="writeSynchronizationMode" value="FULL_SYNC"/>
        <property name="nodeFilter" ref="TaskNodeFilter" />

        <property name="queryEntities">
            <list>
                <bean class="org.apache.ignite.cache.QueryEntity">
                    <property name="keyType" value="java.util.UUID"/>
                    <property name="valueType" value="Tasks" />
                    <property name="fields">
                        <map>
                            <entry key="id" value="java.util.UUID"/>
                            <entry key="created" value="java.lang.Long"/>
                            <entry key="jobId" value="java.util.UUID"/>
                            <entry key="exception" value="java.lang.Object"/>
                            <entry key="lastAction" value="java.lang.Long"/>
                            <entry key="jobId" value="java.util.UUID"/>
                            <entry key="masterId" value="java.util.UUID"/>
                            <entry key="identifier" value="java.lang.String"/>
                            <entry key="status" value="java.lang.Integer"/>
                            <entry key="nodeId" value="java.util.UUID"/>
                            <entry key="status" value="java.lang.Integer"/>
                            <entry key="progressMax" value="java.lang.Long"/>
                            <entry key="progressAt" value="java.lang.Long"/>
                            <entry key="actionType" value="java.lang.String"/>
                        </map>
                    </property>

                    <property name="indexes">
                        <list>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="jobId"/>
                            </bean>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="status"/>
                            </bean>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="actionType"/>
                            </bean>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="created"/>
                            </bean>
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="masterId"/>
                            </bean>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

条目“创建的”是System.currentTimeMillis()的时间戳,因此在Java中是一个长值。因此,我在缓存配置中将此字段设置为“ Java.lang.Long”。

现在,当我使用SQL进行搜索时,根据查询,我会得到不同的结果,但始终具有相同的范围:

select COUNT(id) as ANZAHL
FROM "Tasks".Tasks
where created BETWEEN 1543705200000 AND 1545433200000;
  

返回0(错误!)

select COUNT(id) as ANZAHL
FROM "Tasks".Tasks
where CAST(created AS BIGINT) BETWEEN 1543705200000 AND 1545433200000;
  

返回1142(这是期望值)

select COUNT(*) as ANZAHL
FROM "Tasks".Tasks
where CAST(created AS BIGINT) BETWEEN 1543705200000 AND 1545433200000;
  

返回0(错误!)

我做错什么了吗?如果它的长值足够了,为什么还要将值转换为BIGINT?另外,为什么COUNT(id)和COUNT(*)之间有区别?

谢谢!

1 个答案:

答案 0 :(得分:0)

我还观察到计数问题,但这与转换无关,它通过修复如下所示的查询来发呆

select COUNT(id) as ANZAHL
FROM "Tasks".Tasks
where created <= 1543705200000 AND created >= 1545433200000;    

您不需要将long强制转换为BIGINT,并且可以在不强制强制转换的情况下触发以上查询。 为什么BETWEEN不能正常工作?
我试图获取类似查询的查询计划(您提到),并且可以看到以下内容-
在哪里(__Z0.CREATED> = 1543705200000)     AND(__Z0.CREATED <= 1545433200000)
我认为这不是您想要的,它完全可以逆转预期的状况。