3

レポートの目的でページ上のテーブルのデータを動的に生成する15のクエリがあります。各クエリには250〜900ミリ秒かかります。これは、サーバーの負荷に応じて4〜13秒のページ読み込み時間を意味します。読み込み時間により、一部のユーザーはページがまったく読み込まれないと考えています。

クエリを合理化して、より許容できる読み込み時間を与える方法があるかどうか疑問に思いました。クエリの1つは次のとおりです。

             <cfquery datasource="MeetingDB"  name="One">
              SELECT COUNT( meetingID ) AS countatron
              FROM case_meeting
              WHERE meetingID
              IN (

              SELECT DISTINCT a.meetingID
              FROM case_meeting a
              INNER JOIN meeting b ON a.meetingID = b.meetingID
              WHERE b.categoryID =  '1' 
              AND SUBSTRING( meetingCode, 5, 2 ) 
              BETWEEN 12 
              AND 22 
              AND SUBSTRING( meetingCode, 7, 2 ) 
              BETWEEN 01 
              AND 12 
              AND SUBSTRING( meetingCode, 9, 2 ) 
              BETWEEN 01 
              AND 31
              )
              AND caseID
              IN (
              '1',  '2',  '3', '28',  '29',  '30', '39', '40', '45'
              )
              GROUP BY meetingID
              HAVING COUNT( caseID ) > 0 AND COUNT( caseID ) < 2
              </cfquery>

              <td><cfoutput> #One.recordcount# </cfoutput></td>
4

4 に答える 4

5

このクエリを試してください

SELECT COUNT( a.meetingID ) AS countatron
          FROM case_meeting a, case_meeting b
          WHERE a.meetingID = b.meetingID 
          AND b.categoryID =  '1' 
          AND SUBSTRING( b.meetingCode, 5, 2 ) 
          BETWEEN 12 
          AND 22 
          AND SUBSTRING( b.meetingCode, 7, 2 ) 
          BETWEEN 01 
          AND 12 
          AND SUBSTRING( b.meetingCode, 9, 2 ) 
          BETWEEN 01 
          AND 31
          AND b.caseID
          IN (
          '1',  '2',  '3', '28',  '29',  '30', '39', '40', '45'
          )
          GROUP BY a.meetingID
          HAVING COUNT( a.caseID ) = 1
于 2013-02-25T09:39:18.587 に答える
2

INを使用するのではなく、副選択で結合を実行することを試みる価値があるかもしれません。

このようなもの:-

SELECT COUNT( case_meeting.meetingID ) AS countatron
FROM case_meeting
INNER JOIN (
SELECT DISTINCT a.meetingID
FROM case_meeting a
INNER JOIN meeting b ON a.meetingID = b.meetingID
WHERE b.categoryID =  '1' 
AND SUBSTRING( meetingCode, 5, 2 ) BETWEEN 12 AND 22 
AND SUBSTRING( meetingCode, 7, 2 ) BETWEEN 01 AND 12 
AND SUBSTRING( meetingCode, 9, 2 ) BETWEEN 01 AND 31
) Sub1
ON case_meeting.meetingID = Sub1.meetingID
INNER JOIN (
SELECT meetingID, COUNT( caseID ) AS MeetingCaseCount
FROM case_meeting
WHERE  caseID IN ('1',  '2',  '3', '28',  '29',  '30', '39', '40', '45')
GROUP BY meetingID
) Sub2
ON case_meeting.meetingID = Sub2.meetingID
WHERE  Sub2.MeetingCaseCount > 0 AND Sub2.MeetingCaseCount < 2
GROUP BY case_meeting.meetingID
于 2013-02-25T09:46:35.107 に答える
1

相互に依存しないクエリがたくさんある場合は、cfthreadを見てください。これにより、クエリを同時に実行できるようになります。

徹底的にテストしてください。cfthreadの使用がデータベースサーバーに悪影響を及ぼしたという経験が1つあります。

それでも一撃の価値はあります。

于 2013-02-25T13:10:06.970 に答える
0

MySqlでプロシージャを作成し、SQLから引数を使用してプロシージャを呼び出すのが最も適切だと思います。動的パラメータを使用してビューを作成することもできます

于 2013-02-25T09:39:11.260 に答える