データベース管理者

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

4
トランザクション内のトランザクション
たとえば、以下のスクリプトが呼び出された場合、PostgreSQLはどのような動作を示しますか BEGIN; SELECT * FROM foo; INSERT INTO foo(name) VALUES ('bar'); BEGIN; <- The point of interest END; PostgreSQLは2番目を破棄しますか、BEGINそれともコミットが暗黙的に決定さBEGIN ENDれ、最後に別のトランザクションとしてブロックを実行しますか?

2
IS NULL値のフィルター選択されたインデックスが使用されないのはなぜですか?
次のようなテーブル定義があると仮定します。 CREATE TABLE MyTab ( ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY ,GroupByColumn NVARCHAR(10) NOT NULL ,WhereColumn DATETIME NULL ) そして、次のようなフィルター処理された非クラスター化インデックス: CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab (GroupByColumn) WHERE (WhereColumn IS NULL) このインデックスがこのクエリで「カバー」されていない理由: SELECT GroupByColumn ,COUNT(*) FROM MyTab WHERE WhereColumn IS NULL GROUP BY GroupByColumn 私はこの実行計画を取得しています: KeyLookupは、WhereColumn IS NULL述語用です。 計画は次のとおりです。https://www.brentozar.com/pastetheplan/?id …

2
SSMSをIntegration Servicesに接続する際の「アクセスが拒否されました」
特定のSQL Serverクラスターのネットワーク名を使用してSSMSをIntegration Servicesに接続しようとすると、次のエラーが表示されます。 コンピューター 'FooDB'上のIntegration Servicesサービスへの接続は、次のエラーで失敗しました: "アクセスが拒否されました。" このエラーは、DCOMを介したリモート接続を許可するようにコンピューターが構成されていない場合、またはユーザーがDCOMを介してSQL Server Integration Servicesサービスにアクセスする権限を持っている場合に発生します。 これは、十分に文書化されたソリューションの日常的な問題です。たとえば、こちらとこちらのソリューションをご覧ください。 しかし、私は知っているすべての解決策を試しましたが、問題は残っています。 より詳細には、次のことを行いました。 接続しているユーザーが、MsDtsServer100で上記にリンクされている記事にリストされているDCOM権限を持っていることを確認しました。 起動とアクティベーションの許可:ローカル起動を許可、リモート起動、ローカルアクティベーション、リモートアクティベーションを許可 アクセス許可:ローカルアクセスを許可、リモートアクセスを許可 構成許可:読み取りを許可 接続に関連するすべてのトラフィックがファイアウォールを正常に通過していることをパケットスニッファーで確認しました。TCP接続が切断される前に表示される最後のパケットは、MSRPCヘッダー内の「アクセス拒否」のWindowsステータスコードを含むサーバーからの応答です。 「Distributed COM Users」グループおよび/またはローカル管理者グループにユーザーを追加し、サーバーを再起動することをテストしました。これにより、ユーザーはローカルノード名(FooDBN1、FooDBN2)を使用してSSMSからSSISに接続できましたが、クラスターネットワーク名(FooDB)に接続するときに「アクセス拒否」エラーが発生します。使用方法、および他のクラスターで機能するもの。 また、これらのグループのメンバーシップを変更することは、他のクラスターで必要だとは思いません。 チェックした他のクラスターでは、デフォルト以外の構成なしでクラスター名を使用してSSMSをSSISに接続できます。 これはServerFaultの方が適切であり、必要に応じて移行される質問で問題ないことを認識していますが、SQL Serverの問題でもあり、ここのユーザーは以前に対処した可能性が高いと思います。 プラットフォームの詳細: Windows Server 2008 R2 SP1 SQL Server 2008 R2 SP2 単一のSQL Serverインスタンスを持つ2ノードのアクティブ/パッシブクラスター 誰も私がここで次に見るべきことを提案できますか? 更新:これは今日、神秘的に作業を開始しましたが、ローカル管理者グループのメンバーのみが対象です。私が知る限り、何も変わっていません。

2
挿入中にディスク容量がいっぱいになりました、どうなりますか?
今日、データベースを保存するハードドライブがいっぱいであることを発見しました。これは以前にも起こりましたが、通常、原因は非常に明白です。通常、不適切なクエリがあり、tempdbに大量の流出が発生し、ディスクがいっぱいになるまで増大します。今回は、tempdbがドライブ全体の原因ではなく、データベースそのものであるため、何が起こったのかが少しわかりにくくなりました。 事実: 通常のデータベースサイズは約55 GBでしたが、605 GBに増加しました。 ログファイルのサイズは標準で、データファイルは巨大です。 データファイルには85%の使用可能なスペースがあります(これを「空気」と解釈します:使用されたが、解放されたスペースです。SQLServerは、割り当てられるとすべてのスペースを予約します)。 tempdbのサイズは正常です。 考えられる原因を見つけました。あまりにも多くの行を選択するクエリが1つあります(不正な結合により、数十万が予想される110億行が選択されます)。これはSELECT INTOクエリであり、次のシナリオが発生したのではないかと思いました。 SELECT INTOが実行されます ターゲット表が作成されます データは選択されたとおりに挿入されます ディスクがいっぱいになり、挿入が失敗する SELECT INTOは中止され、ロールバックされます ロールバックは領域を解放します(既に挿入されたデータは削除されます)が、SQL Serverは解放された領域を解放しません。 ただし、この状況では、によって作成されたテーブルSELECT INTOがまだ存在することを期待していなかったため、ロールバックによって削除されるはずです。私はこれをテストしました: BEGIN TRANSACTION SELECT T.x INTO TMP.test FROM (VALUES(1))T(x) ROLLBACK SELECT * FROM TMP.test これは次の結果になります。 (1 row affected) Msg 208, Level 16, State 1, Line 8 Invalid object name 'TMP.test'. …

