データベース管理者

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

1
トランザクションIDラップアラウンド後にxminとtxid_current()を比較する方法は?
通常の列に加えて、Postgresテーブルにはさまざまなシステム列があります。そのうちの1つはxmin、行の作成に使用されるトランザクションIDを格納します。そのデータ型はxid、ある時点で折り返す4バイトの整数です(つまり、必ずしも一意ではありません)。この関数txid_current()は、現在のトランザクションIDを返しますbigintが、「インストール中にラップしないように「エポック」カウンターで拡張されるため」として、マニュアルを引用します。 トランザクションのラップアラウンドがまだ発生していない場合、両方の値が一致しているようです: # CREATE TABLE test (label text); CREATE TABLE # INSERT INTO test VALUES ('test') RETURNING txid_current(); txid_current -------------- 674500 (1 row) INSERT 0 1 # SELECT xmin FROM test; xmin -------- 674500 (1 row) しかし、私は疑問に思う:これらの2つの値は常に同等ですか?私の知る限り、txid_current()トランザクションIDのラップアラウンド(最大2 ^ 32トランザクション)後も一意の値を配信し続けxmin、ゼロから開始します。これは、両方がその時点で異なる値を返し始めることを意味しますか? そして、これが当てはまる場合xid、txid_current()結果を規則的に抽出xminして、テーブル内のエントリと一致するようにする方法はありますか(たとえばtxid_current()、整数へのキャスト)。 編集:トランザクションIDのラップアラウンドの後、2 ^ 32トランザクションのかなり前に起こる可能性が非常に高いことを気にかけていることを明確にします。コメントでこれを指摘してくれたDanielVéritéに感謝します。


