データベース管理者

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


3
ストアドプロシージャと生のクエリの効率
私はこの議論の両側で多くを読みました:生のクエリではなくストアドプロシージャのみを使用することで得られるパフォーマンスの大幅な向上はありますか?私は特にSQL Serverに興味がありますが、ありとあらゆるデータベースに興味があります。

5
クエリチューニングはプロアクティブかリアクティブか
ソフトウェア開発者および意欲的なDBAとして、SQL Serverデータベースを設計するときにベストプラクティスを取り入れようとしています(ソフトウェアがSQL Serverの上に置かれる時間の99%)。開発前および開発中に可能な限り最高の設計を行います。 ただし、他のソフトウェア開発者と同様に、機能、バグ、および変更/作成されたデータベースオブジェクトを必要とする要件の変更が追加されています。 私の質問は、クエリのチューニングはプロアクティブかリアクティブですか?言い換えれば、コード/データベースの大幅な変更の数週間後、クエリのパフォーマンスをチェックし、それに基づいてチューニングするために1日だけを確保する必要がありますか?それが実行されているように見える場合であっても大丈夫? または、平均以下のパフォーマンスはデータベースチェックであり、ことわざにある黒板に戻るべきであることに注意する必要がありますか? クエリのチューニングには多くの時間がかかる可能性があり、データベースの初期設計によっては、メリットが最小限になる場合があります。私は受け入れられている手口について興味があります。

2
ON句の位置は実際にはどういう意味ですか?
通常のJOIN ... ON ...構文はよく知られています。ただし、対応するON句とは別に句を配置することもできJOINます。これは、実際にはめったに見られないものであり、チュートリアルにはありません。また、これが可能であると言及しているWebリソースも見つかりませんでした。 ここで遊ぶスクリプトは次のとおりです。 SELECT * INTO #widgets1 FROM (VALUES (1), (2), (3)) x(WidgetID) SELECT * INTO #widgets2 FROM (VALUES (1, 'SomeValue1'), (2, 'SomeValue2'), (3, 'SomeValue3')) x(WidgetID, SomeValue) SELECT * INTO #widgetProperties FROM (VALUES (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')) x(WidgetID, PropertyName) --q1 SELECT w1.WidgetID, w2.SomeValue, wp.PropertyName …
23 sql-server  t-sql 

2
「包含」データベースを復元する方法は?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、データベース管理者のStack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 最近、ネットワークインスタンスからバックアップをローカル開発SQL Serverに復元しようとしました。驚いたことに、次のエラーメッセージが表示されました。 メッセージ12824、レベル16、状態1、行3 sp_configure値 'contained database authentication'は、包含データベースを復元するために1に設定する必要があります。value_in_useを設定するには、RECONFIGUREを使用する必要がある場合があります。メッセージ3013、レベル16、状態1、行3 RESTORE DATABASEが異常終了しています。 データベースを正常に復元するには、どの手順に従う必要がありますか?

3
SQLSERVERAGENT仮想アカウントへのファイルシステムアクセスを許可する
この質問でNT Service\SQLSERVERAGENTマークされた回答に基づいて、Windowsアカウントのファイルシステムアクセスを許可しようとしています。これは仮想サービスアカウントであり、コントロールパネル->ユーザーアカウント領域には表示されないと思います。 このサービスアカウントにファイルシステムへのアクセスを許可するにはどうすればよいですか?具体的には、Windows 7。 私はいくつかのアプローチを読みましたが、私には選択肢がないようです。PowerShellのアプローチを試しましたが、ADコマンドは有効なコマンドではありませんでした。これらのコマンドに必要なWindowsパッチをダウンロードしてインストールしました。また、SQL Server構成マネージャーまたはManagement Studioを介してこれを行うことができるはずであることも読みました。ただし、これらのアクセス許可を調整する場所はわかりません。 SQL Serverエージェントプロセスの開始に失敗し、次のエラーメッセージが表示されます。 Login failed for user 'NT SERVICE\SQLSERVERAGENT'. Reason: Failed to open the explicitly specified database 'msdb'. [CLIENT: <local machine>] 私のグーグルに基づいて、それはこのアカウントの許可に関係しています。 データベースが破損しているかどうかはわかりませんが、データベースが正常な状態にあると表示されます。SQL Serverエージェントのログインは、sysadminとpublicグループの一部です。

