【问题标题】:Apache Ignite SQL query result differenceApache Ignite SQL 查询结果差异
【发布时间】:2019-05-06 11:04:23
【问题描述】:

我遇到了 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>

“created”条目是来自 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(*) 有区别?

谢谢!

【问题讨论】:

  • 我看不出COUNT(*) 怎么能返回比COUNT(id) 更小的值,如果这是查询中的唯一区别并且基础数据没有改变的话。
  • 是的,这是我遇到的一个问题。第二个是如果您比较第一个和第二个 SQL,查询似乎需要 CAST 到 BIGINT。顺便说一句,我在第一个 SQL 语句中有错字,我刚刚更正了。
  • 只是补充一下,我的测试之间的数据没有变化。结果与上述陈述一致。

标签: java sql ignite


【解决方案1】:

我也观察到计数问题,但这与强制转换无关,它可以通过修复如下查询来解决

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

您不需要将 long 转换为 BIGINT 并且可以在不转换的情况下触发上述查询。 那么为什么 BETWEEN 不起作用呢?
我试图获取类似查询的查询计划(由您提到),并且可以在其中看到以下内容--
在哪里(__Z0.创建> = 1543705200000) AND (__Z0.CREATED 我不认为那是你想要的,它完全扭转了预期的情况。

【讨论】:

  • 如果我正确阅读了您的 SQL 语句,则不会有任何匹配,因为没有任何数字可以同时小于小条件和大于大条件。另一方面,查询计划对我来说看起来很合适。你把这两个大数字混在一起了吗?
  • 我在没有 BETWEEN 的情况下进行了测试,结果与使用 BETWEEN 的结果相同。
  • 对我来说,执行计划(不使用强制转换)与上面共享的一样,因此在 BETWEEN 的情况下我无法获得结果。当我像您一样使用 CAST 时,这就是给出期望的执行计划,但仍然没有显示结果。我分享的 SQL 查询格式怎么样?它对你有用吗?
  • 我的意思是您的 SQL 查询“在哪里创建 = 1545433200000”永远不会给出结果,对吧? 'created' 值永远无法满足此条件,因为第一个数字较小,第二个数字较大。使用 BETWEEN 会显示您所显示的计划,并且该计划对我来说很合适。我遇到的问题是您的 SQL 和 BETWEEN 语句都没有显示任何结果。它仅适用于 CAST 和 COUNT(id)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-25
  • 2020-08-16
  • 1970-01-01
  • 2022-12-19
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多