2

SQL サーバーから取得したいデータがあります。

この古いデータベースには主キーが関連付けられていないため、データを取得することは、Excel スプレッドシート (実際には何年も前に作成されたもの) にクエリを実行するようなものです。

ただし、このデータについてレポートを実行する必要があります。

現在、特定の期間の個別のシリアル番号のリストを取得してから、特定のシリアル番号のすべてのレコードを取得しています。1 か月の時間枠の場合、これは 1500 から 3000 のシリアル番号になる可能性があります。char(20)シリアル番号の長さは 15 文字しかありませんが、シリアル番号フィールドは としてフォーマットされます。

更新を開始

  • 通常、このテーブルには、 ごとに 5 ~ 15 のエントリがありますSerial_Number
  • このテーブルにデータを書き込んでいるマシンは最大 10 台であるため、同じDate_Time値が可能です。

更新を終了

このプロセスにはしばらく時間がかかりますが、リスト内の異なるシリアル番号間で Windows フォームをプログレス バーで更新して、管理者が何かが起こっていることと、あとどれくらいかかるかを知ることができます。

私は常にこのクエリをより速く実行しようとしています。

WHERE今、次のような句を使用して必要なデータを取得することを考えています。

SELECT Col1, Col2, Col3
FROM Table1
WHERE Serial_Number IN (
  SELECT DISTINCT Serial_Number
  FROM Table1
  WHERE Date_Time Between @startDate AND @endDate
)

私の質問は次のとおりです。特に、特定の期間中に非常に多くの異なるシリアル番号があるため、これに遭遇する可能性のある問題はありますか.

そしてもちろん、管理職の誰かが、退屈しているときに 1 年分のデータを実行しようとすることも知っています。それから、彼らはイエスが生まれたときからのデータを実行しようとします。

質問の言い換え:渡すことができるアイテムの数を制限する条項WHEREの方法に制限はありますか?IN

4

4 に答える 4

2

Table1のインデックスSerial_NumberとDate_Time(単一の複合インデックスではなく、個別のインデックスを使用)。これは、テーブルが本当に巨大でない限り、かなりうまく機能するはずです。

1つのインデックスをSerial_Numberに、2つ目のインデックスを(Date_Time、Serial_Number)にすると、速度が少し上がる可能性があります。その2番目のインデックスはサブクエリをカバーし、インデックスのみから回答できるようにします。

注:一意性を必要としない主キーではなく、インデックスを提案しています。

于 2012-10-09T21:05:23.987 に答える
1

まあ、インデックスがない素朴なケース(あなたのケースのように聞こえます)では、とにかくを実行するためにすべての行をスキャンする必要がありますTable1。ですから、それがあなたに大いに役立つかどうかはわかりません。DISTINCTSerial_Number

次のことを強くお勧めします。

  • 実行プランを使用して、クエリで何が起こっているかを判断し、
  • その情報を使用して、いくつかの関連するインデックスを追加し、操作を高速化します。

ここに表示されていることからDate_Time、のクラスター化インデックスの候補として適しているように思われTable1ます。

編集:

上記で説明したように、一意でないクラスター化インデックスを作成するには、次を使用できます。

CREATE CLUSTERED INDEX IX_Table1_Date_Time
ON Table1 (Date_Time)

http://msdn.microsoft.com/en-us/library/aa258260(v=sql.80).aspxから)

これにより、すべての行がDate_Timeの順序で並べ替えられるように、テーブルが並べ替えられます。実行プランをさらに操作すると、実行するクエリの正確なタイプに応じて、パフォーマンスに大きく役立つ可能性のある他のインデックスを特定するのに役立ちます。

于 2012-10-09T21:06:51.147 に答える
1

正直なところ、WHERE書かれている条項には何のメリットもないと思います。

高価な内部クエリを使用していますが、結果に対して意味のあることは何もしていません。Serial_Numberどこにも結果が表示されていません。ただし、あなたの質問に基づいて、それが必要なようです。

外側のクエリの結果で重複が排除されないため、DISTINCTキーワード forの必要性はわかりません。Serial_Number

これを行うことの何が問題になっていますか?

SELECT Serial_Number, Col1, Col2, Col3
FROM Table1
WHERE Date_Time Between @startDate AND @endDate

これは、元のクエリと同じことを行う必要があります。ただし、コストのかかるネストされたクエリが不要になります。

インデックスを付けるだけDate_Timeで機能するはずです。これにより、 のインデックスも不要になりますSerial_Number

于 2012-10-09T22:15:40.577 に答える
0

どうやら、缶の最大の長さを知る方法はありませWHERE X IN (...)ん。

今のところ、これが答えです。

後で誰かがやって来て、反対のことを見つけた場合は、その回答を投稿してください。そのようにマークします.

ありがとう、ジョー

于 2012-10-11T19:05:38.233 に答える