2
postgresから行を一括削除する最も効率的な方法
私はPostgreSQLから大量の行を削除する最も効率的な方法は何だろうと思っています。このプロセスは、テーブルにデータ(挿入と削除のデルタ)を一括インポートするための毎日の定期的なタスクの一部になります。削除する行は数千、場合によっては数百万になる可能性があります。 1行に1つの主キーのファイルがあります。私が考えていた2つの選択肢は以下のようなものでしたが、PostgreSQLの内部について十分な知識がなく、十分な情報を得た上で最善の判断を下すことができません。 主キーを使用DELETEして、ファイル内の各行に対してクエリを実行しますWHERE(またはn、IN()句を使用してバッチで削除をグループ化します)。 COPYコマンドを使用して主キーを一時テーブルにインポートし、結合を使用してメインテーブルから削除する どんな提案でも大歓迎です!

3
実行計画で統計が欠落している場合の警告
私には理解できない状況があります。SQL Serverの実行計画では、テーブルの統計が欠落していると表示されますが、統計は既に作成されています。 しかし、テーブルを見ると、自動的に作成された統計があることがわかります。 誰かがそれがどのようになり得るかを理解するのを助けることができますか? Auto_UpdateおよびAuto_Create統計は、現在のDBでオンになっています。 SQL Server 2014を使用しています。


3
「SARGable」という言葉はどういう意味ですか?
SQL Serverユーザーは、「sargable」という用語を使用します。「sargable」の客観的な実装に依存しない時代を超越した定義があるかどうか疑問に思っています。 たとえば、WHERE foo LIKE '%bar%'多くの人からsargableではないと言われていますが、一部のRDBMS はそのようなクエリでインデックスを使用できます。その後、何「検索引数可能ではない」意味ですか? その他の参考文献 SQLステートメントをsargableにするのはなぜですか?

2
既存の非パーティションテーブルをパーティション化する方法
データのある既存のテーブルがあります: dbo.Test (col1,col2,col3....) ON [PRIMARY] このようにパーティション分割されるようにこのテーブルを変更する必要があります。 dbo.Test(col1,col2,col3....) ON Ps_Date(Col2) テーブルをドロップして再作成せずにこれを達成するにはどうすればよいですか?

1
行を削除すると、非クラスター化インデックスがより多くのスペースを使用するのはなぜですか?
75億行と5つのインデックスを持つ大きなテーブルがあります。約1,000万行を削除すると、非クラスター化インデックスが格納されているページ数を増やすように見えることに気付きました。 私はdm_db_partition_statsページの違いを報告するためのクエリを書きました(後-前): インデックス1はクラスター化インデックス、インデックス2は主キーです。その他は非クラスター化され、一意ではありません。 これらの非クラスター化インデックスでページが増えているのはなぜですか? 数値は最悪でも同じままになると予想していました。 削除中にパフォーマンスカウンターがページ分割の増加を報告するのを見ます。 削除するとき、ゴーストレコードは別のページに移動する必要がありますか?これは「一意性」と関係がありますか? 私たちはRCSIの展開を進めていますが、現在、RCSIはオフになっています。 これは、可用性グループのプライマリノードです。私はスナップショットがセカンダリで何らかの形で使用されていることを知っています。それが関連していた場合、私は驚くでしょう。これを掘り下げて(dbccページの出力を調べて)詳細を調べる予定です。誰かが似たようなものを見たことを願っています。

3
サーバーの再起動後にSQL Server分散可用性グループデータベースが同期しない
SQL Serverで大規模なアップグレードを実行する準備ができており、先に進む前に解決しようとしている分散可用性グループの異常な動作に気付いています。 先月、リモートセカンダリサーバーをSQL Server 2016からSQL Server 2017にアップグレードしました。このサーバーは、複数の分散可用性グループ(DAG)と個別の可用性グループ(AG)の一部です。このサーバーをアップグレードしたときに、サーバーが読み取り不能な状態になることを認識していなかったため、この1か月間はプライマリサーバーのみに依存していました。 今後のアップグレードの一環として、CU 4パッチをサーバーに適用し、再起動しました。サーバーがオンラインに戻ったとき、パッチを適用したばかりのセカンダリは、すべてのDAG / AGが問題なく同期していることを示しました。 ただし、プライマリーは非常に異なるストーリーを示していました。報告していた 別のAGが問題なく同期していた しかし、DAGは非同期/非正常状態でした 最初にパニックに陥った後、次のことを試みて、DAGで再び同期を取りました。 プライマリから、データの移動を停止して再開しました。これはデータの同期を開始しませんでした。 セカンダリ(パッチを適用したばかりの)ALTER DATABASE [<database] SET HADR RESUME;で実行しました-エラーなしで実行されますが、同期は再開されませんでした データを再び同期する最後の試みは、セカンダリにログインし、SQL Serverサービスを手動で再起動することでした。サービスを手動で再起動するのは少し極端に思えます。サーバーを再起動すれば十分だったと思うからです。 再起動後にDAGがセカンダリへの同期を開始しないという問題に誰かが遭遇しましたか?もしそうなら、それはどのように解決されましたか? SQL Serverのエラーログとセカンダリサーバーのイベントビューアーの両方を確認しましたが、目に見える異常はありませんでした。

