1

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
4

1 回答 1

2

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

“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
于 2015-11-13T00:45:19.163 回答