データベース管理者

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

2
upsertで競合する行のIDを取得する方法は?
tag2つの列を持つテーブルがあります:id(uuid)とname(text)。テーブルに新しいタグを挿入したいのですが、タグが既に存在する場合idは、既存のレコードを取得するだけです。 私はちょうどON CONFLICT DO NOTHINGと組み合わせて使用できると仮定しましたRETURNING "id": INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT DO NOTHING RETURNING "id"; ただし、「foo」という名前のタグがすでに存在する場合、これは空の結果セットを返します。 次に、noop DO UPDATE句を使用するようにクエリを変更しました。 INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT ("name") DO UPDATE SET "name" = 'foo' RETURNING "id"; これは意図したとおりに機能しますが、名前を既存の値に設定しているだけなので、やや混乱します。 これはこの問題を解決する方法ですか、それとも私が見逃しているより簡単なアプローチがありますか?

2
DBMSには、大文字と小文字を区別せず、アクセントを区別しない照合順序がありますか?
この質問はベンダー/バージョンに依存しないことに注意してください 英語を話す人(タイピスト、作家)としては、単語の大文字と小文字の区別は正しいが、正しいアクセントが必ずしも正しい方向に進むとは限らないように思えます。 シャンゼリゼ通りにあるレストランクロエのテテアテテで熟考しました。 あなたはそれでアイデアを得る。 そのため、今日、大文字と小文字を区別し、アクセントを区別しない照合を使用する検索条件が必要であると考えましたが、見つかりませんでした。これには正当な理由がありますか、それとも私にとってはまれなユースケースですか? ここに私が見ていたいくつかのドキュメントの例があります(ただし、ベンダー/バージョンに依存しないと考えています)。 SQL Server照合名(SQL Server 2008 R2)

1
マルチステートメントTVFとインラインTVFパフォーマンス
Palindromeの質問に対する回答の一部を比較すると(回答を削除したため、1万人以上のユーザーのみ)、紛らわしい結果が得られています。 複数のステートメント、スキーマにバインドされたTVFを提案しました。これは、標準関数を実行するよりも高速だと思いました。また、以下に示すように、マルチステートメントTVFは「インライン化」されるという印象もありましたが、その点では間違っています。この質問は、TVFのこれら2つのスタイルのパフォーマンスの違いに関するものです。まず、コードを確認する必要があります。 次に、複数ステートメントのTVFを示します。 IF OBJECT_ID('dbo.IsPalindrome') IS NOT NULL DROP FUNCTION dbo.IsPalindrome; GO CREATE FUNCTION dbo.IsPalindrome ( @Word NVARCHAR(500) ) RETURNS @t TABLE ( IsPalindrome BIT NOT NULL ) WITH SCHEMABINDING AS BEGIN DECLARE @IsPalindrome BIT; DECLARE @LeftChunk NVARCHAR(250); DECLARE @RightChunk NVARCHAR(250); DECLARE @StrLen INT; DECLARE @Pos INT; SET @RightChunk = …

2
列サイズが大きくなった後、インデックスの作成に時間がかかるのはなぜですか?
ベンダーは、データベース全体のほとんどすべての列の列幅を変更しました。データベースは約7TB、9000以上のテーブルです。55億行のテーブルにインデックスを作成しようとしています。ベンダーのアップグレードの前に、2時間でインデックスを作成できました。今では数日かかります。彼らが行ったことは、varchar(xx)サイズをvarchar(256)に増やすことです。そのため、ほとんどの列はvarchar(18)またはvarchar(75)などでした。 とにかく、主キーは6列で構成され、幅は合計で126文字でした。アップグレード後、プライマリキーは1283文字になり、SQL Serverの900文字の制限に違反します。テーブルの列全体の幅は、1049の合計varcharカウントから4009の合計varcharカウントになりました。 データの増加はありません。テーブルはすべての列幅が増加する前よりも「スペース」を消費しませんが、インデックスのような単純なものを作成するためのパフォーマンスには不合理な時間がかかります。 列のサイズを大きくすることだけが行われたのに、作成とインデックス作成に非常に長い時間がかかる理由を誰でも説明できますか? pkはクラスター化インデックスであるため、作成しようとしているインデックスは非クラスター化です。インデックスの作成を何度か試みた後、私たちはあきらめました。完了せずに4〜5日間実行されたと思います。 ファイルシステムのスナップショットを取得して非稼働環境でこれを試し、より静かなサーバーでデータベースを起動しました。

