2011-01-27 5 views
0

異なるフィールド値で失敗する面白いテーブルクエリ(SQL Server 2008)があります。誰もこれを見たことがありますか?フィルタ値によってクエリが失敗する

これは罰金(500ミリ秒)を実行

SELECT ROW_NUMBER() OVER (ORDER BY StatisticNo asc) AS RowId, Statistics.* 
FROM Statistics 
WHERE myear = 2010 

これは長い時間の後に完了した(> 3分)

SELECT ROW_NUMBER() OVER (ORDER BY StatisticNo asc) AS RowId, Statistics.* 
FROM Statistics 
WHERE myear = 2011 

の表は、興味深いことに、それが正常に動作2010年と2011年の両方のデータが含まれています2012年には現在空のセットであるフィルタオプションとして使用されます。正規化された問題がないかどうかを確認し、データがないかヌルになっていないか確認しました。 myearフィールドは必須の数値です。

テーブルにオープンまたはアクティブなロックがありません。これは1日1回書かれた統計表です。

+0

開いているトランザクションがあるかどうかを確認するには、 'DBCC OPENTRAN dbname'を実行します。 –

+0

'myear = 2011'のレコードがありますか? – Lazarus

+0

各クエリの前に 'DBCC FREEPROCCACHE'を実行するとどうなりますか?今の時代はどのように積み上げているのですか? –

答えて

2

オープントランザクションでは、おそらく2011行がロックされています。これを確認するにはNOLOCKヒントを試してみてください。

ブロックされていない状態で結果が返された場合は、ヒントなしで再度実行し、ブロックが発生している間にsys.dm_tran_locksを検索することで犯人のスパイドを見つけることができます。

+0

オープンしているトランザクションはロックされていません。 NOLOCKを使用すると、クエリのパフォーマンスに変化はありませんでした。 – jarofclay

+1

@ jarofclay私は説明が "決して完了しない(> 20分)"から "これは長い時間がかかり(3分を超えて)完了"に変わったのが分かります。それは改善しましたか?いずれにしても、両方の計画を投稿できますか?また 'Statistics'テーブルの定義は何ですか? 'SET STATISTICS IO ON'と' SET STATISTICS TIME ON'を試してみたらどんな数字が得られますか? –

+0

STATISTICS IO ONは劇的に役立ちました。ありがとうございました。 – jarofclay

2

あなたはこのクエリを実行してくださいでした:

SELECT year, COUNT(*) 
FROM statistics 
GROUP BY 
     year 

あなたは201120102012にいくつかのレコードを持っていますが、たくさんのレコード場合は、クエリが長く実行するために、それは完全に正常になります。

+0

2011年の記録は161件で、2010年の記録は1896件であり、2012年には記録はない。 – jarofclay

+0

@ jarofclay:両方のクエリの実行計画を掲載していただけますか? 「161」レコードのための「3分」は確かに鐘を鳴らす。それは再現可能ですか? – Quassnoi

関連する問題