none
SQL SERVERをAccessにリンク RRS feed

  • 質問

  • microsoft SQL SERVER 2008 R2超初心者です。

    顧客管理システムをAccessで作成しています。
    以前はデータベースもAccessのテーブルで管理していましたが
    動きが遅くなってきたので
    データベースをmicrosoft SQL SERVER 2008 R2に移行することを検討中です。

    Accessのテーブルをそのままmicrosoft SQL SERVER 2008 R2にインポートして
    インポートしたものをAccessにリンクを貼って、フォームで見ていますが
    どうも動きが遅いです。
    動きを速める設定などはあるのでしょうか?

    データベースの数は10、
    ひとつのデータベースのレコード数は多くて8,000ほどです。
    全てのデータベースに氏名フィールドがあり、
    Accessのフォームで「やまもと」検索すると、
    その10のデータベースのなかで「やまもと」と部分一致するものが抽出されるようにしています。
    つまり常にすべてのデータベースの全レコードを参照している状態です。
    (そのほか新規登録画面等色々あります。)

    microsoft SQL SERVER 2008 R2については主キーの設定くらいしか触ったことがなく
    超初心者ですがどうか教えてください。
    よろしくお願いいたします!
    2013年11月11日 7:57

回答

  • インデックスの作成は有効ですが、行頭から始まらない部分一致の場合ですとインデックスは使用されませんので、この部分については効果が期待できないように思います。

    Accessにしかない関数の場合など、ローカルに一度全件を取り込んでから処理しなければならないケースもありますので、その辺りも含めて、以下を参考にされてみてはいかがでしょうか?

    (参考)
    Access データベースのパフォーマンスを向上させる
    http://office.microsoft.com/ja-jp/access-help/HP005187453.aspx

    Microsoft Access
    http://ja.wikipedia.org/wiki/Microsoft_Access


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    • 編集済み trapemiya 2013年11月12日 4:35 追記
    • 回答としてマーク masunona 2013年11月15日 4:33
    2013年11月12日 4:34
  • こんにちは。

    DatabaseやTableの構造と使い方という面があるので、一概には言えませんが、

    とりあえず、http://uchukamen.com/SQL2008/Index/index.htm や、「SQL SERVER INDEX 作成」で検索して、基本をふまえつつ、
    Sql server management studio で、実行する(している)クエリーについて「推定実行プランの表示」で確認し、どのようなインデックスを作成すると良いか?を検討するってところが、基本でしょうか。

    • 回答としてマーク 星 睦美 2013年11月13日 2:15
    2013年11月11日 9:50
  • データベースの数は10

    質問者さんがここで使用されている「データベース」とは何を指しているのでしょうか?

    というのも、SQL Server内での用語としての「データベース」ではない別の何かを指しているように見受けられます。解りやすく尋ねるとAccessの.mdbファイルはいくつ存在するのでしょうか? この質問は.mdb 10ファイルにまたがる処理の話でしょうか?
    もしそうではなく、.mdbファイルは1つでその中に10テーブルが含まれるということでしたら、SQL Serverに於いてもデータベースは1つにし、その中に10テーブル作成すべきです。

    • 回答としてマーク masunona 2013年11月15日 4:33
    2013年11月11日 12:56
  • フォームの「データ入力用」プロパティが「いいえ」になっていませんか。絞り込みが前提のフォームであれば、「データ入力用」プロパティを「はい」にすると、フォームを開いたとたんに全件レコードを読みに掛かる動作を抑止することができます。Access で 10万件でも実用になっていましたので8000件は多いとは思いません。部分一致ですとインデクスは効きません。

    http://systemartlaboratory.com/

    • 回答としてマーク masunona 2013年11月19日 7:51
    2013年11月15日 5:52

