2010-03-29 73 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