データベース管理者

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


7
IPアドレスを保存する
すべての登録ユーザーのIPアドレスをデータベースに保存する必要があります。このような列に対して何文字を宣言すればよいのでしょうか? IPv6もサポートする必要がありますか?ある場合、IPアドレスの最大長は?

2
SQL Server-スキーマ全体またはオブジェクトに権限を付与しますか?
SQL Severのデータベースパーミッション管理の世界に関しては、私は非常に環境に優しいです。 例をシンプルにしましょう。 アカウント「admin」がスキーマA、B、およびCの所有者であるとします。 スキーマA、B、およびCの下で作成されたオブジェクト(テーブル/ビュー)に対する完全な権限(更新/削除/挿入/選択/変更)が必要な別のアカウント「ミニオン」があります。 これは可能ですか?または、これらのスキーマの下にテーブル/ビューを追加するたびに、grantステートメントを実行する必要がありますか?(私には少しばかげているようです)。

2
単一のクエリを使用して挿入または更新する方法は?
私は、主キーと自動インクリメントされた名前の列IDを持つテーブルテストを持っています。レコードがない場合にのみ、新しいレコードを挿入します。たとえば、 入力はid = 30122および名前= johnです ID 30122のレコードがある場合、名前列をjohnに更新し、レコードがない場合、新しいレコードを挿入します。 私は次のような2つのクエリを使用して行うことができます select * from test where id=30122 いくつかのレコードがある場合は、使用できます update test set name='john' where id=3012 またはレコードがない場合は、使用できます insert into test(name) values('john') しかし、私は単一のクエリを使用したいですか? 誰かがその可能性を伝えることができますか?


