无法对8130行进行排序,这大于允许的最大值8094

时间:2010-03-29 06:39:20

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

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

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

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

3 个答案:

答案 0 :(得分:4)

SQL需要 SORT 的[非显而易见]原因是 DISTINCT 关键字。

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

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

修改:回答“你能解释一下DISTINCT是什么原因吗?”
通常,满足DISTINCT要求的方式因

而异
  • 数据上下文(预期行数,索引的存在/不存在,行的大小......)
  • SQL实现的版本/品牌(特别是查询优化器会在每个新版本中接收新的或修改的启发式,有时会导致各种上下文中各种构造的备用查询计划)

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

在问题的特定情况下,SQL Server报告并阻止查询完成的错误是“排序不可能在大于...的行上”和“DISTINCT”关键字是查询要求任何排序的唯一明显原因(BTW许多其他SQL结构暗示排序:例如UNION)因此删除DISTINCT的想法(如果它在逻辑上是可行的)。
实际上你应该删除它,用于测试目的,断言在没有DISTINCT的情况下,查询完成OK(如果只包括一些重复项)。一旦确认了这一事实,并且如果有效地查询可以产生重复的行,那么在没有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%'))

答案 1 :(得分:0)

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

DBCC CLEANTABLE (0,[dbo.TableName])

请参阅:http://msdn.microsoft.com/en-us/library/ms174418.aspx

答案 2 :(得分:0)

这是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