8
主キーの値が変わるのはなぜですか?
私は最近ROWGUIDの概念を研究しており、この質問に出くわしました。 この答えは洞察を与えましたが、主キーの値を変更するという言及で、私を別のウサギの穴に導きました。 私の理解では、主キーは不変である必要があり、この回答を読んだ結果、ベストプラクティスと同じものを反映した回答しか得られなかったため、検索を続けてきました。 レコードが作成された後に主キー値を変更する必要があるのはどのような状況ですか?

2
一時テーブルがシークおよびブックマークルックアップを使用しているときに、テーブル変数がインデックススキャンを強制するのはなぜですか?
テーブル変数を使用すると、オプティマイザーがインデックスシークを使用してからブックマークルックアップとインデックススキャンを使用できなくなる理由を理解しようとしています。 テーブルにデータを入力する: CREATE TABLE dbo.Test ( RowKey INT NOT NULL PRIMARY KEY, SecondColumn CHAR(1) NOT NULL DEFAULT 'x', ForeignKey INT NOT NULL ) INSERT dbo.Test ( RowKey, ForeignKey ) SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (SELECT 0)), ABS(CHECKSUM(NEWID()) % 10) FROM sys.all_objects s1 CROSS JOIN sys.all_objects s2 CREATE INDEX …

3
PostgreSQLをバージョン8.4から9.4にアップグレードする方法は?
PostgreSQLをバージョン8.4から9.4にアップグレードします。 ドキュメントは、私にとって非常に明確ではありません。 アップグレードすると古いデータベースは失われますか? アップグレード後に古いデータベースを紛失した場合、どうすれば古いデータベースをバックアップできますか? psqlをアップグレードするにはどうすればよいですか? PostgreSQLはCentOS 6.6サーバーで実行されています。