4
インデックススペースをデータスペースより大きくするのは悪いですか?
多くの場合、適切なインデックスを持たない大きなテーブルに対してクエリを実行する必要があります。そこで、DBAにそのようなインデックスを作成するように依頼します。彼が最初に行うことは、テーブル統計とインデックススペースのサイズを確認することです。 「インデックスはすでにテーブルよりも大きい」ため、多くの場合、代替ソリューションを見つけるように言われます。彼は、インデックスをデータよりも小さくする必要があると感じています。「本でインデックスを見たことがありますか?本自体よりもはるかに小さいので、テーブルインデックスがどうあるべきか」と私に言ったからです。 彼の哲学は正しいとは思わないが、彼は主任DBAであり、私は開発者だから挑戦できない。クエリにインデックスが必要な場合は、読み取り不可能で維持できないSPを作成する「回避策」を見つけるのではなく、インデックスを作成する必要があります。 必要な列のみを選択しています。問題は、日付でフィルタリングしているため、エンジンが列を一致させるために必ずテーブルスキャンを実行することです。クエリは、統計を収集するために1日に1回、夜に実行されますが、実行には15分かかります(別の厳格なルールがあります。手順は3分以上かかりません)。 DBAはインデックスの統計を教えてくれました。そのテーブルには約10個のインデックスがあり、そのうち6個しか使用されていませんでした(統計では4個のヒットがゼロでした)。これは20人以上の開発者が参加する大規模なシステムです。インデックスは何らかの理由で作成されたため、おそらく使用されなくなりました。 SQL Server 2008をサポートする必要があります。これは、テストDBが実行されているためです。ただし、クライアントはすべて2014年と2016年です。
22 sql-server  index 

2
トリガーは毎回コンパイルされますか?
CPU使用率が高いサーバーのトラブルシューティングを行っています。クエリが実際に原因ではないことがわかった後、コンパイルを検討し始めました。 パフォーマンスモニターは、50コンパイル/秒未満および15再コンパイル/秒未満を示しています。 XEセッションを実行してコンパイルを探した後、毎秒数千のコンパイルが発生しています。 このシステムは、トリガーを使用して変更を監査しています。ほとんどのコンパイルはトリガーによるものです。トリガーはsys.dm_tran_active_transactionsを参照します。 最初に考えたのは、トリガーでDMVを参照すると毎回コンパイルされるか、この特定のDMVだけでトリガーされる可能性があるということでした。それで、私はその理論をテストし始めました。毎回コンパイルしますが、DMVを参照せず、代わりに値をハードコードするときにトリガーがトリガーされるたびにコンパイルされるかどうかはチェックしていませんでした。トリガーされるたびにコンパイルされていました。トリガーをドロップすると、コンパイルが停止します。 XEセッションでsqlserver.query_pre_execution_showplanを使用してコンパイルを追跡しています。なぜそれとPerfMonカウンターの間に矛盾があるのですか? トリガーが実行されるたびにコンパイルイベントを取得するのは正常ですか? 再現スクリプト: CREATE TABLE t1 (transaction_id int, Column2 varchar(100)); CREATE TABLE t2 (Column1 varchar(max), Column2 varchar(100)); GO CREATE TRIGGER t2_ins ON t2 AFTER INSERT AS INSERT INTO t1 SELECT (SELECT TOP 1 transaction_id FROM sys.dm_tran_active_transactions), Column2 FROM inserted; GO --Both of these show compilation …

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