【问题标题】:UniData UniQuery - two WITHUniData UniQuery - 两个 WITH
【发布时间】:2011-11-10 10:08:34
【问题描述】:

好吧,我对 SQL 语言知之甚少,我想知道 unidata 中两个 WITH 与一个 WITH 速度慢的可能原因是什么。

数据库有大约 100 万行。

即/

SELECT somewhere WITH Column1 = "str" AND WITH Column2 = "Int" 5

对比

SELECT somewhere WITH Column1 = "str" ~1 秒

某处被索引(据我所知)

那么我做错了什么吗?

如果需要更多信息,请询问,不确定提供什么。

还有 WITH 和 WHERE 的区别是什么?

【问题讨论】:

  • 您使用哪个数据库?我从未见过WITH这种方式 使用。你也错过了FROM
  • 这应该迁移到 dba.stackexchange.com

标签: u2 unidata uniquery


【解决方案1】:

这不是 SQL,而是 UniQuery。

为了澄清这一点,您不能索引文件(在这种情况下为somewhere),只能索引文件的列。您可能会发现 Column1 已编入索引,而 Column2 未编入索引。输入 LIST.INDEX somewhere 以找出已索引的列。

对于您的问题,您仅比较了在 Column1 上的选择与在 Column1 和 Column2 上的选择,并假设响应速度慢得多纯粹是因为您选择了 2 列。您的下一个文本应该是仅在 Column2 上进行选择,并看到这有多慢。

除了索引之外,还有许多可能的原因可以解释响应差异。在 UniData 中,列被定义为“字典项”有different types 个字典项。最基本的是一个 D 型字典项,它只是对记录中某个字段的直接引用。另一种类型是 I 或 V 类型,它是派生字段。派生字段可以像返回常量一样简单,也可以像执行与另一个文件的 JOIN 和/或某种形式的复杂计算一样复杂。这应该很容易看出,不同的列可能需要非常不同的处理量来处理。

其他原因是列在记录中的深度(第一个字段引用将比记录中后面的字段更快)以及可能影响 SELECT 时间的潜在查询缓存。

如需更多信息,请查看数据库手册Rocket Software

【讨论】:

  • 好吧 thnxs 很多 - 我将在数据库上查看可能是哪一个原因。我想是时候开始阅读该网站以了解更多关于独特性的信息,并为不正确的标签道歉。
【解决方案2】:

索引字段上的单列 SELECT 甚至不需要读取任何数据文件记录。如果您深入了解,您会发现索引文件是一个普通的哈希文件,单列 SELECT 仅表示读取了键为“str”的索引文件记录。这可能会在不到一秒的时间内返回成千上万个密钥。

添加第二列后,您可能会强制系统读取所有成千上万条记录,即使第二列已编入索引也是如此。这将花费大量时间。

通常,具有少量唯一值的字段上的索引是可疑的。如果第二列包含具有大量可能值的数据,导致每个特定索引值的记录数量较少,那么最好安排 SELECT 以便使用的索引位于第二列上。我不确定,但可以简单地颠倒 SELECT 语句中列的顺序来执行此操作。否则,您可能需要背靠背运行两个 SELECT 语句。

例如,假设文件有 600,000 条 Column1 = "str" 的记录,以及 2,000 条 Column2 = "int" 的记录:

>SELECT somewhere WITH Column2 = "int"
>>SELECT somewhere with Column1 = "str"

将读取 2,000 条记录,并且应该几乎立即返回。

如果您将经常选择 Column1 和 Column2 的组合,那么您可能需要创建一个将两者结合起来的新字典项,并在其上建立索引。

话虽如此,U2 系统不应该花 5 分钟时间来运行一个包含一百万条记录的文件。文件严重溢出的可能性很大,需要使用更大的模数来调整大小以提高性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2010-12-11
    相关资源
    最近更新 更多