4
FOR XMLには文字(0x0000)が含まれているため、データをシリアル化できませんでした
大きなクエリがあり(必要に応じてここに投稿します)、このエラーが表示されます。 メッセージ6841、レベル16、状態1、行1の XMLは、XMLで許可されていない文字(0x0000)を含むため、ノード 'NoName'のデータをシリアル化できませんでした。FOR XMLを使用してこのデータを取得するには、バイナリ、varbinary、またはimageデータ型に変換し、BINARY BASE64ディレクティブを使用します。 私が使用する唯一の部分FOR XMLはここにあります: WHERE (CodFuncionario = Results.CodFuncionario) FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia] しかし、何node nonameですか?そして、どのようにこの値を探すことができますか:(0x0000) これはサブクエリの1つです(FOR XMLを持っている唯一の部分)。 SELECT [CodFuncionario], STUFF ( ( SELECT ' / ' + CAST ( [DescFuncao] + '-' + [DescTempoExperiencia] AS VARCHAR(MAX) )... FROM [Linked_Server].db.dbo.tblFuncionarioExperiencia T0 INNER …

5
mysqldumpエラー2013
mysqlでバックアップしたいデータベースがインストールされています。mysqldump「maia_mail」テーブルのエクスポートで問題が発生します # mysqldump -u root -p maia > maia.sql mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `maia_mail` at row: 15 30秒未満で実行され、上記のエラーが表示されます。 DBの合計サイズは1.3GBで、maia_mailテーブルは1.0GBです ではmy.cnfIこれらのセットを持っています: [mysqld] max_allowed_packet = 1300M [mysqldump] max_allowed_packet = 1300M データベースをダンプする方法に関するアドバイスまたはアドバイスをお願いします。

12
SQL Serverの各文の各単語の最初の文字のみを大文字にする
SQL列の各文の各単語の最初の文字のみを大文字にします。 たとえば、文が次の場合: '私は映画が好き' 次に出力が必要です: '私は映画が好き' クエリ: declare @a varchar(15) set @a = 'qWeRtY kEyBoArD' select @a as [Normal text], upper(@a) as [Uppercase text], lower(@a) as [Lowercase text], upper(left(@a,1)) + lower(substring(@a,2,len(@a))) as [Capitalize first letter only] ここでは、自分の列でのみ最初の文字を大文字、小文字、大文字にしました(ここではランダムな単語を入力しています)。 私の結果は次のとおりです。 それを行う可能性はありますか? ユーザー定義関数を使用せずに結果を取得する可能性はありますか? 出力が必要です Qwerty Keyboard

1
EXPLAIN ANALYZEはplpgsql関数内のクエリの詳細を表示しません
PostgreSQL 9.3でPL / pgSQL関数を使用し、いくつかの複雑なクエリを内部で使用しています。 create function f1() returns integer as $$ declare event tablename%ROWTYPE; .... .... begin FOR event IN SELECT * FROM tablename WHERE condition LOOP EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return; END LOOP; ... INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ... UPDATE …

3
クラスター化された列ストアインデックスと外部キー
インデックスを使用してデータウェアハウスのパフォーマンスをチューニングしています。私はSQL Server 2014を初めて使用します。Microsoftは次のように説明しています。 「クラスター化された列ストアインデックスは、大規模なデータウェアハウジングファクトテーブルを格納するための標準であり、ほとんどのデータウェアハウジングシナリオで使用されることを期待しています。操作を削除します。」 http://msdn.microsoft.com/en-us/library/gg492088.aspx ただし、ドキュメントをさらに読むと、制限と制限があります。 「一意の制約、主キーの制約、または外部キーの制約を持つことはできません。」 これは私をとても混乱させます!さまざまな理由(データの整合性、セマンティックレイヤーに表示される関係など)のために、データウェアハウスに外部キーを配置することをお勧めします(必須ではありません)。 そのため、Microsoftはデータウェアハウスシナリオのクラスター化列ストアインデックスを推奨しています。ただし、外部キー関係を処理できませんか?! これは正しいですか?他にどのアプローチをお勧めしますか?過去には、データウェアハウスのシナリオで、クラスター化されていない列ストアインデックスを使用して、データロードのドロップと再構築を行いました。しかし、SQL Server 2014はデータウェアハウスに新しい価値を追加しませんか?

2
クエリプランの作成コストを測定または検索する方法
パラメータスニッフィングにより、「悪い」実行プランがプランキャッシュに到達し、その後のストアドプロシージャの実行が非常に遅くなる典型的なケースがあります。ローカル変数でこの問題を「解決」できますが、OPTIMIZE FOR ... UNKNOWN、およびでOPTION(RECOMPILE)。ただし、クエリに飛び込んで最適化を試みることもできます。 私がすべきかどうかを判断しようとしています:問題を修正する時間が限られているので、それをしないことのコストを知りたいです。ご覧のとおり、単にに固執するOPTION(RECOMPILE)と、最終的な効果は、クエリが実行されるたびにクエリプランが再作成されることです。だから、私は知る必要があると思う: クエリプランを作成するためのコストを調べる方法 私自身の質問に答えるために、(このクエリで)Googled を使い、dm_exec_query_statsDMVの列のドキュメントを 調べました。この情報を見つけるために、「実際のクエリプラン」のSSMSの出力ウィンドウも調べました。最後に、DBA.SEを検索しました。それらのどれも答えを導きませんでした。 誰か教えてもらえますか?計画の作成に必要な時間を見つけたり測定したりすることは可能ですか?

1
表の変更中に「許容される最大行サイズ8060より大きいサイズ8074の行を作成できません」
テーブルの列を変更しようとしています。既存のテーブルは次のとおりです。 CREATE TABLE [dbo].[table]( [id1] [int] NOT NULL, [id2] [int] NOT NULL, [id3] [int] NOT NULL, [name] [nvarchar](255) NOT NULL, [id4] [int] NOT NULL, [xmlData] [xml](CONTENT [dbo].[xml_schema]) NULL, [booleanData1] [bit] NOT NULL, [notes] [varchar](4096) NULL, [id5] [int] NULL, [booleanData2] [bit] NULL, [id6] [int] NULL, CONSTRAINT [PK_table] PRIMARY KEY CLUSTERED ([id1] …

7
毎日のスケジュールを[開始日]にグループ化します。終了日]曜日のリストとの間隔
2つのシステム間でデータを変換する必要があります。 最初のシステムは、スケジュールを日付の単純なリストとして保存します。スケジュールに含まれる各日付は1行です。日付のシーケンスにはさまざまなギャップが存在する可能性があります(週末、祝日、長い一時停止、曜日によってはスケジュールから除外される場合があります)。週末も含めて、隙間はまったくありません。スケジュールは最大2年です。通常は数週間です。 次に、週末を除く2週間にわたるスケジュールの簡単な例を示します(以下のスクリプトにはさらに複雑な例があります)。 +----+------------+------------+---------+--------+ | ID | ContractID | dt | dowChar | dowInt | +----+------------+------------+---------+--------+ | 10 | 1 | 2016-05-02 | Mon | 2 | | 11 | 1 | 2016-05-03 | Tue | 3 | | 12 | 1 | 2016-05-04 | Wed | 4 | | …

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