データベース管理者

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

8
DBAの必読の本[終了]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 8年前に閉鎖されました。 この投稿はコミュニティWikiです。この投稿を改善するには、既存の回答を編集してください。現在、新しい回答は受け付けていません。 この質問は、基本的な参照のためにすべてのSEサイトでほぼ必須です。 一般に、DBAにとって永続的な価値のある書籍のみを投稿してください。 投稿は必読の本である必要があります、古典的なもの、基礎の本ではなく、特定の製品の本や日付が書かれています。 MS-SQL Server 2008の最新の本は最先端のものである可能性がありますが、古くて具体的なものです。 私は本当に興味があります。私は基本的にプログラマであり、データベースの知識は私の形成の欠陥です。日々のタスクを実行するだけのデータベースについて多くのことを知っています。
18 learning 

7
多数の列を格納する良い方法は何ですか?
データベースにこのデータを保存する方法を決めるのに問題があります。それを行う最善の方法に関する提案はありますか?私はデータベースについて多くのことを知りません、私は付け加えるかもしれません。 データはそのようにフォーマットされていますが、列の数は4ではなく約240であるため、各日付には240の一意の値が関連付けられています。 Date/Time 200,00 202,50 205,00 2010.11.12 13:34:00 45,8214 43,8512 41,5369 2010.11.12 13:35:00 461,9364 454,2612 435,5222 また、行はDataSiteに関連付けられています。 最初に考えたのは、DataID(pk)、DataSiteID、ParameterID、Date、Valueのようなテーブルを作成し、DataSite、Parameter、Dateのインデックスを作成することでした。ParameterIDは、入力列ヘッダー(200,00 202,50 205,00 ...)を格納する別のテーブルを参照します。 私の第2の考えは、240奇数列すべてのテーブルを作成することでした。私は他にもいくつかの方法を考え出しましたが、それらもかなり不満足です。 私が最初の解決策で抱えている問題(それほど大きな問題ではありませんが、好きではありません)は、DateとDataSiteIDがその入力行の240個の値すべてに対して繰り返されるため、かなり多くの余分なスペース。 (上記のテキスト形式で)年間約40GBのデータが入り、データはDataSite、Parameter、Dateで検索されます。入ってくるデータの量は、おそらく1年程度で4倍になります。 良いアイデアはありますか?ありがとう、ジェームス 編集:これは時系列データであり、列は異なる波長での測定値です。データは比較的狭い波長範囲で分析する必要があります。将来のある時点で追加の波長が追加される可能性もあります。 編集:回答者のおかげで、私はそれを本当に感謝します:)私はおそらく500gb程度のテストデータでいくつかの実験を実行する時間を見つけることができると思います。結論を投稿します;)

6
DBパスワードの保護
私が見たほとんどのPHP / MySQLベースのWebサイトの構造を見ると、ログ用の情報を保存するセットアップまたは設定ファイルが常に存在するため、少し掘り下げてもデータベースパスワードを識別するのはそれほど難しくないようです。 DBに。データベースの権限がリモートリクエストに対して適切に制限されていることを確認する基本的な予防策以外に、この情報を保護するために自分のプロジェクトに実装できるオプションはありますか?
18 mysql  security 

6
パスワードが6日以内に期限切れになるというORA-28002メッセージを取り除く方法は?
パスワードが6日以内に期限切れになることを示すORA-28002を取得するユーザーがいます。私は次を実行しました: ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; しかし、ユーザーとしてログインしようとしても、メッセージは残っています。これを実行する: select * from dba_profiles where RESOURCE_NAME LIKE 'PASSWORD_LIFE_TIME'; 値が実際にUNLIMITEDに変更されたことを示しています。
18 oracle  security 