5
MySQLクエリでバックティック( `)を使用する利点は?
MySQLでは、バックティック(`)記号の有無にかかわらずクエリを作成できます。例: SELECT * FROM TEST; SELECT * FROM `TEST`; 両方ともmysql-consoleで正常に動作します。 それらの間に技術的な違いはありますか? `単純なクエリよりも()を使用する利点はありますか?
25 mysql  select 

5
データウェアハウスに多対多の関係を実装する方法は何ですか?
データウェアハウスモデリングの主要なトポロジ(スター、スノーフレーク)は、1対多の関係を念頭に置いて設計されています。これらのモデリングスキームで多対多の関係に直面すると、クエリの可読性、パフォーマンス、および構造が大幅に低下します。 ディメンション間、またはファクトテーブルとデータウェアハウスのディメンションの間に多対多の関係を実装する方法と、必要な粒度とクエリパフォーマンスに関してどのような妥協がありますか?

1
(NOLOCK)vs NOLOCK
次のようなクエリを見つけたとき、いくつかのブロッキングを調査していました。 SELECT SomeField FROM SomeTable NOLOCK 私はこれを見てNOLOCK、他のクエリ、この場合はDELETEステートメントをブロックする方法を知りました。私は使用しているロックを簡単に調べましたがsp_lock、ここに私が見たものがあります: DB S GRANT TAB IS GRANT PAG S GRANT さて、私の理解では、これNOLOCKはスキーマ安定性ロックのみを取得することになっていますが、なぜISロックを取得したのですか? 私の好奇心がそそられました。私はBOLを見て、それを使用する2つの方法がWITH (NOLOCK)あり、廃止予定(NOLOCK)であることがわかったので、それらを試してみることにしました。次のクエリを実行した後、実行しましたsp_lock: SELECT SomeField FROM SomeTable WITH (NOLOCK) DB S GRANT TAB Sch-Sグラント SELECT SomeField FROM SomeTable (NOLOCK) DB S GRANT TAB Sch-Sグラント 案の定、スキーマ安定性ロックがあります。だから私の質問はこれです:ここで何が起こっているのですか?NOLOCKを使用するために受け入れられ構文のいずれかである場合WITH (NOLOCK)や(NOLOCK)、なぜクエリのエラーは、それが単なるを実行したときに出ませんNOLOCK(括弧なし)?サポートされている場合、ISロックを取得するのはなぜですか?ここに何が欠けていますか?私はオンラインで答えを探していましたが、今のところ不足しています。 これを2008R2と2012の両方でテストしました。

1
選択を追加するときに自己参照スカラー関数のネストレベルを超えました
目的 自己参照関数のテスト例を作成しようとすると、あるバージョンが失敗し、別のバージョンが成功します。 唯一の違いはSELECT、関数本体に追加されることです。その結果、両方で異なる実行計画が作成されます。 機能する機能 CREATE FUNCTION dbo.test5(@i int) RETURNS INT AS BEGIN RETURN( SELECT TOP 1 CASE WHEN @i = 1 THEN 1 WHEN @i = 2 THEN 2 WHEN @i = 3 THEN dbo.test5(1) + dbo.test5(2) END ) END; 関数を呼び出す SELECT dbo.test5(3); 返品 (No column name) 3 機能しない機能 CREATE …

3
SQL Serverは計画キャッシュと実行統計を定期的にクリアします
SQL Server 2014を2016にアップグレードした後、サーバーはキャッシュされた実行計画やdm*ビュー(などdm_exec_query_stats)を数時間ごとにリセットし続けます 誰かが手動で実行するかのように(誰も実行DBCC FREEPROCCACHEしない場合DBCC DROPCLEANBUFFERSを除き、自動的に実行されます)。 同じまさにデータベースがSQL Server 2014とWindows Server 2012で正常に機能し、SQL Server 2016(およびWindows server 2016)に移行した後、事態は南に進みました 私がチェックしたこと:データベースには「自動クローズ」フラグがありません。SQLサーバーはにad hoc optimized設定されていますtrue(私はそれが役立つと思ったが、そうではなかった)。「クエリストア」は「オフ」です。サーバーには16 GBのメモリがあります。 「SQL Serverログ」でも役に立たないものはありません。毎週のバックアップメッセージ... また、この記事をチェックしましたhttps://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-set-options(下の「例」セクションまでスクロールします。それ)計画が自動的にクリアされる状況のリストがあります。それらのどれも当てはまりません。 更新: 残念ながら、どの提案も役に立たなかった。LPIM権限の付与、同じクエリに対して大量のプランを生成したパラメータ化されていないクエリの検出と修正、「最大サーバーメモリ」の削減...プランは数時間から5〜10分ごとにランダムにリセットされ続けます。サーバーが「メモリ不足」の場合、どうして同じバージョンのマシンでも2014バージョンは正常に機能していました。 要求されたsp_Blitzの出力は次のとおりです。 **Priority 10: Performance**: - Query Store Disabled - The new SQL Server 2016 Query Store feature has not been enabled on this database. * xxx …

2
ユーザー接続の最大数
SQL Server 2012 Standardエディションでは、ユーザー接続の最大数が32,767であることを知っています。この番号に向かっている場合、DBAとして何をすべきですか? 現在、30,000のユーザー接続があり、この数は増加すると予想されます。

2
LIKE演算子のカーディナリティの推定(ローカル変数)
私はLIKE、未知のシナリオのすべての最適化で演算子を使用する場合、レガシーと新しいCEの両方が9%の見積もりを使用するという印象を受けました(関連する統計が利用可能であり、クエリオプティマイザーが選択性の推測に頼る必要がないと仮定)。 クレジットデータベースに対して以下のクエリを実行すると、CEごとに異なる推定値が得られます。新しいCEでは、予想していた900行の見積もりを受け取りますが、レガシーCEでは、241.416の見積もりを受け取りますが、この見積もりがどのように導出されるのかわかりません。誰もが光を当てることができますか? -- New CE (Estimate = 900) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName; -- Forcing Legacy CE (Estimate = 241.416) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName OPTION ( QUERYTRACEON 9481, QUERYTRACEON 9292, QUERYTRACEON 9204, QUERYTRACEON …

3
データベースで「少なくとも1つ」または「正確に1つ」を強制する制約
ユーザーがいて、各ユーザーが複数のメールアドレスを持つことができるとします CREATE TABLE emails ( user_id integer, email_address text, is_active boolean ) いくつかのサンプル行 user_id | email_address | is_active 1 | foo@bar.com | t 1 | baz@bar.com | f 1 | bar@foo.com | f 2 | ccc@ddd.com | t すべてのユーザーがアクティブなアドレスを1つだけ持つという制約を施行したい。Postgresでこれを行うにはどうすればよいですか?私はこれを行うことができました: CREATE UNIQUE INDEX "user_email" ON emails(user_id) WHERE is_active=true; これは、複数のアクティブなアドレスを持つユーザーを保護しますが、すべてのアドレスがfalseに設定されることは保護しません。 可能であれば、トリガーまたはpl / …

7
住所を個々の列に分割すると、どのような問題が解決しますか?
ソフトウェア開発者向けにテーブルとリレーションを設計するチームがあります。私たちの組織では、彼らは3NF正規化の実施について非常に厳しいです。正直に言うと、私たちの組織の規模と、ニーズやクライアントが時間とともにどのように変化するかを考えると同意します。設計決定の背後にある理由について明確になっていない領域は、アドレスのみです。 これは主に米国の住所に焦点を当てていますが、これはこれを行うすべての国に当てはまると思います。住所の各部分は、住所テーブルの独自の列を取得します。たとえば、この厄介な米国の住所を使用します。 Attn: Jane Doe 485 1/2 N Smith St SW, APT 300B Chicago, IL 11111-2222 次のようにデータベース内で分割されます。 番地:485 ストリートフラクション:1/2 ストリートプレディレクショナル:N(北) 通りの名前:スミス 通りのタイプ:ST(通り) ストリートポスト方向:SW(南西) 市:シカゴ 州:IL(イリノイ州) 郵便番号:11111 Zip4コード:2222 国(米国を想定) 注意:ジェーンドゥ 私書箱:NULL 住居の種類:APT(アパート) 住居番号:300B また、田舎のルートと契約ルートに関連する他の列がいくつかあります。さらに、特定のアプリケーションには、いくつかの国際アドレスが含まれている可能性があります。データモデラーは、国際住所に固有の列を追加すると述べました。これは通常の行1、行2のフィールドです。 最初は、これはWAYオーバーボードだと思いました。オンラインで繰り返し調べるとは、住所1、2、3、場合によっては4を使用してから、都市、地域、郵便番号を分割することです。この粒度が有益な新しいアプリケーションのユースケースが1つあります。ユーザーが重複したビジネスを作成していないことを検証する必要があり、住所の確認は検証の1つです。私たちはできるアドレスライン1と2で動作するようにそれを得るが、それはより困難になるであろう。 特定のアプリケーションに関しては、ビジネスと人々(物理、郵送、出荷など)のために複数の種類のアドレスを保存する必要があります。我々は可能性がある印刷可能な形式の文字を生成する必要がありますが、その要件は、これまで議論されていません。 組織内のアプリケーションがサポートする必要があるその他の事項: 監査(完全な履歴テーブルを使用) 宛名ラベルの印刷 印刷フォームの生成 報告(国および地方政府向け) 私たちのアプリケーションは、他のすべてのアプリケーションが行っていることをすべて行っているわけではありませんが、アドレスを複数のコンポーネントに分割することは、私が働いている企業標準です。アプリケーションがその恩恵を受けるかどうかに関係なく、私たちはこれを強制されます。 半関連のStackOverflowの質問:閉じられた良いアドレスパーサーはどこにありますが、アドレスの解析がどれほど難しいかを示しています。 私が彼らの設計決定をよりよく理解し、アイデアでクライアントを売るために... 住所を個々の列に分割すると、どのような問題が解決しますか? 問題が発生したため、このようなシステムを実装した人にとってのボーナスポイント。

6
SQL Server IDの値を順番に読み取ることに依存できますか?
TL; DR:次の質問に要約します:行を挿入するとき、新しい値の生成とクラスター化インデックス内の対応する行キーのロックの間に機会がありますか?外部オブザーバーはより新しいものを見ることができます並行トランザクションによって挿入された値?(SQL Serverで。)Identity Identity 詳細バージョン Identityという名前の列を持つSQL ServerテーブルがありますCheckpointSequence。これは、テーブルのクラスター化インデックスのキーです(これには、追加の非クラスター化インデックスもいくつかあります)。行は、いくつかの並行プロセスとスレッドによって(分離レベルで、なしで)テーブルに挿入されます。同時に、クラスター化インデックスから定期的に行を読み取るプロセスがあり、その列で並べ替えられます(分離レベルでも、オプションはオフになっています)。READ COMMITTEDIDENTITY_INSERTCheckpointSequenceREAD COMMITTEDREAD COMMITTED SNAPSHOT 私は現在、読み取りプロセスがチェックポイントを「スキップ」できないという事実に依存しています。私の質問は、このプロパティに依存できますか?そうでない場合、それを実現するために何ができますか? 例:ID値が1、2、3、4、および5 の行を挿入する場合、値4の行を表示する前に、値5の行を参照してはなりません。テストは、ORDER BY CheckpointSequence句(そしてWHERE CheckpointSequence > -1確実句)、ブロック行4、行5が既にコミットされていても、読まれるべきであるが、まだコミットされていない時はいつでも。 少なくとも理論的には、この仮定を破る可能性のある競合状態がここにあると思います。残念ながら、上のドキュメントでIdentityはIdentity、複数の同時トランザクションのコンテキストでどのように機能するかについてはあまり言及されていません。「特定のトランザクションの新しい値はそれぞれ、テーブル上の他の同時トランザクションとは異なります。」(MSDN) 私の推論は、それはこのように何らかの形で動作する必要があります: トランザクションが(明示的または暗黙的に)開始されます。 ID値(X)が生成されます。 対応する行ロックは、ID値に基づいてクラスター化インデックスで取得されます(ロックエスカレーションが開始されない限り、この場合、テーブル全体がロックされます)。 行が挿入されます。 トランザクションがコミットされる(おそらくかなり長い時間後に)ので、ロックは再び削除されます。 ステップ2と3の間に、非常に小さなウィンドウがあると思います 同時セッションは次のID値(X + 1)を生成し、残りのすべてのステップを実行できます。 したがって、その時点で正確に来ている読者が値X + 1を読み取ることができ、Xの値は失われます。 もちろん、これの可能性は非常に低いようです。しかし、まだ-それは起こる可能性があります。それともできますか? (コンテキストに興味がある場合:これは、NEventStoreのSQL Persistence Engineの実装です。NEventStoreは、すべてのイベントが新しい昇順チェックポイントシーケンス番号を取得する追加専用のイベントストアを実装します。クライアントは、チェックポイント順にイベントストアからイベントを読み取りますすべての種類の計算を実行するため。チェックポイントXのイベントが処理されると、クライアントは「新しい」イベント、つまりチェックポイントX + 1以上のイベントのみを考慮します。したがって、イベントをスキップしないことが重要です。現在、Identityベースのチェックポイント実装がこの要件を満たしているかどうかを判断しようとしています。これらは、使用されている正確なSQLステートメントです。Schema、Writerのquery、読者の質問。) 私が正しいと上記の状況が発生する可能性がある場合、それらに対処する2つのオプションのみが表示されますが、どちらも不十分です。 Xを確認する前にチェックポイントシーケンス値X + 1を確認した場合は、X + 1を終了し、後で再試行してください。ただし、Identityもちろんギャップが発生する可能性があるため(たとえば、トランザクションがロールバックされるとき)、Xが来ることはありません。 したがって、同じアプローチですが、nミリ秒後にギャップを受け入れます。ただし、nのどの値を想定する必要がありますか? より良いアイデアはありますか?

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