データベース管理者

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

1
型修飾子を使用したデータ型の驚くべき結果
この質問に対する再帰的なCTEソリューションについて説明しながら: 各IDの最後の5つの異なる値を取得する @ypercubeは驚くべき例外に出くわし、型修飾子の処理を調査することになりました。私たちは驚くべき行動を見つけました。 1.型キャストは、一部のコンテキストで型修飾子を保持します しないように指示された場合でも。最も基本的な例: SELECT 'vc8'::varchar(8)::varchar 一つは、期待していないかもしれないvarchar私は、少なくとも、(無修正)でしょう。しかし、結果はvarchar(8)(修飾子付き)です。以下のフィドルで関連する多くのケース。 2.配列の連結により、一部のコンテキストで型修飾子が失われる 必要がないので、これは反対側でエラーになります: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) 最初の式はvarchar(8)[]期待どおりに生成されます。 しかし、2番目は、連結した後、別のものvarchar(8)がvarchar[]修正されます(修飾子なし)。からの同様の動作、array_append()以下のフィドルの例。 このすべては、ほとんどの状況で重要ではありません。Postgresはデータを失わず、列に割り当てられると、値はとにかく正しい型に強制されます。ただし、反対方向にエラーを発生させると、驚くべき例外が発生します。 3.再帰的なCTEは、完全に一致するデータ型を要求します この単純化されたテーブルを考えると: CREATE TABLE a ( vc8 varchar(8) -- with modifier , vc varchar -- without ); INSERT INTO a VALUES ('a', 'a'), ('bb', 'bb'); このrCTEはvarchar列に対しては機能しvcますが、varchar(8)列に対しては失敗しますvc8。 WITH RECURSIVE cte AS ( …

1
SQL Serverの「チェックポイント時にログを切り捨て」オプション
長い話ですが、私たちの長期コンサルタント(元従業員)は、Tivoli Storage Managerとのインターフェースを取るためにカスタムスクリプトを数年(2006年ほど)書いており、という名前のSQL Server DBオプションをチェックしているようtruncate log on checkpointです。彼らの主張は、SQL 2012であるインスタンスでスクリプトが機能し、バックアップを実行することを妨げているということです。 私はそのようなオプションを見つけることができずsp_configure、バックアップが1つのインスタンスを除いてどこでも機能しているので、それは完全なBSだと感じています。しかし、それがそうであるなら、私は地雷を取り除き、他の時代遅れの要素を取り除きたいと思います。ベンダーに確認してもらっていますが、彼らの言うことにはあまり自信がありません。 私が行った調査では、SQL 2000またはSybaseのオプションの1つであると考えられます。もう1つの主張は、復旧モデルがSIMPLE存在し、それをオンまたはオフにする明示的なオプションがない場合、それが以降のバージョン(2008以降)で暗黙的に呼び出される/使用されるというものでした。 TRUNCATE LOG最近のトランザクションログのしくみが原因でこのコマンドは廃止されているため、現時点ではクエリを実行できるオプションではないと思います。 私はSQL Server 2000のインスタンスを持っていないので、誰かがこれを思い出したり、置いてあるものでそれをチェックしたりできることを望んでいました。それは私が推薦できるものではないことを彼らに話しました。私はまた、誰かがこれが時代遅れであることを確認できることを望んでいました。

2
バックアップを作成しているプロセスが見つかりません
お客様のサーバーにSQL Server 2008のインスタンスがインストールされています。お客様のIT部門は、マシンのさまざまなバックアップを担当しています。 SQL Serverログは、毎日午後7時に完全バックアップがあることを示していますが、SQL Serverでスケジュールされた計画の証拠を見つけることができません。 私たちに連絡した技術者は、何らかの自動バックアップがあったかどうかを私たちに伝えることができませんでした。彼らが言ったのは、マシン全体がバックアップされているということだけです。 このフォーラムスレッドで見つけたスクリプトを使用して、物理デバイス名がGUIDであり、これが外部バックアッププロセスであることを確認しました。 USE [msdb] GO SELECT [bs].[database_name], [bs].[backup_start_date], [bs].[backup_finish_date], [bs].Server_name, [bs].user_name AS [BackupCreator] , [bmf].physical_device_name FROM msdb..backupset bs INNER JOIN msdb..backupmediafamily bmf ON [bs].[media_set_id] = [bmf].[media_set_id] ORDER BY [bs].[backup_start_date] DESC これは、上記のクエリの行です。 db_name 2015-09-16 19:01:23.000 2015-09-16 19:01:28.000 SERVER_NAME NT AUTHORITY \ SYSTEM {424F084A-F35D-4A66-8FC7-072268A89A77} 5 さらに、バックアップの開始日と終了日は5秒間しかないため、SQLサーバーの仕事ではないことは明らかです。 …

1
このwhileループで明示的なトランザクションが必要ですか?
SQL Server 2014: 非常に大きな(1億行)テーブルがあり、その上のいくつかのフィールドを更新する必要があります。 ログシッピングなどの場合も、一口サイズのトランザクションを維持する必要があります。 以下を少し実行してからクエリをキャンセル/終了すると、これまでに行われた作業はすべてコミットされますか、いつでもキャンセルできるように明示的なBEGIN TRANSACTION / END TRANSACTIONステートメントを追加する必要がありますか? DECLARE @CHUNK_SIZE int SET @CHUNK_SIZE = 10000 UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or deletedDate is null WHILE @@ROWCOUNT > 0 BEGIN UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' …

2
データベースSQL Server 2012をミラーリングできません
次のコマンドを使用してデータベースをミラーリングしようとした場合 ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ 次のエラーが表示されます メッセージ1475、レベル16、状態105、行1 データベース「test0916aj8CJ」には、バックアップされていない一括ログ変更が含まれている場合があります。プリンシパルデータベースまたはプライマリデータベースでログバックアップを作成します。次に、このバックアップをミラーデータベースで復元してデータベースミラーリングを有効にするか、すべてのセカンダリデータベースで復元して、可用性グループに参加できるようにします。 データベースをバッキングせずにこれを実行できますか?または、バックアップしてからバックアップを破棄する必要があります。新しく作成されたデータベース用なので、この時点ではバックアップは必要ありません。 私は以下を試しました... BACKUP DATABASE [test0916aj8CJ] TO DISK = N’NUL’ WITH COPY_ONLY, NOFORMAT, INIT, NAME = N’test-Full Database Backup’, SKIP, NOREWIND, NOUNLOAD GO しかし、上記の方法も機能しませんでした。 ありがとう

1
列のIdentityプロパティの削除がサポートされていないのはなぜですか
SQL Server 2000以降、ID列を "非ID"にする機能が削除されたことを読んだことがあります。そして、これは「設計どおり」でした(欠けている機能だけでなく)。 これが私がブログで見つけた例です。システムテーブルの更新が含まれます。(そしてその機能はSQL Server 2000の後で削除されました。)私はシステムテーブルを介してこれを行うのは良い考えではないことを理解しています。なぜこれを別の方法で実行する機能がないのか疑問に思っています。 これを回避すると、かなりの量の作業が必要になります。(ダウンタイムに耐えられない環境で、数億行を新しいテーブルにコピーする。) だから、「なんで」と聞いてみました。 SQL Server 2005以降のバージョンで何が変更されて、これは悪いことでしたか?それとも、それは常に悪いことでしたか? ID列を再び通常の列にすることにより、どの「ベストプラクティス」(または同様の原則)に違反しますか? - 「 これを行う理由」の要求に答えるための更新:これは非常に高レベルの要約です:テーブルにパーティションを追加し始めます。(古いデータをアーカイブ/パージできるようにするためです。)それは簡単です。ただし、レコードが別のパーティションに移動して、削除されないようにする必要がある場合があります(パーティションがアーカイブ/削除のために表示される場合)。(行を別のパーティションに移動するためのスペースが常にあるように、パーティション列を2増やしています。) しかし、パーティション列がID列の場合、値を削除して再挿入する必要があります(ID列の値を更新する方法はありません)。これにより、レプリケーションで問題が発生します。 そのため、ID列の代わりにシーケンスを使用したいと考えています。しかし、その切り替えは、大規模なデータベースでは非常に困難です。

3
「WITH NOCHECK」を使用して外部キーを作成すると、何が失われますか?
EXISTS()FKルックアップ値で呼び出しを行うと、そのFK制約が信頼できる場合、結果はすぐにわかります。 そして、それが信頼されていない場合(を使用してFKを作成するときなどWITH NOCHECK)、SQL Serverはテーブルに移動して、値が実際に存在するかどうかを確認する必要があります。 他に使用することで失うものはありNOCHECKますか?

1
異なるテーブルからORDER BYを使用してTOP 1を選択するときにインデックス付きビューを設定する方法
次のシナリオでインデックス付きビューを設定して、2つのクラスター化インデックススキャンなしで次のクエリが実行されるようにしています。このクエリのインデックスビューを作成して使用するときはいつでも、私が付けたインデックスはすべて無視されるようです。 -- +++ THE QUERY THAT I WANT TO IMPROVE PERFORMANCE-WISE +++ SELECT TOP 1 * FROM dbo.TB_test1 t1 INNER JOIN dbo.TB_test2 t2 ON t1.PK_ID1 = t2.FK_ID1 ORDER BY t1.somethingelse1 ,t2.somethingelse2; GO テーブルの設定は次のとおりです。 2つのテーブル 上記のクエリによる内部結合で結合されている 上記のクエリでは、最初の列から、次に2番目のテーブルの列の順になっています。TOP 1のみが選択されています (以下のスクリプトには、問題の再現に役立つ場合に備えて、テストデータを生成する行もいくつかあります) -- +++ TABLE SETUP +++ CREATE TABLE [dbo].[TB_test1] ( [PK_ID1] [INT] IDENTITY(1, …

4
SQL Server評価版でSSISを開発することは可能ですか
をSQL Standard Server実装するためのの購入を検討していETL via SSISます。私たちにとっては非常に費用がかかるため、無料バージョンでSSISパッケージの開発をテストしたいと思います。エクスプレスバージョンにはSSISが統合されていないため、SQL Server 2014 の評価180 Expiresバージョンで試してみたいが、何も見つからない - Is it possible - Are there limitations. 誰か私をここで助けてもらえますか?
11 sql-server  ssis 

3
突然インデックスやクエリを変更する必要がある理由に答える方法
私は3年の経験を持つジュニアDBAです。私たちの仕事は、クエリを微調整するか、特定のコードを書き換えるか、インデックスが必要であることを開発者にアドバイスすることです。 開発チームが頻繁に尋ねる1つの簡単な質問は、「昨日は問題なく動作しましたが、何が突然変化しましたか?」です。インフラストラクチャの側面を確認するよう求められます。問題に対する最初の反応は、常に検証される最初のことであるインフラストラクチャに最大の責任を負わせることです。 開発チームからの「何が変わったのか」という質問にどのように答えればよいでしょうか?皆さんは今まで同じ状況に直面しましたか?もしそうなら、あなたの経験を共有してください。


2
特定の列に異なる値または複数の値を持つレコードのみを選択します
以下は私のメンバーシップ表の例です。電子メールフィールドに複数の値を持ついくつかのレコードがあります。複数のメール値を持つレコードのみを選択します。 メンバー表 ID LASTNAME FIRSTNAME EMAIL 567 Jones Carol carolj@gmail.com 567 Jones Carol caroljones@aol.com 678 Black Ted tedblack@gmail.com 908 Roberts Cole coleroberts@gmail.com 908 Roberts Cole coler@aol.com 908 Roberts Cole colerobersc@hotmail.com 結果を希望します: 567 Jones Carol carolj@gmail.com 567 Jones Carol caroljones@aol.com 908 Roberts Cole coleroberts@gmail.com 908 Roberts Cole coler@aol.com 908 Roberts Cole …
11 select  count  distinct 

1
HADR_SYNC_COMMITの奇妙なケースが待機する
私たちはHADR_SYNC_COMMIT、私たちの環境での待機の興味深いパターンに気づいています。3つのレプリカがあります。1つのプライマリ、1つの同期セカンダリ、および1つの非同期セカンダリがデータセンターにあり、さらに3つのASYNCレプリカを別のデータセンター(約2400マイル離れた場所)に追加しました。 それ以来、HADR_SYNC_COMMIT待機の大幅な増加に気づき始めました。アクティブなセッションを見るCOMMIT TRANSACTIONと、SYNCレプリカで待機しているクエリがたくさんあります スクリーンショットから、HADR_SYNC_COMMIT6月29日に待機が急増していることがはっきりとわかります。最終的に、7月1日の正午に、リモートデータセンターの3つの非同期レプリカのうち「2つ」をドロップしました。これにより、待ち時間も大幅に減少しました。 これまでに確認したこと–リモートレプリカのログ送信キュー、やり直しキュー、最終強化時間、最終コミット時間。営業時間中に小さなトランザクションのバーストが連続しているため、送信キューは特定のタイムスタンプ(60KBから1MBの間)でかなり小さくなっています。リモートレプリカはほぼ同期しています。レプリカ上の個々のlsnの最終コミット時刻と最終硬化時刻の差はほとんどありません。 ネットワークパイプは10Gであり、送信バッファーサイズを256 MBから2 GBに変更しました。これは、ネットワークがパケットをドロップして再送信しているという前提の下で行われました。どちらの方法でもあまり役に立たないようです。 では、ASYNCレプリカはHADR_SYNC_COMMIT待機とどう関係しているのでしょうか。SYNCレプリカはこの待機タイプに単独で依存するべきではありません。ここで何が欠けていますか?

1
PostgresでのUPDATE / INSERTの組み合わせのロック
テーブルが2つあります。1つはログテーブルです。もう1つには、基本的に1回しか使用できないクーポンコードが含まれています。 ユーザーはクーポンを利用できる必要があります。これにより、ログテーブルに行が挿入され、クーポンが使用済みとしてマークされます(used列をに更新することによりtrue)。 もちろん、ここには明らかな競合状態/セキュリティ問題があります。 私は過去にもmySQLの世界で同様のことをしたことがあります。その世界では、両方のテーブルをグローバルにロックし、これは一度に1回だけ発生する可能性があるという知識のもとでロジックを安全に実行し、完了したらテーブルのロックを解除します。 Postgresでこれを行うより良い方法はありますか?特に、ロックがグローバルであることを心配していますが、グローバルである必要はありません。他の誰かがその特定のコードを入力しようとしていないことを確認するだけでよいので、行レベルのロックが機能するでしょうか?


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