6
Oracleで非常に大きなレコードセットを削除する最良の方法
私は、非常に大きな(1つのテーブルに5億行を超える1TBに近いデータ)Oracleデータベースバックエンドを持つアプリケーションを管理しています。データベースは実際には何もしません(SProcsもトリガーも何もしません)、それは単なるデータストアです。 毎月、2つのメインテーブルからレコードを削除する必要があります。パージの基準はさまざまで、行の経過時間といくつかのステータスフィールドの組み合わせです。通常、1か月あたり1,000〜5,000万行をパージします(インポートにより、週に約300〜500万行を追加します)。 現在、この削除は約50,000行のバッチで実行する必要があります(つまり、50000の削除、comit、50000の削除、コミット、繰り返し)。バッチ全体を一度にすべて削除しようとすると、データベースが約1時間応答しなくなります(行数によって異なります)。このようなバッチで行を削除することはシステム上で非常に大雑把であり、通常、1週間にわたって「時間の許す限り」それを行う必要があります。スクリプトを継続的に実行できるようにすると、ユーザーが受け入れられないパフォーマンスの低下を招く可能性があります。 この種のバッチ削除もインデックスのパフォーマンスを低下させ、最終的にデータベースのパフォーマンスを低下させる他の影響があると考えています。1つのテーブルに34個のインデックスがあり、インデックスデータのサイズは実際にはデータ自体よりも大きくなっています。 ITスタッフの1人がこのパージを行うために使用するスクリプトを次に示します。 BEGIN LOOP delete FROM tbl_raw where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000; exit when SQL%rowcount < 49999; commit; END LOOP; commit; END; このデータベースは 99.99999%増加している必要があり、年に一度だけ2日間のメンテナンスウィンドウがあります。 これらのレコードを削除するためのより良い方法を探していますが、まだ見つかっていません。助言がありますか?

2
CouchDB対MongoDB [終了]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 8年前に閉鎖されました。 ドキュメント指向ストレージの評価、CouchDBとMongoDBの長所と短所は何ですか?

2
デフォルトの制約、それだけの価値はありますか?
私は通常、次のルールに従ってデータベースを設計します。 db_ownerとsysadmin以外は誰もデータベーステーブルにアクセスできません。 ユーザーの役割はアプリケーション層で制御されます。通常、1つのdbロールを使用して、ビュー、ストアドプロシージャ、および関数へのアクセスを許可しますが、場合によっては、一部のストアドプロシージャを保護するための2番目のルールを追加します。 TRIGGERSを使用して、重要な情報を最初に検証します。 CREATE TRIGGER <TriggerName> ON <MyTable> [BEFORE | AFTER] INSERT AS IF EXISTS (SELECT 1 FROM inserted WHERE Field1 <> <some_initial_value> OR Field2 <> <other_initial_value>) BEGIN UPDATE MyTable SET Field1 = <some_initial_value>, Field2 = <other_initial_value> ... END DMLは、ストアドプロシージャを使用して実行されます。 sp_MyTable_Insert(@Field1, @Field2, @Field3, ...); sp_MyTable_Delete(@Key1, @Key2, ...); sp_MyTable_Update(@Key1, @Key2, …

2
Row_GUID列の目的は何ですか?
私はAdventureWorks2012データベースを掘り下げて調査し、いくつかのテーブルでRow_GUIDが使用されていることを確認しました。 私の質問には2つの部分があります。 Row_GUID列を含める必要があるのはいつですか? Row_GUID列の用途と利点は何ですか?
18 sql-server  uuid 

2
ストアドプロシージャ内のこのクエリでSQLインジェクションが発生しないのはなぜですか?
次のストアドプロシージャを作成しました。 ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100)) AS SELECT ActorDOB, ActorName FROM tblActor WHERE ActorName LIKE '%' + @nameString + '%' AND ActorGender = @actorgender 今、私はこのようなことをしてみました。私はこれを間違っているかもしれませんが、そのような手順がSQLインジェクションを防ぐことができることを確認したいです: EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor' 以下の画像は、上記のSQLがSSMSで実行され、エラーではなく結果が正しく表示されることを示しています。 ところで、クエリの実行が完了した後、セミコロンの後にその部分を追加しました。その後、再度実行しましたが、テーブルtblActorが存在するかどうかを確認したところ、まだそこにありました。私は何か間違っていますか?または、これは本当に注射防止ですか?私がここで尋ねようとしているのは、このような安全なストアドプロシージャですか?ありがとうございました。

