【问题标题】:How to run complex queries in Tarantool如何在 Tarantool 中运行复杂的查询
【发布时间】:2019-05-07 10:43:22
【问题描述】:

我一直使用关系数据库,最近决定将性能关键服务从 SQL Server 迁移到 Tarantool,希望能够利用快速的内存搜索和处理。在计划迁移时,我有几个问题。

我有一张包含大约一百万条记录的表格,其中包含定价信息,这意味着我主要处理数字和 uuid。首先,我需要运行一个包含多个条件的选择来获取数据的子集,例如

SELECT * FROM rates WHERE SupplierId = @SupplierId AND ProductId = @ProductId AND (LocalDistributionZoneId = @LocalDistributionZoneId OR LocalDistributionZoneId IS NULL)

Q1:在 Lua 中运行这样的查询的策略是什么?我是为谓词中的每个字段创建一个索引,还是可以使用一个二级复合索引?

Q2:在 SQL (box.sql.execute) 中而不是在纯 Lua 中运行这样的查询会更方便吗?它会比在纯 Lua 中运行相同的查询慢很多吗?

Q3:如果我使用 SQL,是否可以查看执行计划以确保我运行的查询确实使用了我在空间中定义的索引?

好的,在获得第一个查询的结果后,我需要分析数据,然后根据分析结果,对第一个查询返回的数据集再运行一个查询。

Q4:Tarantool 可以帮我处理中间数据集吗?更具体地说,我可以利用空间中创建的索引以某种方式对元组的中间子集运行更多查询吗?或者,我需要实施替代策略,例如将 intrim 结果重新添加到具有预定义索引的临时空间,然后再进行一次选择,或者自己实施进一步的搜索?

谢谢!

【问题讨论】:

    标签: lua tarantool


    【解决方案1】:
    1. 不要。使用 SQL,它更快:它不会为中间执行结果创建垃圾收集对象。
    2. 是的,请使用我们的 SQL 功能。
    3. 使用 EXPLAIN 语句。
    4. 我不知道您所说的“帮助”究竟是什么意思。您可以尝试任何最有效的策略:创建一个更复杂的查询,将原始查询保存在视图中以在结果查询中使用,创建一个临时表并使用它。为了提供更多详细信息,让我们看看 Tarantool 选择的执行计划是否足够好,或者您必须手动优化它。

    【讨论】:

    • "你必须手动优化它" -- 你可以手动优化计划吗?可以加点提示什么的吗?
    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多