【问题标题】:NexusDB execution failedNexusDB 执行失败
【发布时间】:2015-11-12 10:46:16
【问题描述】:

NexusDB:查询执行失败: 临时存储管理器中的操作系统错误:Espace insuffisant sur le disque($70/112)

[$2B27/11047]

我不明白这条信息。真正的问题是什么?

查询代码:

SELECT d.Code, c.RaisonSociale, c.EMail, m.Article, m.Quantite, m.TotalTTC, m.NumeroTicket 
FROM C_Client c, C_Mouvement m, C_Depot d, C_Article a, C_Ticket t 
WHERE c.Ident = m.RefClient 
AND m.Article = a.Code 
AND t.DateFacture BETWEEN :dateDebut AND :dateFin

【问题讨论】:

  • 在 XLReport 上执行我的 sql 请求后
  • 您可以将您的 SQL 代码添加到问题中吗?你更有可能以这种方式得到回应。 (虽然最初的印象是你的磁盘空间已经用完了。)
  • SELECT d.Code, c.RaisonSociale, c.EMail, m.Article, m.Quantite, m.TotalTTC, m.NumeroTicket FROM C_Client c, C_Mouvement m, C_Depot d, C_Article a, C_Ticket t WHERE c.Ident = m.RefClient AND m.Article = a.Code AND t.DateFacture BETWEEN :dateDebut AND :dateFin
  • 我已将其添加到您的问题中。

标签: nexusdb


【解决方案1】:

“临时存储管理器”负责存储脏块,如果缓冲区管理器已达到允许的最大内存量并且必须从内存中逐出块。

“Espace insuffisant sur le disque”是一条操作系统错误消息,我猜它会说“磁盘已满”。这意味着 TSM 用于存储的磁盘已满。

可能是因为您的查询生成的结果集非常庞大,以至于超出了您的可用内存和磁盘空间。

如果您查看您的查询,这并不奇怪:

FROM 
  C_Client c, 
  C_Mouvement m, 
  C_Depot d, 
  C_Article a, 
  C_Ticket t 
WHERE 
  c.Ident = m.RefClient AND 
  m.Article = a.Code AND 
  t.DateFacture BETWEEN :dateDebut AND :dateFin

您正在连接 5 个表,但您只定义了其中 3 个(c、m 和 a)之间的连接条件,这将与其他 2 个表产生完全无限制的交叉连接。如果我们只假设每个(c、m 和 a)、d 和 t 有 1000 条记录,那已经是 1,000,000,000 条记录的结果集。

这就是为什么您使用的连接语法已经被 SQL 标准弃用了二十多年的原因之一。如果您尝试使用当前语法编写查询,问题很快就会变得明显:

FROM 
    C_Client AS c
  INNER JOIN
    C_Mouvement AS m ON c.Ident = m.RefClient
  INNER JOIN 
    C_Article AS a ON m.Article = a.Code
  INNER JOIN
    C_Depot AS d ON --???
  INNER JOIN
    C_Ticket AS t ON --???
WHERE 
  t.DateFacture BETWEEN :dateDebut AND :dateFin

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2021-10-26
    相关资源
    最近更新 更多