【问题标题】:Cannot sort a row of size 8130, which is greater than the allowable maximum of 8094无法对大小为 8130 的行进行排序,该行大于允许的最大值 8094
【发布时间】:2011-02-01 22:20:19
【问题描述】:
SELECT DISTINCT tblJobReq.JobReqId
              , tblJobReq.JobStatusId
              , tblJobClass.JobClassId
              , tblJobClass.Title
              , tblJobReq.JobClassSubTitle
              , tblJobAnnouncement.JobClassDesc
              , tblJobAnnouncement.EndDate
              , blJobAnnouncement.AgencyMktgVerbage
              , tblJobAnnouncement.SpecInfo
              , tblJobAnnouncement.Benefits
              , tblSalary.MinRateSal
              , tblSalary.MaxRateSal
              , tblSalary.MinRateHour
              , tblSalary.MaxRateHour
              , tblJobClass.StatementEval
              , tblJobReq.ApprovalDate
              , tblJobReq.RecruiterId
              , tblJobReq.AgencyId 

FROM ((tblJobReq 
    LEFT JOIN tblJobAnnouncement ON tblJobReq.JobReqId = tblJobAnnouncement.JobReqId) 
    INNER JOIN tblJobClass ON tblJobReq.JobClassId = tblJobClass.JobClassId)

    LEFT JOIN tblSalary ON tblJobClass.SalaryCode = tblSalary.SalaryCode 

WHERE (tblJobReq.JobClassId in (SELECT JobClassId 
                                from tblJobClass 
                                WHERE tblJobClass.Title like '%Family Therapist%'))

当我尝试执行查询时,会导致以下错误。

Cannot sort a row of size 8130, which is greater than the allowable maximum of 8094

我检查并没有找到任何解决方案。唯一的方法是在列大小约为 8000 的查询中截断(substring())“tblJobAnnouncement.JobClassDesc”。

我们是否有任何解决方法,以便我不需要截断这些值。或者这个查询可以优化吗? SQL Server 2000 中的任何设置?

【问题讨论】:

  • 请努力正确格式化代码。以上内容很难理解。
  • 我刚刚做了另一个编辑,现在它比你原来的文本块更容易阅读......它击败了我,任何人都可以阅读/调试这样的混乱文本。你也可以去掉大部分括号,唯一真正需要的是 WHERE 子句中最后一个 SELECT 周围的括号。

标签: select sql-server-2000 query-optimization


【解决方案1】:

SQL 需要 SORT 的 [不明显] 原因是 DISTINCT 关键字。

根据数据和基础表结构,您可能能够取消此 DISTINCT,因此不会触发此错误。

您很容易找到替代解决方案,即截断 SELECT 列表中的某些字段。

编辑:回答 “你能解释一下 DISTINCT 是怎么造成的吗?”
通常,满足 DISTINCT 要求的方式随

  • 数据上下文(预期的行数、存在/不存在索引、行大小...)
  • SQL 实现的版本/版本(查询优化器尤其会接收每个新版本的新启发式或修改后的启发式方法,有时会导致在各种上下文中为各种构造生成备用查询计划)

然而,与“DISTINCT 查询”相关的所有可能的计划都涉及*某种形式的*排序合格记录。以最简单的形式,计划“拳头”生成合格行(记录)的列表(满足查询的 WHERE/JOINs/等部分的记录列表),然后对该列表进行排序(可能包括一些重复项) ,只保留每个不同行的第一次出现。在其他情况下,例如,当只选择了几列并且覆盖这些列的某些索引可用时,查询计划中没有使用显式排序步骤,但对索引的依赖隐含地暗示“可排序性” "的基础列。在其他情况下,查询优化器会选择涉及各种形式的合并或散列的步骤,这些步骤最终也暗示了比较两行的能力。
底线:D​​ISTINCT 意味着某种排序。

在问题的具体情况下,SQL Server 报告的错误并阻止查询完成是“排序 在大于...的行上是不可能的”AND,DISTINCT关键字是查询需要任何排序的唯一明显原因(顺便说一句,许多其他 SQL 构造暗示排序:例如 UNION)因此删除 DISTINCT 的想法(如果在逻辑上可能的话)。
事实上,您应该删除它,出于测试目的,以断言,在没有 DISTINCT 的情况下,查询可以完成(如果仅包括一些重复项)。一旦确认了这一事实,并且如果查询可以有效地产生重复的行,请研究在没有 DISTINCT 关键字的情况下产生无重复查询的方法;涉及子查询的构造有时可以用于此目的。


不相关的提示,是使用表别名,使用短字符串来避免重复这些长表名。例如(只做了几张桌子,但你明白了......)

SELECT DISTINCT JR.JobReqId, JR.JobStatusId, 
  tblJobClass.JobClassId, tblJobClass.Title,
  JR.JobClassSubTitle, JA.JobClassDesc, JA.EndDate, JA.AgencyMktgVerbage,    
  JA.SpecInfo, JA.Benefits,
  S.MinRateSal, S.MaxRateSal, S.MinRateHour, S.MaxRateHour,
  tblJobClass.StatementEval, 
  JR.ApprovalDate, JR.RecruiterId, JR.AgencyId 
FROM (
(tblJobReq AS JR 
 LEFT JOIN tblJobAnnouncement AS JA ON JR.JobReqId = JA.JobReqId) 
INNER JOIN tblJobClass ON tblJobReq.JobClassId = tblJobClass.JobClassId)
LEFT JOIN tblSalary AS S ON tblJobClass.SalaryCode = S.SalaryCode
WHERE (JR.JobClassId in 
(SELECT JobClassId from tblJobClass 
WHERE tblJobClass.Title like '%Family Therapist%'))

【讨论】:

  • 但这会截断不应该发生的值。我需要在不改变数据库结构的情况下实现这一点,也不应该截断这些值。它在 PROD 中运行了很长时间。突然一切都搞砸了:(
  • 您正在对此进行 DISTINCT 的事实可能表明您的某些 JOIN 不是最理想的,您能否通过这些工作来消除重复的行,从而消除对 DISTINCT 的需求?
  • @mjv 感谢您的提示。当我写脚本时会跟进
  • @mjv 您能否解释一下 Distinct 的原因?或者你能指出任何可以解释原因的资源吗?
【解决方案2】:

仅供参考,如果问题是由删除可变长度列后需要回收的空间引起的,则在您的数据库上运行此 SQL 命令可以解决问题:

DBCC CLEANTABLE (0,[dbo.TableName])

见:http://msdn.microsoft.com/en-us/library/ms174418.aspx

【讨论】:

    【解决方案3】:

    这是 SQL Server 2000 的限制。您可以:

    1. 将其拆分为两个查询并在其他地方合并

      SELECT ID, ColumnA, ColumnB FROM TableA JOIN TableB
      SELECT ID, ColumnC, ColumnD FROM TableA JOIN TableB
      
    2. 适当地截断列

      SELECT LEFT(LongColumn,2000)...
      
    3. 从 SELECT 中删除所有冗余列

      SELECT ColumnA, ColumnB, --IDColumnNotUsedInOutput
      FROM TableA
      
    4. 从 SQL Server 2000 迁移

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      相关资源
      最近更新 更多