1
ROW_NUMBER()OVER(PARTITION BY B、A ORDER BY C)は、(A、B、C)のインデックスを使用しません
次の2つの機能を検討してください。 ROW_NUMBER() OVER (PARTITION BY A,B ORDER BY C) ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C) 私の知る限り、まったく同じ結果が得られます。つまり、PARTITION BY句内の列をリストする順序は重要ではありません。 インデックスがある場合(A,B,C)、オプティマイザーが両方のバリアントでこのインデックスを使用することを期待しました。 しかし、驚くべきことに、オプティマイザーは2番目のバリアントで追加の明示的な並べ替えを行うことにしました。 SQL Server 2008 StandardおよびSQL Server 2014 Expressで見ました。 以下は、私がそれを再現するために使用した完全なスクリプトです。 Microsoft SQL Server 2014で試しました-12.0.2000.8(X64)2014年2月20日20:04:26 Copyright(c)Microsoft Corporation Express Edition(64-bit)on Windows NT 6.1(Build 7601:Service Pack 1) およびMicrosoft SQL Server 2014(SP1-CU7)(KB3162659)-12.0.4459.0(X64)2016年5月27日15:33:17著作権(c)Windows NT 6.1(ビルド7601:サービス上のMicrosoft Corporation …

1
SQL Serverを使用した複数のPVSCSI
SQL Server仮想化に関して、ここで行われているのと同様に、データデバイスをログデバイスから異なる準仮想SCSI(PVSCSI)アダプターに分離することでパフォーマンスにプラスの影響がある場合、情報を見つけようとしました。 クライアントでは、追加のPVSCSIが追加され、ログデバイスが新しいPVSCSIに分離され、かなりのパフォーマンスの向上が見られるというシナリオがありました。それでも、それがこの分離によるものなのか、単に追加のPVSCSIが現在存在していたという事実によるものなのかという疑問は残ります。 よく知られているように、ログディスクは通常シーケンシャルに書き込まれますが、データディスクはr / wでよりランダムなパターンに従うため、これら2種類のファイルを別々のディスクに配置するとパフォーマンス上の利点があります。 しかし、コントローラーはどうですか?これらの異なるパターンを別々のPVSCSIコントローラーに保持することにも利点はありますか? 誰にもこれに関する洞察がありますか? 前もって感謝します

5
冗長性をチェックするためにテーブルを削除せずに非表示/無効にする方法は?
使用されなくなったWebサービスメソッドとデータベーステーブルを含む古いレガシーシステムを維持および拡張する必要があります。テーブルが実際に冗長であるかどうかは完全にはわからないので、それらを削除することを恐れています。 それらを削除せずに同じ効果を達成する他の方法はありますか(テーブルはこれ以上使用できません)?私の考えは、それらをDeleted現在のデフォルトとは異なるスキーマ(例:)に転送することdboでした。 IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted') BEGIN EXEC('CREATE SCHEMA Deleted') END ALTER SCHEMA Deleted TRANSFER dbo.TableName; 他のオプションはありますか、スキーマアプローチには欠点がありますか?

2
条件付きINSERTおよびSELECTよりもOUTPUTを使用したMERGEの方が良いでしょうか?
多くの場合、「存在しない場合は挿入」という状況が発生します。Dan Guzmanのブログには、このプロセスをスレッドセーフにする方法に関する優れた調査があります。 文字列をから整数に単純にカタログする基本的なテーブルがありSEQUENCEます。ストアドプロシージャでは、値の整数キーが存在する場合は取得するか、値の整数キーをINSERT取得してから結果の値を取得する必要があります。dbo.NameLookup.ItemName列には一意性の制約があるため、データの整合性は危険にさらされていませんが、例外は発生しません。 それはIDENTITYそうではないので、私は得ることができず、特定の場合にSCOPE_IDENTITYは値がありますNULL。 私の状況INSERTでは、テーブルの安全性だけを扱う必要があるため、次のMERGEように使用するのがより良い方法かどうかを判断しようとしています。 SET NOCOUNT, XACT_ABORT ON; DECLARE @vValueId INT DECLARE @inserted AS TABLE (Id INT NOT NULL) MERGE dbo.NameLookup WITH (HOLDLOCK) AS f USING (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item ON f.ItemName= new_item.val WHEN MATCHED THEN UPDATE SET …

4
SQL Server FILESTREAMを使用する場合の(部分的な)バックアップを小さく保つ
FILESTREAMバックアップが不要な1TB近くのデータを含むデータベースがあります(データが削除された場合、数時間で自動的に再作成されるため、重要ではありません)。ほとんどのデータは数日ごとに変更されるため、差分バックアップではサイズを抑えることはできません。 私は、私はリカバリモードを設定することにより、必要な方法で作業のバックアップを持っていたFull別の作成、FILEGROUPためにFILESTREAMのみ「プライマリ」のバックアップを取って、FILEGROUP。これが原因で発生した問題は、ログファイル(バックアップされる)にFILESTREAMデータが含まれるために不必要に大きくなることでした。 SIMPLEリカバリモードは特定FILEGROUPのsのバックアップを実行する私の能力を奪うので、私もそれがオプションになるとは思わない。 私の考えは、FILESTREAMデータを別のデータベースに移動するだけですが、今では参照整合性を失い、他の多くの問題も確実に継承しています。 Simpleリカバリモードで部分的なバックアップを作成する方法はありますか(FILESTREAMテーブルを読み取り専用に設定せずに)?そうでない場合、私の問題に対する他の健全な解決策はありますか?

1
SQL Serverは、テーブルのIDENTITY VALUEを物理的にどこに保存しますか?
誰かが私にこの方向を正しい方向に向けてくれることを望んでいます。これが私のこれまでの成果です。 SELECT * FROM sys.identity_columns"last_value"を与えるシステムビューですが、そのビューの定義は内部関数を使用しますIdentityProperty(colName, 'LastValue')-したがって、それは行き止まりです(そこでシステムテーブルからプルしません)。 インターネットのどこでも(私が見た)DBCC IDENT_...コマンドを使用して値を明らかにすることを提案していますが、それでも実際に保存されている場所については暗闇の中に残ります。 そこで、DBCC PAGE(TestDB,1,1325,3)テストハーネスデータベースに対して個々のページを検索し、RESEEDコマンドを使用して値10と12の間で再シードすることにしました。 これを行うには、私は上の進値に気づいたIAM: Header、IAM: Single Page AllocationsとIAM: Extent Alloc Status Slot 1すべてが変わりました。(また、bUse1の値は、それ自体で徐々に変化しますが、とにかく定期的に変化することに気付きました)。 だからもう一つの行き止まりと私はすべてのアイデアからです。他にどこで検索できますか? 私はSQL Server 2014を実行しています。内部知識に対する飽くなき渇望がありますが、これほど理解しにくいものはまだありません。理論的には(絶対値)がどこかに保存され、(ほぼ間違いなく)位置を特定できるはずなので、私の注意を引きました。内部的に保存されたデータ/メタデータの場所を発見する私の探求において、この特定の値は私が特にとらえどころのないものとして私を打つ。私は誰かが一緒に来て私に言うことを推測/望んでいます、あなたはそれを手に入れることができますがDBCC PAGE、間違った場所を見ていました。

1
肥大化したシステムテーブルのパフォーマンスを改善できますか?
背景: 多数のVIEWと非常に多数のSYNONYMを持つ多数のデータベースがあります。たとえば、1つのデータベースには1万個以上のVIEWと2百万個以上のSYNONYMがあります。 一般的な問題:(および一般的なシステムテーブル) を含むクエリはsys.objects遅くなる傾向があります。関係sys.synonymsするクエリは氷河期です。パフォーマンスを改善するために何ができるか疑問に思っています。 特定の例 このコマンドは、サードパーティツールによって実行されます。アプリとSSMSの両方で遅い: exec sp_tables_rowset;2 NULL,NULL 私の質問: この実行を高速化するにはどうすればよいですか? 試したこと:この出力が得られた 場合SET STATISTICS IO ON: (2201538行が影響を受けます)テーブル 'sysobjrdb'。スキャンカウント1、論理読み取り28、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み0。テーブル 'sysschobjs'。スキャンカウント1、論理読み取り53926、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。 基になるシステムテーブルの統計を更新できました。これは、SQL 2008 R2以降の環境で機能しました。 UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN また、インデックスメンテナンスを実行することもできました。これは、SQL 2012以降の環境で機能します。たとえば、実行中sp_help 'sys.sysschobjs'はテーブルのインデックスを識別し、そこからこれらのコマンドを作成して実行します。 ALTER INDEX clst ON sys.sysschobjs REORGANIZE ALTER INDEX nc1 ON sys.sysschobjs REORGANIZE ALTER INDEX nc2 …

4
結合の最大値を選択するクエリ
ユーザーのテーブルがあります: |Username|UserType|Points| |John |A |250 | |Mary |A |150 | |Anna |B |600 | とレベル |UserType|MinPoints|Level | |A |100 |Bronze | |A |200 |Silver | |A |300 |Gold | |B |500 |Bronze | そして、各ユーザーのレベルを取得するためのクエリを探しています。以下の線に沿ったもの: SELECT * FROM Users U INNER JOIN ( SELECT TOP 1 Level, U.UserName FROM Levels L …


1
COLUMNS_UPDATEDを使用して、特定の列のいずれかが更新されているかどうかを確認する方法
42列のテーブルと、これらの列のうち38列が更新されたときに何らかの処理を行うトリガーがあります。したがって、残りの4列が変更された場合、ロジックをスキップする必要があります。 私が使用することができUPDATE()関数と一つの大きな作成IF条件を、より短い何かをすることを好みます。COLUMNS_UPDATEDを使用すると、特定の列がすべて更新されているかどうかを確認できますか? たとえば、列3、5、および9が更新されているかどうかを確認します。 IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20) AND (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) ) PRINT 'Columns 3, 5 and 9 updated'; したがって、20列3との5値、および1列の値9は2番目のバイトの最初のビットに設定されているためです。ステートメントを変更するORと、列3および/ 5または列9が更新されているかどうかが確認されますか? OR1バイトのコンテキストでロジックを適用するにはどうすればよいですか?

1
UNPIVOT(ループ結合)でバッチモードを使用する方法は?
次の形式のクエリがあります。 SELECT ... FROM ColumnstoreTable cs CROSS APPLY ( SELECT * FROM (VALUES ('A', cs.DataA) , ('B', cs.DataB) , ('C', cs.DataC) ) x(Col0, Col1) ) someValues これは、Columnstore-backedサブクエリ(ColumnstoreTable)からすべての行を取得し、それらの行を乗算します。これは本質的にUNPIVOTです。実際のクエリはこれよりも大きくなります。クエリのこの部分は、他の処理に送られます。 ここでの問題は、これCROSS APPLYが合理的な選択であるループ結合として実装されていることです。残念ながら、ループ結合はバッチモードをサポートしていません。 クエリのこの部分はパフォーマンスが非常に重要であり、バッチモードで実行するとパフォーマンスに非常に有益であると思われます。 バッチモードから移行しないように、このクエリを書き換えるにはどうすればよいですか? の代わりに一時テーブルを使用してみましたVALUESが、ハッシュ結合に等価結合条件がないという事実は変わりませんでした。

4
総訪問数を計算する
重複する日に注意して顧客の訪問数を計算するクエリを作成しようとしています。itemID 2009の開始日が23日、終了日が26日であるため、アイテム20010がこれらの日の間である場合、この購入日を合計カウントに追加しません。 シナリオ例: Item ID Start Date End Date Number of days Number of days Candidate for visit count 20009 2015-01-23 2015-01-26 4 4 20010 2015-01-24 2015-01-24 1 0 20011 2015-01-23 2015-01-26 4 0 20012 2015-01-23 2015-01-27 5 1 20013 2015-01-23 2015-01-27 5 0 20014 2015-01-29 2015-01-30 2 2 OutPutは7 …

4
データベースの復元ウィザードがSSMS 2014で開かない
Windows Server 2012 R2を実行している開発マシンで、SQL Serverを2012から2014にアップグレードしました。 SQL Server Management Studio 2014を使用すると、データベースを右クリックしてTasks -> Restore -> Database...も何も実行されません。データベースの復元ウィザードが期待どおりに表示されません。 イベントビューアーにはエラーやクラッシュはありません。カーソルは砂時計にもなりません。 T-SQLを使用した復元は正常に機能し、戻ってSSMS 2012を使用すると正常に機能します。SSMS 2014でウィザードを機能させる方法についてのアイデアはありますか? SSMSの両方のバージョンのSQL Serverの同じインスタンスに接続していますが、管理者としてSSMSを実行しようとしました。 Service Pack 1です。 Microsoft SQL Server Management Studio 12.0.4100.1 Microsoft Analysis Services Client Tools 12.0.4100.1 Microsoft Data Access Components (MDAC) 6.3.9600.17415 Microsoft MSXML 3.0 5.0 6.0 Microsoft Internet Explorer 9.11.9600.18125 …

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