0

古いClassicASPWebサイトを更新しています。テキストデータのいくつかの列と日時フィールドを含むテーブルがあります。表のすべての値から一意の年のリストを取得する必要があります。私はこれを試しました:

set objConnection = Server.CreateObject("ADODB.Connection")
objConnection.ConnectionString = "Provider=SQLNCLI10;Server=localhost;Database=mydb;Uid=myuser;Pwd=something;"
objConnection.Open

set objRst = objConnection.execute("SELECT DISTINCT(YEAR(report_date)) AS report_year FROM report;")
if not objRst.eof then
    do while not objRst.eof
        response.write objRst("report_year")
        objRst.movenext
    loop
end if

しかし、このスクリプトをページで実行すると、何も実行されません。最終的にはスクリプトがタイムアウトします。

誰かがこれを達成する方法を提案できますか?ありがとう!

4

1 に答える 1

0

これは、インデックスの問題またはロックの問題(あるいはその両方)になります。

まず、NOLOCKヒントを使用してデータを選択してみてください。これは、selectクエリがコミットされていないトランザクションを待機しないことを意味します。

set objRst = objConnection.execute("SELECT YEAR(report_date) AS report_year FROM report (NOLOCK) GROUP BY YEAR(report_date)") 
do while not objRst.eof 
    response.write objRst("report_year") 
    objRst.movenext 
loop 

それでも問題が解決しない場合は、インデックスの問題が示唆されます。それを整理するには、SSMSでクエリを実行し(可能な場合)、そこにかかる時間を確認する必要があります。SSMSで時間がかかる場合は、report_date列にインデックスを作成する必要があることをお勧めします。SSMSで高速である場合は、ASPと関係があります。つまり、接続が開いていますか?簡単なクエリを実行して、それが機能することを確認しましたか?すなわち

SELECT TOP 1 YEAR(report_date) 
FROM report

編集:テーブルには5行しかないという事実に関するコメントに気づきました。したがって、おそらくインデックス作成の問題ではありません。ただし、NOLOCKヒントとGROUP BY(ではなくDISTINCT)が役立つ場合があります。

これの実行計画も見るのは興味深いでしょう(つまり、物事を遅くするトリガーがないことを確認してください)

于 2012-09-11T16:27:24.850 に答える