2010-12-06 21 views
0

私は、この表の電話帳SQL Server 2005を持っている:SQL挿入のパフォーマンスの問題

username(PK) Serial(PK) contact_name contact_adr  contact_email contact_phone 
bob   1   Steve   12 abc street [email protected] 1234   
bob   2   John   34 xyz street [email protected] 5345   
bob   3   Mark   98 ggs street [email protected] 1234   
patrick  4   lily   77 fgs street [email protected] 1234   
patrick  5   mily   76 fgs street [email protected] 1234   
von   8   jim   6767 jsd way  [email protected]  4564   

今、あなたが一緒に同じユーザの電話帳の店舗すべての連絡先を見ることができます。 この方法を保存することで回避できない利点があります。

私の質問は: 私はすべてのユーザーのテーブルに1億のエントリがある場合、上記のテーブルに私の将来の挿入は非常に高価でしょうか?私は100万行でテスト

SQLエンジンがデータを入力するために、実際の場所を見つける必要があるので、(私はその名の下に意味)

、私は顕著な問題が表示されません。

私にこの経験や提案があるかどうか尋ねていますか?

おかげ

+0

どのSQLソフトウェアを使用しますか? (また、 'PK'は列上のユニークなインデックスを意味するので、それはあなたが "username"を意味する外部キー(FK)、そして "シリアル"はあなたの本当のプライマリキー(PK)です) –

+2

重複データを持つ主キー? – Sathya

+0

私はPKを見逃しました。 PKは(UserName + Serial) – kheya

答えて

0

は、DB設計の第一原理の一つは、データ非冗長です:あなたは何度も同じデータを繰り返してきたように、あなたのdbテーブルのデザインは、その原則に準拠していません。共鳴可能なソリューションは、ユーザー用の別個のテーブル、連絡先用の別個のテーブル、およびユーザーと連絡先間の実現のためのテーブルを作成することです。

+0

UserNameはFKです。ユーザー名とアカウントの詳細が別のテーブルにある – kheya

0

これは、基になるデータベースによって異なります。あらゆる実装には、そのスリーブの下で異なるものがあります。

しかし!そのテーブルでインデックスを使用し、その内部に多数の、多くの、多くの、多くの行がある場合、パフォーマンスはほぼ確実に損なわれます。

0

まず、ユーザー名は、自分のテーブルのプライマリキーではないようです。あなたはおそらくそれを動作させたい場合は、別のフィールドと組み合わせて使用​​する必要があります。この時点では、私はむしろあなたのserial列をプライマリキーとして使用し、クエリにを得るためにusernameのインデックスを持っています。

テーブルのサイズが大きくなると、挿入が確実に遅くなります。しかし、私はこのアプローチに従うのが遅すぎるとは思わない。

+0

テーブル定義を修正しました。 Thx – kheya

+0

プライマリキーとして 'serial'を使ってみませんか? –

+0

シリアルとしてPKを使用するとどのような利点がありますか?短所:ユーザー名に別の巨大なインデックスが必要です。ほとんどのクエリは、特定のユーザーの連絡先を取得することになります。私は直接探求が必要です。 – kheya

0

強制的にデータを格納することはできません。挿入時にシリアルを再シーケンシングしていますか?データが「一緒に保存」されていることをどのように確認していますか?

このすべてのデータを1つのテーブルに入れることは、実際にインデックス構造に依存します。テーブルの索引が増えるほど、挿入時に処理が多くなります。ユーザテーブルは通常クエリが頻繁に実行され、(比較的)挿入されることはめったにないため、インデックスは頻繁にインデックスされるため、挿入が遅くなる可能性があります。答えは、ほぼすべてのDB質問と同様に、「それは依存している」です。

+0

テーブルの定義を修正しました。 PKは(UserName + Serial)です。これは、PK – kheya

1

アドレス帳に最適なアプローチは、NOSQLハッシュテーブルです。 PKのインデックスは必要ありません。アルゴリズムは、PKによって識別された行が見つかる「ページ」を返します。ユーザのアドレス帳はまた、非正規化された関係として、ユーザと共に格納される。インサートのオーバーヘッドはごくわずかです。 Hashed-PKは、PKがわかっているときの挿入/検索用に最適化されています。 OLTPシステムに最適です。今、誰が誰を知っているかを把握して、特定のユーザーの連絡先を他のすべてのユーザーの連絡先に関連付ける必要があるようにする場合は、別の種類のワームがあります。ただし、特定のユーザーの連絡先がそのユーザーに「プライベート」なままである単純なアドレス帳アプリケーションでは、ハッシュされた主キーシステムが優れています。

+0

でソートされたエントリを保存します。それはMySQLデータベースまたはOracle固有のものですか?あなたは良い例や見ているURLがありますか?これはSQLサーバーではあまり使われていません – kheya

+0

大きな質問:この方法は、電話帳をワンショットで構築し、順序付けられた方法でデータを入力する場合にのみ有効です。それからPKは必要ありません。私のケースを購入すると、電話帳はゆっくりと成長します。私はPKを持っている必要があります – kheya

+0

@projapati - 彼は全く異なるデータベースストレージシステムを使用することを提案しています。このテーブル構造では、とにかく関係プロを活用していません。 NoSQLに行くだけでもいいですね。または、適切な関係を使用してテーブルを作成します。 User、UserAddress、UserPhone、UserEmailなど –

関連する問題