Невозможно отсортировать строку размером 8130, который превышает допустимый максимум 8094 - PullRequest
1 голос
/ 29 марта 2010
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 ]

4 голосов
/ 29 марта 2010

[Неочевидная] причина, по которой SQL требуется SORT , является ключевым словом DISTINCT .

В зависимости от данных и базовых структур таблиц вы можете покончить с этим DISTINCT и, следовательно, не вызывать эту ошибку.

Вы с готовностью нашли альтернативное решение, которое заключается в обрезании некоторых полей в списке SELECT.

Редактировать : Ответ «Не могли бы вы объяснить, почему DISTINCT может быть причиной здесь?»
Как правило, способ удовлетворения требования DISTINCT зависит от

  • контекст данных (ожидаемое количество строк, наличие / отсутствие индекса, размер строки ...)
  • версия / марка реализации SQL (в частности, оптимизатор запросов получает новую или измененную эвристику с каждой новой версией, что иногда приводит к появлению альтернативных планов запросов для различных конструкций в различных контекстах)

Тем не менее, все возможные планы, связанные с «запросом DISTINCT», включают * некоторую форму * сортировки соответствующих записей. В своей простейшей форме план «кулак» создает список подходящих строк (записей) (список записей, которые удовлетворяют частям запроса WHERE / JOINs / и т. Д.), А затем сортирует этот список (который, возможно, включает несколько дубликатов). сохраняя только самое первое вхождение каждого отдельного ряда. В других случаях, например, когда выбрано только несколько столбцов и когда доступны некоторые (или) индексы, охватывающие эти столбцы, в плане запроса не используется явный шаг сортировки, но зависимость от индекса неявно подразумевает «сортируемость» «из основных столбцов. В других случаях пока оптимизатор запросов выбирает этапы, включающие различные формы слияния или хэширования, и это тоже, в конечном счете, подразумевает возможность сравнения двух строк.
Итог: DISTINCT подразумевает некоторую сортировку.

В конкретном случае вопроса ошибка, сообщаемая SQL Server и препятствующая завершению запроса, заключается в том, что " Сортировка невозможна в строках больше ..." И, ключевое слово 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%'))
0 голосов
/ 16 мая 2017

Это ограничение 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

0 голосов
/ 30 марта 2010

К вашему сведению, выполнение этой команды SQL в вашей БД может исправить проблему, если она вызвана пространством, которое необходимо освободить после удаления столбцов переменной длины:

DBCC CLEANTABLE (0,[dbo.TableName])

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

...