データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

2
ユーザー定義関数の最適化の問題
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 4年前に移行され ました。 1行のみをフェッチする必要があるにもかかわらず、SQLサーバーがテーブル内のすべての値に対してユーザー定義関数を呼び出すことを決定する理由を理解するのに問題があります。実際のSQLはもっと複雑ですが、問題をこれまで減らすことができました。 select S.GROUPCODE, H.ORDERCATEGORY from ORDERLINE L join ORDERHDR H on H.ORDERID = L.ORDERID join PRODUCT P on P.PRODUCT = L.PRODUCT cross apply dbo.GetGroupCode (P.FACTORY) S where L.ORDERNUMBER = 'XXX/YYY-123456' and L.RMPHASE = '0' and L.ORDERLINE = '01' このクエリでは、SQL Serverは、ORDERLINEから返される推定行数と実際の行数が1(主キー)であっても、PRODUCTテーブルに存在するすべての値に対してGetGroupCode関数を呼び出すことを決定します。 行カウントを示すプランエクスプローラーの同じプラン: テーブル: ORDERLINE: 1.5M rows, …

2
ストアドプロシージャのプロファイル方法
私はSQL Server 2012を使用していますが、ストアドプロシージャをプロファイルする方法を疑問に思っていました たとえば、プロファイラーは、ストアドプロシージャ内の個々のSQLステートメントをキャプチャできますか? マージレプリケーションストアドプロシージャを診断しようとしていますが、これはマージエージェントの完全な実行の一部としてキャプチャする必要があります。パフォーマンスの問題が発生したストアドプロシージャを取得して再度実行することは、その時点では遅くないため不可能と思われます。

6
なぜ「関係(al)」という用語ですか?
英語では、たとえばボブとティムの関係について話すかもしれません。おそらく彼らはいとこです。この文脈での用語「関係」は私にとって理にかなっています。 リレーショナルデータベースの文脈では、この用語が何を指しているのかは理解していますが、なぜ使用されているのかはわかりません。なぜ使われるのかを理解することは、フィールドをよりよく理解するのに役立つと思うので、なぜ使われるのかを理解したいと思います。 たとえば、なぜ人は「関係」と見なされますか?英語では、関係は2つのエンティティがどのように関連付けられているかを表す名詞です。エンティティ自体を指すものではありません。リレーショナルデータベースのコンテキストでは、「関係」はエンティティ自体を指します。どうして? リレーショナルモデルは、階層モデルとネットワークモデル(例:親、隣接)の後に来たことを理解しています。しかし、これらのモデルでは、エンティティは相互にも関係しています。では、なぜこのモデルをリレーショナルモデルと呼ぶのでしょうか?より具体的なフレーズ/用語はありますか?または、3つすべてのモデルがリレーショナルモデルであるが、階層モデルとネットワークモデルは特定のタイプのリレーショナルモデルであると言う必要がありますか? 互いに関係のないスタンドアロンエンティティがある場合はどうなりますか。言う、人、ドア、そして木。「関係(al)」という用語はまだ適用可能ですか? (おそらく、これは複数の質問である必要があります。答えは非常に関連性が高いと考えました-たぶん答えは1つだけかもしれません。代わりに個別の質問を作成します。) 編集:この図は、関係が異なるドメインを相互に関連付けていることを視覚化するのに役立ちます。

2
tempdbの成長の原因となったSQLステートメントを見つける方法
サーバー(SQL Server 2008)のtempdbは、毎月数回500 GB以上に増加します。この問題の原因となったSQLステートメントを見つけることは可能ですか?問題は通常によって引き起こされていないcreate table #temp...; insert into #temp...かselect ... into #temp...が、複合体が結合します。 一部のtempdbファイルの初期サイズも、毎回自動的により大きな値に設定されます。それを防ぐ方法は? キャッシュされたプランがファイルのサイズ変更/縮小を妨げる場合があります。どちらがtempdbを保持しているかを見つける方法は?

3
「Chaos」分離レベルとは何ですか、いつ使用する必要がありますか?
ADO.NETのドキュメントには、SQLトランザクションのトランザクションレベルをChaosに設定する可能性が示されています。不快に聞こえますが、機能が存在する場合は、おそらく正当な使用方法があります。 BOL のSET TRANSACTION ISOLATION LEVELコマンド(ああ!わかりました、GoogleとBOLを使用できます)は何も「カオス」という名前ではないようです。ADO.NETには、「カオス」に加えて文書化されたレベル このカオスのレベルは何ですか?(そして、なぜそれは非友好的な名前を持っていますか?) 参照: ADO.NET列挙型

3
sql-server bakを復元し、同時にログを圧縮することは可能ですか?
問題調査のために開発者オフィスに転送したクライアントからのbakファイルがあります。現在、バックアップは25GBで、復元されたデータベースはほぼ同じサイズですが、復元するには100GBが必要です。これは、データベースが75GBのトランザクションログサイズを持つように設定されているためだと思います。データベースを復元した後、ログファイルを圧縮できますが、復元でこれを行う方法はありますか?

