こちらのサイトで、Access に明るそうなブログ主様がこういう情報を書いて下さっているのですが、
Access2000・100MbpsLAN Pentium3 の「ネットワーク越しのリンクテーブル」の開く速度が遅いときの対処法(Access2000のときからあった既知の問題)
https://euc-access-excel-db.com/tips/ct07_se/ct071701_mini_system_make/access2000-linktable-speed-up
>テーブルデザインで「空文字の許可」をしない
ここだけあいにく解説も無く、物足りなく思っています。
リンクテーブルで空文字を許可しないことで動作が改善するしくみや、
この設定のデメリット等ご存じの方がいらっしゃったら教えていただきたいです。
よろしくお願いします。
まずそもそも論で申し訳ないのですが、御本人に確認されるのが良いと思われます。
こちらのブログはいまも更新されているようですので。
以下、単なる予測ですが、おそらく「そのような設定を行うとAccessの動作が早くなる」という仕様上の理由なのではないかな、と感じます。
https://qiita.com/Masataka_Sugia/items/90be563842813d7d2393
デメリットは「なにかしらのデータを必ず入れなければならない」ということでしょうか。
ちょっとめんどくさいですね。
すずやん様、レスありがとうございます
ただ、あいにく、そちらのブログにはコメント欄もBBSもメールアドレス記載も無いようです。
一応英語でも検索しましたが、「テーブルデザインで「空文字の許可」をしないと速くなる」という情報は、
私の英語力等が拙いのもあって見つけられませんでした。
もしかすれば、すずやん様のおっしゃるとおりただそういう仕様があるのかもしれないし、
Nullと""が両方入力できることから生じる混乱や手間を避けるための一般則を書かれただけなのかもしれません。
ベテラン社内SEの方の知見のようですが、同じくベテランの方の意見から何か伺えれば幸いです。
私もいろいろAccess関係の情報をチェックしてますが、「空文字の許可」の設定で速度が変わるという情報は初見でした。
MSの公式が、速度についての「動作が改善するしくみ」について提示することはほとんどないと思います。
例えば、下記でも速度改善の方法の提示はありますが、「改善するしくみ」についてまでは言及していません。
Access のパフォーマンスを向上させる - Microsoft サポート
WEB上でよくある速度改善の情報はたいていは経験則によるものだ思います。
内部動作については、Accessの開発者にしか分からないし、ほとんど公開されていないので。
私自身は、管理しやすいので「空文字の許可=はい」「値要求=はい」の設計(Null値の排除)にすることが多いですが、いままで遅くなるという経験はないです。(体感できるほどの規模のデータベースを扱っていないということかもしれませんが)
haneta様、お返事ありがとうございます。
「空文字列の許可」について私も初見であり、そちらのブログ主様も多くの経験値と発信力(興味深い話題をいろいろと書いていらっしゃいます)をお持ちのようだったので、気になってしまった次第です。
そちらのブログ主様は別のページ複数でも空文字列の許可に言及しており、「クエリやデータベースを速くする方法」「クエリが遅い場合の対処方法」という見出しの下にその一文があります。そして残念ながら、解説がありません。
ちなみに「空文字列の許可=いいえ」については、こちらのベテランエンジニアの方が「実際に便利だったこと」として書き残して下さっている中に見つかるには見つかりました。ただ、狙いは違っています。
http://www.kitagawa-hanga.com/se/s_acchint.html
仕様や経験則でそういうものがある(あり得る)、ということで承知しておこうと思います。
申し訳ありません、タイプミスです・・・<haneta様→hatena様
Accessの内部のコードや処理に関しては原則公開されていないので、MSの中の人以外には分かりません。
前の回答のMSの公式のドキュメント以外の方法は、ユーザーが、特定の設計、特定のデータで試した結果、効果があったという報告でしかありません。
その速度もテーブル設計、クエリ設計、データ構成によって変わることは、いくらでもあります。
また、そのしくみはどうとかいう解説をしている方がいたとしても、それは推測でしかありません。
よって、WEB上で多数、報告されている改善方法をそのまま採用するのではなく、
実際のテーブルとデータと処理で、試してみて効果があればその方法を採用する、ということをたいていの開発者はしていると思います。
あえて推測するならば、
すずやんさんの回答のリンク先にもありますが、「値要求」と「空文字列の許可」の設定の組み合わせは4通りあります。
そのうち、「値要求 いいえ」「空文字列の許可 はい」の設定(既定の設定)にしておくとNullと空文字列の両方が存在しうることになります。
そうなると、Nullの場合と空文字列の場合の両方を考慮した設計(抽出条件など)をする必要があります。
面倒だし、速度的にも悪い方向性を持つことになります。
「Nullのみ存在」あるいは「空文字列のみ存在」の設計にしておけば処理がシンプルにできます。
そこで既定の「値要求 いいえ」「空文字列の許可 はい」から、「空文字列の許可 いいえ」にしてNullのみ存在するというシンプルな状態にしておいた方が速度的にいいということかもしれません。
私の場合は、逆に「値要求 いいえ」「空文字列の許可 はい」から、「値要求 はい」にして空文字列のみ存在するという設計をよくします。
hatena様、たびたびありがとうございます。
私もそもそも「リンクテーブルを速くする」コツとして見かけたのでピンと来なかったのですが、ブログ主様はそもそもSQLのことを考えていたのであり、そしてhatena様のおっしゃるとおりのように思われます。
同じブログ主様のこちらのページではクエリチューニングのコツの1つとして載っており、
https://euc-access-excel-db.com/tips/ct07_se/ct071701_mini_system_make/qry-tuning
知恵袋には Null だけを許容すると設計ポリシーの方も見かけられ、
Accessについて。 - 超Access初心者なのですが、... - Yahoo!知恵袋
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10190934870
>テキスト型の場合、
>Null と "" は見た目の区別がつかないので、混在する状態だと管理が難しくなるので、
>最初に仕様としてどちらか一方のみ許容するように決めます。
>どちらがいいかは最初は好みでいいと思います。(後で簡単に変更できますので。)
>どちらかしかないと決まっていれば、抽出条件などの式を書く時、それを念頭において書けばいいですので。ちなみに私の場合は、Nullのみ許容するようにしてます。
混在の場合には WHERE に OR や Nz が入って、速度的に悪くなりそうなのもhatena様のおっしゃるとおりです。
今まであまり気にしてこなかったのですが、学びの機会になりました。ありがとうございました。