2010-03-29 74 views
1

最大容许更大的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无法排序尺寸8130,这比8094

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中的任何设置?

+1

请努力正确格式化代码。以上是非常难以理解的。 – 2010-03-29 06:42:26

+0

我只是做了另一次编辑,现在阅读起来比原来的文本块要容易得多......它让我不禁想到,任何人都可以阅读/调试这样的文本。您还可以摆脱大部分这些括号集合,唯一真正需要的是那些在WHERE子句中最后一个SELECT中的那些。 – slugster 2010-03-29 07:12:59

回答

4

的[非显而易见]之所以SQL需要排序DISTINCT关键字。

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

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

编辑:回答“你能解释DISTINCT是如何成为这里的原因吗?”
一般地,在其中DISTINCT要求是满意的方式与

  • 数据上下文(行,存在/不存在索引,行的大小的预期数...)
  • 版本而变化/使SQL执行情况(特别是查询优化器接收新的或修改的启发式与每个新版本,有时会导致在替代查询计划用于在各种情况下的各种构建体)

然而,所有可能的计划associat用“DISTINCT查询”编辑涉及*某些形式*排序的合格记录。以最简单的形式,计划“拳头”产生合格行(记录)列表(满足查询的WHERE/JOINs/etc部分的记录列表),然后对该列表进行排序(可能包括一些重复项) ,仅保留每个不同行的第一次出现。在其他情况下,例如,当只选择少数几列并且覆盖这些列的某些索引可用时,查询计划中不会使用明确的排序步骤,但对索引的依赖隐含意味着“可排序性“的底层专栏。在其他情况下,查询优化器会选择涉及各种形式的合并或哈希的步骤,而这些步骤最终也意味着能够比较两行。
底线:DISTINCT意味着一些排序。

在问题的特殊情况下,SQL Server和预防查询完成报告的错误是“排序是不可能的行比......大”,而且,DISTINCT关键字是查询需要任何排序的唯一明显原因(顺便提一下,许多其他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%')) 
+0

但是,这会妨碍不应该发生的价值。我需要在不改变数据库结构的情况下实现这一点,并且不应该截断值。它在PROD中运行了很长时间。突然之间所有消息:( – 2010-03-29 06:54:31

+2

事实上,你正在做一个DISTINCT这可能表明,你的一些JOIN有点不理想,你可以在那些工作,以消除重复的行,从而消除DISTINCT的需要? – slugster 2010-03-29 06:59:42

+0

@mjv谢谢你的提示,当我编写脚本时会跟着 – 2010-03-29 07:06:55

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