2012-02-26 12 views
3

私は学校で働き、学校のクラブの後にどの子供が行ったかを調べる悪夢を助けるためのデータベースを構築しました。不器用なクエリを最適化する

私は、リンクテーブルを使用して、42個のレジスタ(Excelドキュメント)のそれぞれから描画するデータベースを構築することでこれを試みました。次に特定のフォームから生徒を検索するいくつかの照会をセットアップしてから、それぞれのフォームグループがそのフォームの子供が特定の週にクラブに行ったかどうかを確認できるようにレポートを生成します。

私のSQLの知識は基本的です。さまざまなことを行うためのクエリを書くことはできますが、大きなクエリを最適化する方法はわかりません。

私が抱えている問題は、各レポートが生成に2分30秒かかることです。これで、42個のレジスタすべてがクエリに追加されました。私が31歳のときには、30秒後にレポートが生成されていました。ここで

は、クエリのサンプルです:

SELECT [UID], [Name], [Group], [Week 1], [Week 2], [Week 3], 
    [Week 4], [Week 5], [Week 6] 
FROM [club 1] 
WHERE ((([Club 1].[Group])="group name")) 

UNION ALL 

SELECT [UID], [Name], [Group], [Week 1], [Week 2], [Week 3], 
    [Week 4], [Week 5], [Week 6] 
FROM [club 42] 
WHERE ((([Club 42].[Group])="group name")); 

問合せは、私が言ったように、初期SELECT後41 UNION ALL SELECT年代を持っており、ほとんどの場合、ほとんどのinificient、目hurtinglyひどく書かれたクエリですが、私のSQLの知識は基本的なものであり、私が行くにつれて私は学んでいます。

さらに詳しい情報: これらのレジスターには480人の学生がおり、1人の学生が1週間に複数のクラブに行くことができるので、照会は生徒がクラブに通った各インスタンスを見つける必要があります。

Excel以外のアクセス方法Excelでのアクセスは非常に限られています。私はいくつかの友人と話し合い、MySQLのアプローチを見て、ネットワーク上のローカルサーバーを設定しましたが、私たちのネットワークは管理されたサービスであり、それを管理する会社はサーバー上に設定されているもの理解できるように)。

これはおそらくこれを実行する唯一の方法であり、クエリを2分30秒かかると、毎週金曜日に各レジスタを調べるのに30分かかります。私はこれを分類しようとしている理由は次のとおりです。

A)私は、データベースにアクセスする教師は、多くの場合、せっかちで、クリックしてください)今のところ、SQL
Bを欠場するために管理し、さらにプログラミングの私の知識を拡張し、持ちたいですレポートが無作為に速く動作するようにロードしようとするとランダムに発生し、しばしばアクセスがクラッシュすることがあります。

ご迷惑をおかけして申し訳ございません。私は何かを試してみたいと思っていますが、これは主に私にとって新しい領域なので、私と一緒に裸でください。

+0

私の最初の考えは、Accessですべてを構築することでしたが、これは私の暇な時間に行われており、元のレジスタを削除してAccessデータベースで置き換えると述べたときに不満を募らせました。 私は実際にICTを学校で教えていますので、十分に満足していますが、これは時間の問題です。 私はこの回答を検討しており、唯一の措置は、これをすべてAccessに入れる時間を見つけることだと思います。 私は不平のために、この豚のような方法でそれを使用しようとしたことに対する馬鹿感を感じます。 返信いただきありがとうございます。私はすぐに助言のために戻ってきます。 – Vred

答えて

2

私の助言は、クラブごとにテーブルを持たず、追加の列が[Club_Name]の1つのテーブルまたは後でClubsテーブルに結果を結合するためのIDだけです。

この方法では、クエリは次のようなものになるだろう:それを行うことが可能であろう

SELECT [UID], [Name], [Group], [Club_Name], [Week 1], [Week 2], [Week 3], 
    [Week 4], [Week 5], [Week 6] 
FROM [Clubs] 
WHERE ((([Clubs].[Group])="group name")); 

と思いますか?

+0

それは可能ですが、私は報告するために一緒に結ばれた既存のシステムを取得するために面白くしようとしても自分自身を誇張しています。 私はもう自分自身を悩まさずにデータベースを構築し、必要なときにはちょっとしたトレーニングを提供するつもりです。ご回答いただきありがとうございます。 – Vred

+1

デザインを変更している場合は、その週の行を削除することもできます。 – Fionnuala

1

根本的な問題は、42の異なるソースから最終的には厄介なメカニズムを介してデータを引き出していることです。これはあなたが間違っていたことではなく、Excel to Accessのシステムアーキテクチャーに与えられた人生の事実です。

ネットワーク上のユーザーがAccessを使用するライセンスを持っている場合は、42個のExcelスプレッドシートを共有モードで接続する1つのAccessデータベースに置き換えることができます。すべてのデータを42の外部リンクデータソースではなく1つのテーブルに保存すると、レポートを生成するのに1秒未満の応答時間が得られます。

私はVB3のヒーディで、ネットワークを介して多くの人が共有していたVBとAccessアプリケーションをビルドしました。ネットワークプロバイダは、サーバーに格納されている1つのファイルに対抗できない可能性があります。

ユーザーがAccessを使用するライセンスを持っていない場合は、共有Accessデータベースへの単純なASP.NETフロントエンドを作成できます。

単一の共有データベースに移行することを決定したら、データベースの設計が正規化されていることを確認して、クエリが単純で効率的になり、データ保守コードが簡単になるようにする必要があります。スプレッドシートのデザインを考えないでください!このルートに行きスキーマ設計のアドバイスが必要な場合は、私に知らせるコメントを投稿してください。

+0

ユーザーはアクセスを使用するライセンスを持っていますが、少数のスタッフの外では、私たちは多くのテクノフォードをノックしています。 主な問題は、私がここに来る前(最初の1年)にスプレッドシートの「システム」がセットアップされ、使用され、多くの教師が自分のやり方で少し設定されていることです。私はそれらをすべて一緒にリンクする方法を見つけるために数時間を費やすように頼まれました。あなたの返事をありがとう、それは私が自分自身で働いていた小さな箱を過ぎて見るのを助けた。 – Vred

0

あなたの基本的な問題は、ひどいデータベースに対して良いクエリを作成しようとしていることです。

42のクラブすべてが学生に関する同じデータを提供する場合、それらはすべて同じテーブルにあるべきです。データがどのクラブに関連しているかを示すために、追加の列「ClubId」が必要です。 ClubIdが理にかなっているためには、クラブの名前のような、クラブに関するデータを持つクラブのテーブルでなければなりません。このテーブルには出席テーブルのClubIdの参照ポイントを提供する "Id"という名前の列があります。

上記よりも優れたデザインがありますが、これは現在の場所よりも数マイル先です。

Excelテーブルから得たテーブルを単一のテーブルにまとめる方法を学びます。結合を使用してレジスタのデータとクラブに関するデータを結合する方法を学びます。良いクエリを書く。大量のデータを処理するには数秒かかることがあります。

+0

前に説明したように、私はそこにいた前に設定されていた「システム」と、多くの人が快適であったという理由で、いくつかの制約の下で作業するように求められていました。 変更しなければならないので、希望通りの状態に保つのは苦痛です!ご回答いただきありがとうございます。 – Vred