1
「どこ」でアクセントを無視する
データベースには、caron / hatschekを使用した複数のエントリがあります。現在、ユーザーは、なしでエントリを検索するときに、caron / hatschekを含むエントリを検索したいと考えています。これを簡単な例で示します。 データベースにエントリがあります(名前の連絡先) Millière この名前はその人が住んでいる国で正しいです 私たちの国では、caron / hatschekの文字はないため、ユーザーはを検索しMilliereます。è明らかに一致しないため、結果は表示されませんe。 私は、これはとして実現することができるか見当がつかないé、è、êその多くは、より利用可能です(これは手紙のための唯一の例ですe...)。 (文字列をすべてcaron / hatschekで基本文字列に置き換えるだけでよいので、他の方法ははるかに簡単です。明らかに、ユーザーは、障害のある名前ではなく、データベースの名前の正しいバージョンを望んでいます。)

2
Postgresがメッセージキューとしてリッスン/通知する
PostgresのListen / Notify機能を使用してメッセージをチャネルに配信し、このメッセージを1人のリスナーのみが消費する方法はありますか? これの目的は、複数の「ワーカー」アプリがすべて同じPostgresチャネルをリッスンしていることです。しかし、通知チャネルを介して受信したメッセージごとに1回だけ作業を行いたいと思います。 Listen / NotifyがPostgresの正しい機能ではない場合、使用すべき別の機能はありますか? 理想的には、追加の拡張機能を使用せずにこれを実行したいと思います。

4
varcharデータ型がUnicode値を許可するのはなぜですか?
varchar列を持つテーブルがあります。以下に示すように、商標(™)、著作権(©)およびその他のUnicode文字を許可しています。 Create table VarcharUnicodeCheck ( col1 varchar(100) ) insert into VarcharUnicodeCheck (col1) values ('MyCompany') insert into VarcharUnicodeCheck (col1) values ('MyCompany™') insert into VarcharUnicodeCheck (col1) values ('MyCompany░') insert into VarcharUnicodeCheck (col1) values ('MyCompanyï') insert into VarcharUnicodeCheck (col1) values ('MyCompany') select * from VarcharUnicodeCheck しかし、varcharの定義では、Unicode以外の文字列データが許可されています。ただし、Trademark(™)およびRegistered(®)シンボルはUnicode文字です。定義はvarcharデータ型のプロパティと矛盾しますか?最初のリンクと2つ目のリンクを読んだ。しかし、定義がユニコード文字列以外の値のみを許可すると言っているときに、ユニコード文字列を許可する理由を理解できませんでした。

3
SQL Serverのページネーション
約100 GBの非常に大きなデータベースがあります。私はクエリを実行しています: select * from <table_name>; 100行目から200行目だけを表示したいです。 これが内部でどのように起こるかを理解したいです。データベースは、ディスクからすべてのレコードをメモリにフェッチし、100番目から400番目の行をクエリクライアントに送り返しますか?または、Bツリーなどのインデックス作成メカニズムを使用して、データベースからそれらのレコード(100番目から200番目)のみを取得するメカニズムが存在しますか? これはページネーションの概念に関連していることがわかりましたが、データベースレベルで内部的にどのように発生するかを正確に見つけることができませんでした。