2
マルチテナントデータベースアーキテクチャで増え続けるテナントの処理
アプリケーションのテナントのインスタンスごとに個別のデータベースを持つ共通サーバーで適度な数の顧客(テナント)を処理するのは比較的簡単で、通常これを行う正しい方法です。現在、各テナントが独自のデータベースインスタンスを持つアプリケーションのアーキテクチャを検討しています。 ただし、問題は、このアプリケーションに多数のテナント(5,000〜10,000)があり、かなりの数のユーザー(おそらく単一のテナントでは2,000)があることです。毎週数人のテナントによるシステムの成長をサポートする必要があります。 さらに、すべてのテナントとそのユーザーに共通のログインプロセスが表示されます(つまり、各テナントが独自のURLを持つことはできません)。これを行うには、集中ログインプロセスと、システムにデータベースを動的に追加し、ユーザーを登録する手段が必要です。 登録およびデータベース作成プロセスをどのように堅牢に自動化できますか? システムでテナントのデータベースを作成および登録するプロセスは、パフォーマンスまたはロックの問題を引き起こす可能性がありますか?これが問題になると思われる場合、誰でもそれを軽減する方法を提案できますか? ユーザー資格情報が特定のテナントのデータベースに関連付けられているが、ユーザーは共通のページからログインできる(つまり、すべて同じログインURLであるが、ホームアプリケーションは特定のテナントのデータベースにある)方法で中央認証を管理する方法)。テナントは独自のログインとアクセス許可を維持できる必要がありますが、中央ログインシステムはこれらを認識している必要があります。誰でもこれを行う方法を提案できますか? 複数のデータベースサーバーを追加して「スケールアウト」する必要がある場合、サーバー全体のユーザーIDの管理(なりすましなど)で対処しなければならない問題と、それらの問題を軽減する方法を誰か提案できますか?

2
インデックスの数が多すぎる/いついるかを知る方法は?
Microsoft SQL Server Profilerを時々実行すると、作成する新しいインデックスと統計情報がたくさんあります(「... 97%の改善が見込まれる...」)。 私の理解から、追加されたすべてのインデックスは、SQL SELECTクエリを高速化できますが、インデックスを調整する必要があるため、クエリも低速化UPDATEできINSERTます。 私が疑問に思うのは、いつ「多すぎる」インデックス/統計がありますか? たぶんこれに関する明確な答えはありませんが、いくつかの経験則があります。

7
オープンソース/無料のETLはありますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、データベース管理者のStack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 Pentahoがそれを購入してそれを呼ぶ前から、私はPentaho Data Integrationを使用していました。私は最後の無料版を持っています。 最近、彼らのウェブサイトにアクセスして、彼らが別のバージョンをリリースしたかどうかを確認するために、私のお気に入りのオープンソースetlがあまり開かれておらず、まったく無料ではないことを確認しました。 手頃な価格で使いやすいETLツールの代替案を知っている人はいますか?
26 etl 

2
IS-A関係をデータベースにマップするにはどうすればよいですか?
以下を考慮してください。 entity User { autoincrement uid; string(20) name; int privilegeLevel; } entity DirectLoginUser { inherits User; string(20) username; string(16) passwordHash; } entity OpenIdUser { inherits User; //Whatever attributes OpenID needs... I don't know; this is hypothetical } さまざまな種類のユーザー(直接ログインユーザー、およびOpenIDユーザー)がIS-A関係を表示します。つまり、両方のタイプのユーザーがユーザーです。現在、これをRDBMSで表す方法はいくつかあります。 ウェイワン CREATE TABLE Users ( uid INTEGER AUTO_INCREMENT NOT NULL, name VARCHAR(20) …

6
複数の列でEXISTSを効率的にチェックする方法は?
これは私が定期的に出くわす問題であり、まだ良い解決策を見つけていません。 次のテーブル構造を想定 CREATE TABLE T ( A INT PRIMARY KEY, B CHAR(1000) NULL, C CHAR(1000) NULL ) 及び要件はNULL可能列のいずれかかどうかを決定することであるBまたはC実際に含むNULL値(及び場合どのように一方(S))。 また、テーブルに数百万行が含まれていると仮定します(このクラスのクエリのより一般的なソリューションに興味があるため、覗くことができる列統計はありません)。 これにアプローチする方法はいくつか考えられますが、すべてに弱点があります。 2つの別個のEXISTSステートメント。これには、a NULLが見つかるとすぐにクエリがスキャンを停止できるという利点があります。ただし、実際に両方の列にが含まれていないNULL場合、2回の完全スキャンが実行されます。 単一の集計クエリ SELECT MAX(CASE WHEN B IS NULL THEN 1 ELSE 0 END) AS B, MAX(CASE WHEN C IS NULL THEN 1 ELSE 0 END) AS C FROM T …

7
長い列はパフォーマンスとディスク使用量にどのように影響しますか?
現在のプロジェクトでは、列を数文字だけ拡張する必要があることが頻繁に発生します。からvarchar(20)へvarchar(30)と上のようにします。 現実には、どれほど重要なのでしょうか?これはどの程度最適化されていますか?通常の「入力」フィールドに100文字、200文字、さらには500文字を許可した場合の影響は何ですか?メールには320文字しか使用できないため、OK-そこには十分な制限があります。しかし、200に設定した場合、それより長い電子メールアドレスは期待できないため、何を得ることができますか。 通常、テーブルには100.000行を超えることはなく、最大20または30個のこのような列があります。 現在SQL Server 2008を使用していますが、さまざまなDBがこの問題をどのように処理するかを知ることは興味深いでしょう。 影響が非常に小さい場合-予想どおり、この長距離パラノイアは実際には必要ではないと、DBAに納得させるために(リンクでバックアップされている?)良い議論を得るのに役立ちます。 そうである場合、私は学ぶためにここにいます:-)

