【问题标题】:How to perform a client-side full scan in Tarantool?如何在 Tarantool 中执行客户端全扫描?
【发布时间】:2020-06-29 22:59:45
【问题描述】:

我需要在我的应用程序中持续迭代整个空间。 目前我正在使用批次(例如经典的限制偏移方法),但是 它不能在一个事务中完成并且会不一致(例如,从已读取的元组的子集中删除将导致元组丢失,因为偏移量发生了变化)。

此外,手动批处理不是那么用户友好,我想要以下内容:

    rows, err := conn.Query(ctx, "SELECT id, title, tags FROM video")
    if err != nil {
        panic(err)
    }
    var videos []Video
    for rows.Next() {
        var v Video
        if err := rows.Scan(&v.ID, &v.Title, &v.Tags); err != nil {
            panic(err)
        }
        videos = append(videos, v)
    }

这就是我在 go 和 postgresql 中执行 SELECT 整个表的方式,这将在内部缓冲并且仍然一致。

有没有办法在 Tarantool 中实现这一点?

【问题讨论】:

    标签: tarantool


    【解决方案1】:

    可能回答可能与您的主题不完全相关,但我尝试描述在没有 SQL 的情况下应该如何完成。

    首先,Tarantool 不支持交互式事务 (https://github.com/tarantool/tarantool/issues/2016) 和服务器端游标。 您不能执行多个选择并确保它们之间的所有数据都没有被修改。

    所以,如果您对这些限制感到满意,让我们继续。这是一个小例子。这里我使用了官方的 Tarantool go 连接器 (https://github.com/tarantool/go-tarantool)

    
        spaceName := "tester"
        indexName := "scanner"
        idFn := conn.Schema.Spaces[spaceName].Fields["id"].Id // field number of Id
        bandNameFn := conn.Schema.Spaces[spaceName].Fields["band_name"].Id
    
        var tuplesPerRequest uint32
        cursor := []interface{}{}
        tuplesPerRequest = 10
    
    
        for {
            resp, err := conn.Select(spaceName, indexName, 0, tuplesPerRequest, tarantool.IterGt, cursor)
            if err != nil {
                panic(err)
            }
    
            if resp.Code != tarantool.OkCode {
                panic(err)
            }
         
            if len(resp.Data) == 0 {
                break // No more data
            }
    
            tuples := resp.Tuples()
            for _, tuple := range tuples {
                fmt.Printf("\t%v\n", tuple)
            }
            
            lastTuple := tuples[len(tuples) - 1]
            cursor = []interface{}{lastTuple[idFn], lastTuple[bandNameFn]}
        }
    
    

    我应该注意到一些事情。我不使用偏移量。不要在 Tarantool 中使用偏移量!我使用“光标”。它是您已索引的一组字段以及一个迭代器(在我的示例中为 Gt)。简而言之,“偏移”会导致 B-Tree 索引的完整扫描,而建议的方法指定应该开始/继续扫描的点。

    您可以为您的 lua 存储过程使用“调用”,而不是使用 Select 函数。例如。您想直接在数据库/应用程序服务器级别过滤元组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 2014-04-04
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多