我遇到了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(*)之间有区别?
谢谢!
答案 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)
我认为这不是您想要的,它完全可以逆转预期的状况。