NexusDB execution failed

时间:2015-11-12 10:46:17

标签: nexusdb

NexusDB : Query execution failed: Operating system error in Temporary Storage Manager: Espace insuffisant sur le disque($70/112)

[$2B27/11047]

I don't understand this message. What's the real problem?

Query code:

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

1 个答案:

答案 0 :(得分:2)

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

" Espace insuffisant sur le disque"是一个操作系统错误消息,我猜这会说"磁盘已满#34;这意味着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