Несколько внутренних объединений в SQL 2000 - PullRequest
2 голосов
/ 26 августа 2009

Я в неудачной ситуации разработки приложения с использованием SQL Server 2005 в среде разработки, но SQL Server 2000 на рабочем сервере. У меня довольно сложный запрос SELECT, который отлично работает на сервере разработки / тестирования, но падает в производственной среде:

SELECT tbl_questions.Question, tbl_questions.QuestionCode 
FROM tbl_questions INNER JOIN (
    SELECT sg.questioncode, sg.gradeB, sg.gradeA, t2.wt 
    FROM tbl_scoregrade AS sg INNER JOIN (
        SELECT t1.QuestionCode, AVG(1.0 * aw.Weight) AS wt 
        FROM tbl_AnswerWeight AS aw INNER JOIN (
            SELECT assa.QuestionCode, assa.Answer 
            FROM tbl_AllStaffSurveyAnswers AS assa INNER JOIN 
            tbl_AllStaffSurvey AS ass ON assa.Questionguid = ass.Questionguid 
            WHERE (ass.Trust = 'RD7') AND (ass.Specialty = '97'))
        AS t1 ON aw.questioncode = t1.QuestionCode AND aw.Response = t1.Answer 
        GROUP BY t1.QuestionCode )
    AS t2 ON sg.questioncode = t2.QuestionCode AND sg.gradeA > t2.wt)
AS t3 ON tbl_questions.QuestionCode = t3.questioncode

Можете ли вы увидеть что-нибудь, что должно иметь значение при запуске на разных версиях SQL-сервера, или действительно какие-либо способы упрощения запроса в любом случае?

Ответы [ 3 ]

2 голосов
/ 26 августа 2009

Это не ответ на ваш вопрос, но важная вещь для размышления. У вас довольно сложный запрос, и он потребляет много ресурсов. Оптимизатор в SQL Server 2000 не сможет создать оптимизированный план запросов из-за сложности и, вероятно, будет использовать сканирование таблиц. Не рекомендуется использовать более 4 объединений в SQL Server 2000.

Я предлагаю вам попытаться разделить оператор и использовать временные таблицы

Еще одна вещь, о которой стоит подумать, это использование «треугольного соединения»

ON sg.questioncode = t2.QuestionCode AND sg.gradeA > t2.wt

Это интересная статья о треугольных соединениях

Привет

Хокан Винтер

1 голос
/ 26 августа 2009

Я не вижу ничего сразу не так с SQL. Однако, если у вас есть ошибки, которые вы получаете, это поможет.

Схемы / структура таблиц идентичны на обоих серверах? Например, используете ли вы NVARCHAR (MAX) на машине с SQL 2005, а NTEXT на SQL 2000? Это остановит работу вашей GROUP BY.

Наконец, вы можете изменить уровень совместимости базы данных в SQL 2005. В Management Studio щелкните правой кнопкой мыши базу данных, выберите Свойства Перейдите на страницу параметров и выберите уровень совместимости как SQL Server 2000 (80).

0 голосов
/ 26 августа 2009

Хорошо, это немного смущает - оказывается (как сказал Робин), что в самом SQL нет ничего плохого; запрос выполняется в приложении ASPX, и выясняется, что строка подключения в файле web.config неверна.

Но спасибо за несколько очень хороших ответов - совет Робина по изменению уровня совместимости и указатель Хокана на треугольные объединения, безусловно, будут предметом изучения.

...