すべての返信

  • こんにちは。

    DatabaseやTableの構造と使い方という面があるので、一概には言えませんが、

    とりあえず、http://uchukamen.com/SQL2008/Index/index.htm や、「SQL SERVER INDEX 作成」で検索して、基本をふまえつつ、
    Sql server management studio で、実行する(している)クエリーについて「推定実行プランの表示」で確認し、どのようなインデックスを作成すると良いか?を検討するってところが、基本でしょうか。

    • 回答としてマーク 星 睦美 2013年11月13日 2:15
    2013年11月11日 9:50
  • データベースの数は10

    質問者さんがここで使用されている「データベース」とは何を指しているのでしょうか?

    というのも、SQL Server内での用語としての「データベース」ではない別の何かを指しているように見受けられます。解りやすく尋ねるとAccessの.mdbファイルはいくつ存在するのでしょうか? この質問は.mdb 10ファイルにまたがる処理の話でしょうか?
    もしそうではなく、.mdbファイルは1つでその中に10テーブルが含まれるということでしたら、SQL Serverに於いてもデータベースは1つにし、その中に10テーブル作成すべきです。

    • 回答としてマーク masunona 2013年11月15日 4:33
    2013年11月11日 12:56
  • ありがとうございます!

    SQL Serverではクエリを使ったりせずテーブルそのままをAccessにリンクしているだけなのに

    こんなに動きが遅いので悩んでいました。

    インデックスの作成知りませんでした!勉強してみます。ありがとうございました!

    2013年11月12日 0:22
  • 頂いたサイト等拝見してみました。

    SQL Server上で絞込等をする際にはインデックスを作成することが有効だと分かりました。

    ただ私の場合は、
    SQLServer上では操作せず、Accessにリンクして、
    Accessのフォームでマクロを組んで絞込等しています。
    また更新や変更等も頻繁に行っています。

    このような場合でも、インデックスを作成することは有効でしょうか?

    もしよろしければまた教えてください!

    2013年11月12日 2:36
  • インデックスの作成は有効ですが、行頭から始まらない部分一致の場合ですとインデックスは使用されませんので、この部分については効果が期待できないように思います。

    Accessにしかない関数の場合など、ローカルに一度全件を取り込んでから処理しなければならないケースもありますので、その辺りも含めて、以下を参考にされてみてはいかがでしょうか?

    (参考)
    Access データベースのパフォーマンスを向上させる
    http://office.microsoft.com/ja-jp/access-help/HP005187453.aspx

    Microsoft Access
    http://ja.wikipedia.org/wiki/Microsoft_Access


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    • 編集済み trapemiya 2013年11月12日 4:35 追記
    • 回答としてマーク masunona 2013年11月15日 4:33
    2013年11月12日 4:34
  • trapemiya さま

    ありがとうございます!

    いただいたURLを拝見し勉強してみます。

    ありがとうございました!

    2013年11月15日 4:32
  • フォームの「データ入力用」プロパティが「いいえ」になっていませんか。絞り込みが前提のフォームであれば、「データ入力用」プロパティを「はい」にすると、フォームを開いたとたんに全件レコードを読みに掛かる動作を抑止することができます。Access で 10万件でも実用になっていましたので8000件は多いとは思いません。部分一致ですとインデクスは効きません。

    http://systemartlaboratory.com/

    • 回答としてマーク masunona 2013年11月19日 7:51
    2013年11月15日 5:52
  • >三輪の牛 さま

    大変遅くなりました。
    ありがとうございます!
    「データ入力用」プロパティが「いいえ」になってたので「はい」にしてみました。
    が、速度はあまり変わらない気がします・・・。

    どうもワンテンポ待つというか、
    Accessのテーブルをリンクしたほうがまだましです。

    色々調べていてパススルークエリとやらを初めて知り、
    Accessで作成してそのパススルークエリを参照してみるようにしましたが、
    ますます遅くなってしまいました泣。

    また何かお気づきの点ありましたら教えてください!
    2013年11月19日 7:51
  • こんにちは。

    もう昨年の話なので、何か解決手段を見つけているかもしれませんが、ふっと思ったことを。

    SQL Server へ移行しな、テーブル自体にインデックスを作成作成し、その「部分」においては、高速になったとして、

    MS-Accsss側の「クエリー」を使用している場合、どうなるんだ?という事です。

    クエリー自体は、Access側で、リンクされたテーブルを使用するという意味になるのではないかなと・・とすると、なんだか大変な事になっちゃってるんではないか・・・

    もし、クエリーを使いまわしているようであれば、SQL Server側で、対象のクエリーを、Viewやストアドプロシージャとして用意すると良い可能性があると思います。

    2014年1月15日 3:42
  • Accessは可能であればサーバ側で結合・抽出してくれます。

    ただ、複雑なクエリーを書いたときに全表スキャンになっていることがあり、結合順序のヒントも書けないのでどうしようもないことがありました。

    パススルークエリーを書いてもだめだったと言うことは、リンクテーブルとは無関係にパフォーマンスを落としている部分があるような気がします。


    http://systemartlaboratory.com/

    2014年2月21日 8:54