2
mysqlロック待機タイムアウトが超過しました。トランザクションを再開してみてください
私たちは、長年にわたって実行されているJavaアプリケーションを実行しています。バックエンドはMySQLです。最近、mysql 5.6に更新されました。すべてが正常に実行され、先週はこのエラーが発生し始めました。ロック待機タイムアウトが超過しました。終了を停止しないように見えるトランザクションを再起動してみてください。このエラーを停止するにはどうすればよいかわかりません。突然それが起こっている理由
26 mysql  mysql-5.6 

1
インデックス:ノードの数が同じ場合の整数と文字列のパフォーマンス
PostgreSQL(9.4)データベースを使用してRuby on Railsでアプリケーションを開発しています。私のユースケースでは、アプリケーションの全体のポイントはモデル上の非常に特定の属性を検索するため、テーブルの列は非常に頻繁に検索されます。 私は現在、使用するかどうかを決定していますintegerタイプを、または単に(例えば、一般的な文字列型を使用character varying(255)、Railsのではデフォルトである私は、性能差がインデックスにどうなるかわからないよう、列に対して)。 これらの列は列挙型です。可能な値の量に対して固定サイズがあります。ほとんどの列挙の長さは5を超えません。これは、アプリケーションの存続期間中、インデックスが多少固定されることを意味します。したがって、整数と文字列のインデックスはノードの数が同じになります。 ただし、インデックス付けされる文字列の長さは約20文字で、メモリ内では整数の約5倍になります(整数が4バイトで、文字列が1文字あたり1バイトの純粋なASCIIの場合、これは成り立ちます)。私は、データベースエンジンがインデックスのルックアップを行う方法を知りませんが、それが一致するまで、それは「スキャン」の文字列に必要がある場合は、正確にそして本質的には、手段は、文字列検索が遅くなる整数のルックアップよりも5倍になるということ。整数ルックアップに一致するまでの「スキャン」は20ではなく4バイトになります。これが私が想像していることです。 ルックアップ値は(整数)4です。 スキャン.................. FOUND | レコードを取得しています... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... | ルックアップ値は(string) "some_val"(8バイト)です。 走査................................................. ....................................見つかった| レコードを取得しています... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 …

5
古いデータのアーカイブ
データベースが大きくなりすぎているため、現在いくつかのパフォーマンスの問題に直面しています。過去10年間のデータが保存されており、2年以上前のデータを新しいデータと同じテーブルに保存する必要がある理由はわかりません。 現在、私はデータベースの管理にあまり深い経験がないので、古いデータをアーカイブする最良の方法を探しています。 情報 データベースには合計で約310'000'000レコードがあります。 データベースには、ハードディスクに250 GBが必要です。 サーバーのバージョンは、互換性レベルがSQL Server 2005(90)のSQL Server 2008ですが、SQL Server 2012へのアップグレードを近日中に計画しています 私は2つの可能性について考えました: 新しいデータベース 実動サーバー上のデータベースと同様のデータベースを作成し、すべての古いデータを新しいデータベースに挿入します。 欠点:リンクサーバーは環境で許可されていないため、必要に応じて古いデータを結合することは困難です。 履歴スキーマ 本番データベースと同じテーブルで新しいスキーマfe [hist]を作成します。新しいスキーマのこれらの新しいテーブルにすべての古いデータを挿入します。 利点:将来的に古いデータが必要になる場合、簡単に参加できます 解決策の1つを他よりも優先しますか? どうして? より良い可能性はありますか? このタスクを簡単に実行できる既存のツールはありますか? 他に考えはありますか? 前もって感謝します 編集 追加の質問: 新しく作成されたアーカイブテーブルもプライマリ/外部キーを必要としますか? または、キー/制約のない列だけが必要ですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.