2

私は、開発環境で 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 サーバーで実行した場合に違いを生むはずの何か、または実際にクエリを単純化する方法が何かわかりますか?

4

3 に答える 3

2

これはあなたの質問に対する答えではありませんが、考えるべき重要なことです。かなり複雑なクエリがあり、多くのリソースを消費します。SQL Server 2000のオプティマイザーは、複雑さのために最適化されたクエリプランを作成できず、おそらくテーブルスキャンを使用します。SQLServer2000で4つを超える結合を使用することはお勧めしません。

ステートメントを分割して一時テーブルを使用することをお勧めします

もう1つ考えるべきことは、「三角形の結合」の使用です。

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

これは、三角形の結合に関する興味深い記事です

よろしく

ホーカンウィンザー

于 2009-08-26T10:44:37.747 に答える
1

SQLに問題があることはすぐにはわかりません。ただし、受け取ったエラーがある場合は、それが役立ちます。

スキーマ/テーブル構造は両方のサーバーで同一ですか? たとえば、SQL 2005 マシンでは NVARCHAR(MAX) を使用していますが、SQL 2000 では NTEXT を使用していますか? これにより、GROUP BY が機能しなくなります。

最後に、SQL 2005 でデータベースの互換性レベルを変更できます。管理スタジオで、データベースを右クリックし、プロパティを選択します。[オプション] ページに移動し、互換性レベルとして SQL Server 2000 (80) を選択します。

于 2009-08-26T10:19:52.023 に答える
0

わかりました、これは少し恥ずかしいことです - (Robin が言ったように) SQL 自体には何も問題がないことがわかりました。クエリは ASPX アプリケーション内で実行され、web.config ファイルの接続文字列が間違っていることが判明しました。

しかし、いくつかの非常に良い回答をありがとう-互換性レベルの変更に関するRobinのヒントと、三角結合へのHåkanのポインターは、間違いなく私が調べているものです.

于 2009-08-26T11:29:47.343 に答える