【问题标题】:Speed up UniVerse access times using UniObjects使用 UniObjects 加快 UniVerse 访问时间
【发布时间】:2012-06-07 17:21:53
【问题描述】:

我正在访问 UniVerse 数据库并读取其中的所有记录,以便将其同步到 MySQL 数据库,该数据库用于与使用该数据的其他一些应用程序兼容。一些表的长度 >250,000 条记录,列 >100 列,服务器相当老旧,仍然被许多同时使用的用户使用,因此有时读取记录需要很长时间。

示例:我执行 SSELECT TO 0 并开始读取选择列表,将每条记录解析为我们的数据抽象类型并将其放入 .NET 列表中。根据具体情况,获取每条记录可能需要 250 毫秒到 3/4 秒,具体取决于数据库使用情况。删除提取方法只会稍微加快它的速度,因为我认为它仍然会在我调用 UniFile.read 时下载所有记录信息,即使我不使用它。

以这种速度读取 250,000 条记录非常慢,那么有谁知道我可以加快速度的方法吗?我应该在某处设置一些选项吗?

【问题讨论】:

    标签: c# .net universe uniobjects


    【解决方案1】:

    您真的需要使用 SSELECT(排序选择)吗?记录键上的排序将产生额外的性能开销。如果您不需要以排序方式进行同步,只需使用普通的 SELECT,这应该会提高性能。

    如果这没有帮助,那么尝试在系统使用率较低的时候自动运行同步,如果可能的话,当很少或没有用户登录到 UniVerse 系统时。

    除此之外,您导出的某些表可能需要调整大小。如果它们不是动态文件(自动调整大小 - 类型 30),它们可能已进入磁盘上的溢出空间。 要找出最大表的大小并查看它们是否溢出,您可以在命令行中使用 FILE.STAT 和 HASH.HELP 等命令来检索更多信息。使用 HELP FILE.STAT 或 HELP HASH.HELP 查看这些命令的文档,以便提取您需要的信息。

    如果这些命令显示您的文件类型为 30,那么数据库引擎会自动调整它们的大小。但是,如果文件类型是类型 2 到 18 之间的任何类型,则 HASH.HELP 命令可能会建议您对表大小进行更改以提高其性能。

    如果这些都没有帮助,那么您可以使用 LIST.INDEX TABLENAME ALL 检查表上的有用索引,您可以使用它来加快选择速度。

    【讨论】:

    • 原来我访问服务器的方式(通过防火墙的 ssh 隧道)实际上是瓶颈。所以,我们要让服务在防火墙内运行来解决这个问题。
    【解决方案2】:

    使用 ANALYZE-FILE 文件名确保您的文件大小正确。如果不是动态的,请确保没有太多溢出。

    使用 SELECT 而不是 SSELECT 将意味着您从数据库中顺序读取数据而不是随机读取数据,并且速度明显更快。

    您还应该调查如何从每条记录中提取数据并将其放入列表中。通常pick数据分隔符chars 254、253和252会与外部数据库不兼容,需要进行转换。如何做到这一点会对性能产生巨大影响。

    从最初的帖子中不清楚,但是 WRITESEQ 可能是输出文件数据的最有效方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2015-02-24
      相关资源
      最近更新 更多