2
変更されていない列も含めて、すべての列を更新するオーバーヘッドはどれくらいですか[クローズ]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 2年前に閉店しました。 行の更新に関して、多くのORMツールは、特定のエンティティに関連付けられているすべての列を設定するUPDATEステートメントを発行します。 利点は、UPDATEどのエンティティ属性を変更しても同じステートメントであるため、更新ステートメントを簡単にバッチ処理できることです。さらに、サーバー側とクライアント側のステートメントキャッシングも使用できます。 したがって、エンティティをロードし、単一のプロパティのみを設定した場合: Post post = entityManager.find(Post.class, 1L); post.setScore(12); すべての列が変更されます: UPDATE post SET score = 12, title = 'High-Performance Java Persistence' WHERE id = 1 ここで、titleプロパティにもインデックスがあると仮定すると、DBは値がとにかく変わっていないことに気付かないでしょうか? で、この記事で、マルクスWinandは言います: すべての列の更新は、前のセクションで既に確認した同じパターンを示しています。応答時間は、インデックスが追加されるたびに増加します。 データベースは関連するデータページをディスクからメモリにロードし、列の値を変更する必要があるかどうかを判断できるため、なぜこのオーバーヘッドがあるのだろうかと思います。 インデックスの場合でも、変更されていない列のインデックス値は変わらないが、UPDATEに含まれているため、何も再分散しません。 データベースがリーフ値が同じであることを認識するためだけに、冗長で変更されていない列に関連付けられたB +ツリーインデックスもナビゲートする必要があるのでしょうか? もちろん、いくつかのORMツールでは、変更されたプロパティのみを更新できます。 UPDATE post SET score = 12, WHERE id = 1 しかし、このタイプのUPDATEは、さまざまな行のさまざまなプロパティが変更されたときに、バッチ更新またはステートメントキャッシュの恩恵を常に受け​​られるとは限りません。

4
SQL Server 2016 DBメールが送信されない
私はSQL Server 2016を使用していますが、急いでいます... DBメールが送信されず、見る場所がなくなりました。DBmail実行可能ファイルに対するSQLアカウントの許可を再確認しました-読み取りと実行が完了しました。ファイアウォールのアウトバウンドポート587のルールを入力しました。同じ未送信の問題で別のメールアカウントとプロファイルを試しました。ログ(dbメールログ)の唯一のエントリは、サービスの開始と終了です。私が見つけられるエラーはどこにもありません。電子メールは単に送信キューに入り、決して送信キューから出ないように見えます。アカウントは、自分自身で、および別のマシン上のSQL Server 2014インスタンスから電子メールを送受信できます。 送信済みステータスが「未送信」のアイテムのキューがあり、未送信メールの長いキューは別として、すべての通常の場所をチェックして、すべてのアイテムで期待される結果を確認しました。 SELECT * FROM msdb..sysmail_event_log order by log_id DESC SELECT * FROM dbo.sysmail_mailitems SELECT * FROM dbo.sysmail_sentitems USE msdb SELECT sent_status, * FROM sysmail_allitems SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb'; EXECUTE msdb.dbo.sysmail_help_status_sp 私はそれをオフにして再びオンにしてみました...この状況を明らかにするDMVなどを見逃しましたか?これは、SQL Server 2016の既知の問題で、検索には含まれていませんか?このメールを送信する他の可能な手順はありますか?



1
NULL以外の値またはNULLの列をチェックするSQLクエリを記述する最適な方法
デフォルト値としてNULLを持つパラメーターを持つSPがあり、次のようなクエリを実行したい: SELECT ... FROM ... WHERE a.Blah = @Blah AND (a.VersionId = @VersionId OR (@VersionId IS NULL AND a.VersionId IS NULL)); WHERE非NULL値とのNULL値の両方のための上記のチェック@VersionId。 代わりにIFステートメントを使用し、クエリをNULL以外を検索するクエリとNULLを検索するクエリに複製する方がパフォーマンスの点で優れているでしょうか?: IF @VersionId IS NULL BEGIN SELECT ... FROM ... WHERE a.Blah = @Blah AND a.VersionId IS NULL; ELSE BEGIN SELECT ... FROM ... WHERE a.Blah = @Blah …

2
SQL Server UniqueIdentifier / GUID内部表現
私の同僚が私に興味深い質問を送ってきたが、それは完全には説明できない。 彼はいくつかのコード(以下を含む)を実行し、それからやや予期しない結果を得ました。 本質的に、UniqueIdentifier(これから私が参照するGuid)をbinary(またはvarbinary)タイプに変換するとき、結果の前半の順序は逆になりますが、後半はそうではありません。 私の最初の考えは、システムのエンディアンが原因であり、Guidディスプレイは保存されているが、binaryフォームは保証されていないということでした。 明らかにこれは実装の詳細ですが、それについて適切な説明があったのではないかと思っていました。 コード: declare @guid uniqueidentifier = '8A737954-CBEC-40CE-A534-2AFFB5A0E207'; declare @binary binary(16) = (select convert(binary(16), @guid)); select @guid as [GUID], @binary as [Binary]; 結果: GUID Binary 8A737954-CBEC-40CE-A534-2AFFB5A0E207 0x5479738AECCBCE40A5342AFFB5A0E207 ご覧のとおり、Guid(の最後まで40CE)の前半は各セクションごとに逆方向に保存されています。つまり、の最初のセクションGuidは後方に、次に2番目のセクション、次に3番目のセクションになりますが、セクションの順序は保持されます。その後、最後の2つのセクションは、に表示される正確な順序で保存されGuidます。 誰でもこれを説明できますか?(より大きなテストセットを以下に示します。) コード: declare @guid_to_binary table ( [id] int identity(1,1), [guid] uniqueidentifier, [binary_conversion] binary(16) ); declare @i int = 1; …


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