3
この結合カーディナリティの推定値が非常に大きいのはなぜですか?
私は、次のクエリのカーディナリティの推定値が非常に高いと思うことを経験しています: SELECT dm.PRIMARY_ID FROM ( SELECT COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID) PRIMARY_ID FROM X_DRIVING_TABLE dt LEFT OUTER JOIN X_DETAIL_1 d1 ON dt.ID = d1.ID LEFT OUTER JOIN X_DETAIL_LINK lnk ON d1.LINK_ID = lnk.LINK_ID LEFT OUTER JOIN X_DETAIL_2 d2 ON dt.ID = d2.ID LEFT OUTER JOIN X_DETAIL_3 d3 ON dt.ID = d3.ID ) …

4
OVERを使用したウィンドウ関数でのDISTINCTの使用
OracleからSQL Server 2014にクエリを移行しようとしています。 Oracleでうまく機能するクエリを次に示します。 select count(distinct A) over (partition by B) / count(*) over() as A_B from MyTable これは、SQL Server 2014でこのクエリを実行しようとした後に取得したエラーです。 Use of DISTINCT is not allowed with the OVER clause 誰が問題を知っていますか?SQL Serverではこのような種類のクエリが可能ですか?お知らせ下さい。

4
単一の列から複数のテーブルを参照するのに最適な設計ですか?
提案されたスキーマ 何よりもまず、投稿全体を通じて参照するために提案されたスキーマの例を次に示します。 Clothes ---------- ClothesID (PK) INT NOT NULL Name VARCHAR(50) NOT NULL Color VARCHAR(50) NOT NULL Price DECIMAL(5,2) NOT NULL BrandID INT NOT NULL ... Brand_1 -------- ClothesID (FK/PK) int NOT NULL ViewingUrl VARCHAR(50) NOT NULL SomeOtherBrand1SpecificAttr VARCHAR(50) NOT NULL Brand_2 -------- ClothesID (FK/PK) int NOT NULL PhotoUrl VARCHAR(50) …


2
並列クエリ実行エラーを理解する必要がある
今日、実稼働SQLサーバーのパフォーマンスが低下しました。これが発生した間、いくつかの"The query processor could not start the necessary thread resources for parallel query execution"エラーを記録しました。私が読んだことは、これが複雑なクエリを実行するときに使用するCPUの数に関係していることを示唆しています。しかし、私は停電たちの中にチェックするときCPU Utilization was only at 7%。私がまだ出くわしていない、これが参照している可能性のある他の何かがありますか?これはパフォーマンス低下の原因である可能性がありますか、それともニシンを追いかけていますか? これに対する私のsp_configure値は次のとおりです。 name minimum maximum config_value run_value cost threshold for parallelism 0 32767 5 5

4
バキューム/オートバキューム操作にはどれくらい時間がかかりますか?
私は、さまざまなロールを持つテーブルを含む大きな(数百ギグの)データベースを管理しており、その中には数百万のレコードを保持しているものもあります。いくつかのテーブルは、多数の挿入と削除のみを受け取り、他のいくつかの挿入と多数の更新のみを受け取ります。 データベースは、16ギガバイトのRAMを備えたDebian 6.0 amd64システム上のPostgreSQL 8.4で実行されます。 質問は、テーブル上の自動バキュームプロセスであり、完了するまでに非常に長い時間(日)かかります。特定のバキュームコマンドにかかる時間を大まかに伝えて、キャンセルするかどうかを判断できるようにしたいと思います。また、postgresバキューム操作の進行状況インジケーターがある場合、それは本当に役立ちます。 編集: 私は防弾ソリューションを探していません。デッドタプルまたは必要なI / Oバイトの数についての大まかなヒントで十分です。いつVACUUM終了するかわからないのは本当に迷惑です。 pg_catalog.pg_stat_all_tablesデッドタプルの数の列があることを見てきました。そのためANALYZE、前にテーブルにアクセスする必要がある場合でも、見積もりを行うことができます。一方、autovacuum_vacuum_thresholdおよびautovacuum_vacuum_scale_factor設定だけではpostgres自身があることを証明知っているテーブル上の変化量について何かを、おそらくあまりにもDBAの手にそれを置きます。 実行するクエリがVACUUM VERBOSEわかりません。実行すると、テーブルだけでなくインデックスも処理されていることがわかります。

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