データベース管理者

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

4
SQL Serverクエリストア-「アドホック」クエリとは何ですか?
私はSQL Serverクエリストアについて詳しく調べており、「アドホック」クエリへの参照をよく目にします。ただし、クエリストアがアドホッククエリを決定する方法を確認していません。パラメータのないクエリまたは1回だけ実行されたクエリであると推測できる場所を見てきました。このための正式な定義はありますか?一般的な意味ではありません。つまり、クエリストアに関連しています。 例として、このページはクエリストアからアドホッククエリを削除する例を示していますが、使用している条件は実行カウントが1つしかないようです。これは、アドホッククエリの奇妙な定義のようです。ところで、ページに移動する場合は、「アドホッククエリの削除」を検索してください。

1
誰が私のワーカースレッドを使用していますか?SQL Server 2014-HADR
最近、SQL Server 2014 HADR環境で問題が発生し、サーバーの1つでワーカースレッドが不足しました。 メッセージを受け取りました: AlwaysOn可用性グループのスレッドプールは、利用可能なワーカースレッドが十分にないため、新しいワーカースレッドを開始できませんでした。 問題を分析するのに役立つ(と思った)ステートメントを取得するために、別の質問を既に開いています(どのSPIDがどのスケジューラー(ワーカースレッド)を使用しているかを確認できますか?)。システムを使用しているスレッドを見つけるためのクエリを取得しましたが、サーバーがワーカースレッドを使い果たした理由がわかりません。 私たちの環境は次のとおりです。 4 Windows Server 2012 R2 SQL Server 2014エンタープライズ 24プロセッサ-> 832ワーカースレッド 256 GB RAM 12個の可用性グループ(全体) 642データベース(全体) したがって、問題が発生したサーバーには次の構成がありました。 5つの可用性グループ(3つのプライマリ/ 2つのセカンダリ) 325データベース(127プライマリ/ 198セカンダリ) MAXDOP = 8 Cost Threshold for Parallelism = 50 電源プランは「高パフォーマンス」に設定されています この問題を「解決」するために、1つの可用性グループをセカンダリサーバーに手動でフェールオーバーしました。そのサーバーの構成は次のとおりです。 5つの可用性グループ(2つのプライマリ/ 3つのセカンダリ) 325データベース(77プライマリ/ 248セカンダリ) 私はこのステートメントで利用可能なスレッドを監視しています: declare @max int select @max = …

2
関連しない列は、selectステートメントのクエリ時間に影響しますか?
気になるだけです。 100万レコード/行のテーブルがあるとします。 select order_value from store.orders そのテーブルに実際のクエリ時間で1つのフィールド、2つのフィールド、または100のフィールドがあるかどうかに違いはありますか?「order_value」以外のすべてのフィールドを意味します。 現在、私はデータウェアハウスにデータをプッシュしています。「将来、いつか使用される可能性がある」フィールドをテーブルにダンプすることがありますが、現時点では、何も照会されていません。これらの「無関係な」フィールドは、それらを含まないselectステートメントに直接または間接的に影響しますか(いいえ*意味します)?

1
Pythonで取得したSQL Server VARCHAR列のエンコードの問題
最近、SQL Serverでvarchar(120)として保存されているフィールドに関連するエンコーディングに問題がありました。SSMSでは、varcharは次のように表示されます。 「ジョンベンを殺したのは誰?」 ただし、Pythonに取り込むと、次のようになります。 私はこれをPython側から調査しましたが、奇妙なことは何も起こっていません。私の理論では、SQL Serverのvarcharは、PythonではSSMSとは異なる方法で表示されるUTF-8文字を受け入れます。SQL Serverでのエンコードについてはあまり詳しくありません。誰かが私に次のことを知らせてくれますか? SSMSでvarcharのエンコーディングを表示する方法はありますか?たとえば、現在SSMSからのコンマを表示する代わりに、\ x82を参照してください。 SQL Server 2008を使用しています。インポート/エクスポートツールを使用したり、フラットファイルにダンプしたりせずに、UTF-8文字のエンコードをASCII文字に変更する方法はありますか?つまり、クエリを介してこの変換を行うことができますか? クエリを介してプログラムで問題のあるレコードを特定する方法はありますか(問題は、ASCIIではサポートされていないUTF-8文字として定義されています)。 前もって感謝します! 使用sp_help N'table_name';して、このVARCHAR列の照合順序は次のとおりSQL_Latin1_General_CP1_CI_ASです。


1
READPASTヒントにより、インデックス付きビューが無視されるのはなぜですか?
このREADPASTヒントを使用して、アプリケーションの金融サブシステムのリソースロックを削減することを調査しています。 金融取引記録は追加されるだけで、更新または削除されることはないため、良い方法のように思えました。スキップされる行は、トランザクション内に挿入された新しい行のみです。トランザクションがコミットされるまで、それらは事実上外界には存在しません。 ただし、READPASTヒントを付けたインデックス付きビューを使用するクエリのパフォーマンスが低下していることに気付きました。クエリプランを比較すると、ヒントのように見えます。クエリオプティマイザーは、インデックス付きビューを使用しないことを選択し、代わりに通常のビューのように扱います。 それがなぜかはわかりません。インデックス付きビューは、操作中にキーをロックでき、追加READPASTも同様に機能するという点で、他のインデックスと同じだと思います。 SELECT TOP 1 isa.InvoiceId FROM Financial_InvoiceSummaryAmounts isa WITH (READPAST) WHERE isa.TotalOwedAmount = 0.0 SELECT TOP 1 isa.InvoiceId FROM Financial_InvoiceSummaryAmounts isa WHERE isa.TotalOwedAmount = 0.0 NOEXPANDヒントの追加も機能するようですREADPASTが、クエリオプティマイザーがそもそもなぜ(完全な回答の一部として)選択したのか、おそらくその理由について詳しく知りたいと思います。

1
SQL Serverが複合列統計ヒストグラムを実行しないのはなぜですか?
SQL Serverには「マルチカラム統計」と呼ばれるものがありますが、それが意味するものとは異なります。 次のサンプルテーブルを見てみましょう。 CREATE TABLE BadStatistics ( IsArchived BIT NOT NULL, Id INT NOT NULL IDENTITY PRIMARY KEY, Mystery VARCHAR(200) NOT NULL ); CREATE NONCLUSTERED INDEX BadIndex ON BadStatistics (IsArchived, Mystery); これで、2つの統計が2つのインデックスで作成されています。 BadIndexの統計: +--------------+----------------+-------------------------+ | All density | Average Length | Columns | +--------------+----------------+-------------------------+ | 0.5 | 1 | IsArchived …

2
SQL Server 2014でのフルスキャンによる統計の更新では100%のCPUを使用し、2008 R2では15%を使用します
フルスキャンの更新統計では、SQL Server 2008 R2でCPUの20%を使用しているのに、同じテーブルで同様のハードウェア機能を使用しているのに、SQL Server 2014でCPUの100%を使用するのはなぜですか? 私はMAXDOP他のオプションを検討してきましたが、特に目立つものは何もありません。これを引き起こす可能性のある設定があることは承知していますが、設定は両方のデータベースで非常に似ています(たとえば、MAXDOP両方とも4で、両方に複数のコアがあります)。どちらもEnterprise Editionです。 これを説明できるSQL Server 2014とSQL Server 2008 R2で「異なる」ものはありますか?どちらのサーバーでも、メモリオプションは90%です。何を探すべきかについての考えはありますか? SQL Server 2008 R2 / SP3とSQL Server 2014 / SP2を使用する2台のサーバーで、フル(100%)スキャンによる統計更新を週に1回実行します。データベースの構造は同じです。2008 R2サーバーでは、2つの非常に大きなテーブルの統計の更新に数時間かかりますが、これは予想どおりですが、CPUは使用率全体で20%未満にとどまります。ただし、2014サーバーでは、CPUは約40分間100%になります。2014サーバーではテーブルが少し小さくなっています。SQLモニターの分析メニューを使用してこれを確認します。 2014 SQL ServerのOlaログファイルの出力は次のとおりです。CPUは、約2:10から2:45まで100%になります。 Date and time: 2017-06-24 02:10:20 Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000005_15502E78] WITH FULLSCAN Outcome: Succeeded Duration: 00:07:48 Date and time: 2017-06-24 02:18:08 Date …

3
100以上のクライアントDBからのデータを一元化されたレポートデータベースに統合する方法に関するアドバイスを探す
私は小規模な(従業員数50人まで)SaaS企業のSQL開発者(DBAまたはアーキテクトではありません)です。私は次の方法を理解する必要があります。 100以上のOLTPデータベースから運用レポートをオフロード これらのレポートを複数のクライアントデータベースのデータに対して実行できるようにする 将来的に分析ベースのソリューションを提供するように当社を位置づける トランザクションレプリケーション(特に多対1 /中央サブスクライバーモデル)、SQLサービスブローカー、ログ配布、変更追跡(CT)、および変更データキャプチャ(CDC)などのさまざまなテクノロジに関する記事をいくつか読んだことがあります。これは企業専用です)、どの経路が最適かはわかりません。 統合に関する専門知識をお持ちの方が、私たちと同様の設定に出会い、成功への道筋を示したり、役立つリソースに案内したりできることを願っています。 コストの制約により、このソリューションはSQL Server Standard Edition内で機能する必要があります。また、このソリューションは、小規模な組織内でサポート/維持するために合理的でなければなりません。 基本構成: 現在、100を超える個別のクライアントデータベースがあり、ほとんどがデータセンターのSQLサーバーに展開されていますが、一部はリモートアクセス可能なデータセンター内のクライアントサーバーに展開されています。これらはすべてSQL Server 2008 R2データベースですが、近日中にSQL 2016にアップグレードする予定です。 データベースプロジェクトとdacpacsを使用して、統合されるすべてのクライアントデータベースでスキーマが同じになるようにします。ただし、すべてのクライアントに同時に新しいバージョンへのアップグレードを強制するわけではないため、アップグレード間でスキーマが異なる場合があります。ソリューションは、クライアントAがソフトウェアバージョン1.0にあり、クライアントBがバージョン1.1にある場合に中断しないように十分に柔軟でなければなりません。 運用レポートは現在、各クライアントのOLTPデータベースから直接実行されます。これをオフロードしない場合、アプリケーションのパフォーマンスに与える影響を懸念しています。 高レベルの要件: 私たちのクライアントは、病院の無菌処理部門(SPD)で、これまでに処理したもの、在庫がある場所などに関する最新のレポートが必要です。SPDは、週末と休日を含め、24時間体制で在庫を処理します。この取り組みの主な目的の1つは運用レポートをより適切にサポートすることであるため、クライアントのニーズに対応し続けるために、データをできる限りリアルタイムに近づけることを望んでいます。 現在、実際には同じ病院システムの一部である個別のデータベースにいくつかのSPDがあります。これらのクライアントは、システム内のすべてのSPDに対してレポートを作成する機能を求めています。 戦略的に言えば、社内の分析イニシアチブをサポートするために、すべてのクライアントのデータを簡単に集約できる機能が必要です。収集した運用データをデータマート/倉庫のソースとして使用できることが期待されます。 これまでの考え: トランザクションレプリケーションは、最も「リアルタイム」なソリューションを提供するようです。この応答が特に役立つことがわかりましたが、スキーマの違いが生じる可能性があるため、SQL Serverの多対1レプリケーションが機能しないことを懸念しています。 クエリがアクティブな間はログを復元できないので、ログ配布は理想的に聞こえません。ログを復元できるようにするには、全員を追い出す必要があります。そうしないと、データが古くなります。この方法が複数のデータベースからのデータを一元化するために使用できるかどうかは不明です。出荷される各ログは、それが由来する個々のデータベースに関するもののみであるためです。 SQLサービスブローカーを使用する場合、キューが処理するメッセージの数に対応できなかった場合、レイテンシは予測できない場合があります。 CTは、各テーブル行のバージョンのみを識別します。レイテンシは、データを取得して中央リポジトリに挿入するために、各データベースに対してSSISパッケージのようなものをどれだけ速く処理できるかに依存します。 各データベースを個別にレプリケートすることを検討する必要があり、その後、ある種のデータ仮想化手法を使用して、さまざまなレプリケートされたソースからのデータを組み合わせる必要があるでしょうか。 あなたが提供したいアドバイスや指示があれば、大歓迎です。

3
format()は非決定的な組み込みの文字列関数です…
これに関するドキュメントの欠如に関する接続項目を投稿する前に、誰かが私がここで単に何かを見落としているのではないことを確認しますか? format文字列関数としてリストされているドキュメントページで: 「すべての組み込み文字列関数は確定的です。」- 文字列関数(Transact-SQL) format関連ページで非決定的であることについての言及もありません: 決定論的および非決定論的関数 FORMAT(Transact-SQL) ただし、永続的な計算列を作成しようとすると、次のようになります。 create table t (date_col date); insert into t values (getdate()); alter table t add date_formatted_01 as format(date_col,'YYYY') persisted; 次のエラーを返します。 列が非決定的であるため、テーブル 't'の計算された列 'date_formatted_01'は永続化できません。 ドキュメントには、 カルチャー引数が指定されていない場合、現在のセッションの言語が使用されます。 しかし、文化の議論を追加しても、状況は変わりません これも失敗します alter table t add date_formatted_02 as format(date_col, 'd', 'en-US' ) persisted rextesterデモ:http ://rextester.com/ZMS22966 dbfiddle.ukデモ:http ://dbfiddle.uk/?rdbms=sqlserver_next&fiddle=7fc57d1916e901cb561b551af144aed6
10 sql-server 

2
Tablockヒントがデッドロックをトリガーする
最小限のログを使用して、2つのデータセットを空のヒープテーブルに挿入しました。これは、次の形式のSQLで並列実行されている2つのSQL実行タスクを使用して行われました。 INSERT INTO Table (TABLOCK) SELECT FROM ... ジョブが少しハングした後、SQLタスクの1つがデッドロックの犠牲になりました。以下は、デッドロックグラフのXML出力です。 誰かが内部で何が起こっていたか説明できますか? <resource-list> <objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746"> <owner-list> <owner id="process9609dc8" mode="Sch-S"/> <owner id="process9609dc8" mode="IX"/> </owner-list> <waiter-list> <waiter id="process5e13048" mode="X" requestType="convert"/> </waiter-list> </objectlock> <objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746"> <owner-list> <owner id="process5e13048" mode="Sch-S"/> <owner id="process5e13048" …

1
SQL Server 2016のテーブル命名規則とポリシー管理に関する問題
SQL Server 2012では、テーブル名にスペースを使用できないようにポリシーを設定していました。しかし、SQL Server 2016で同じポリシーを使用すると、エラーが発生します。 条件のコードは次のとおりです。 DECLARE @condition_id INT EXEC msdb.dbo.sp_syspolicy_add_condition @name=N'No Spaces', @description=N'No spaces in table names.', @facet=N'IMultipartNameFacet', @expression=N'<Operator> <TypeClass>Bool</TypeClass> <OpType>NOT_LIKE</OpType> <Count>2</Count> <Attribute> <TypeClass>String</TypeClass> <Name>Name</Name> </Attribute> <Constant> <TypeClass>String</TypeClass> <ObjType>System.String</ObjType> <Value>% %</Value> </Constant> </Operator>', @is_name_condition=4, @obj_name=N'% %', @condition_id=@condition_id OUTPUT SELECT @condition_id ポリシーのコードは次のとおりです。 DECLARE @object_set_id INT EXEC msdb.dbo.sp_syspolicy_add_object_set @object_set_name=N'Table Names_ObjectSet', @facet=N'IMultipartNameFacet', …

1
SQL Serverはクエリの計算値をキャッシュしますか?
このタイプのクエリに遭遇するたびに、SQL Serverがどのように機能するかを常に疑問に思っています。私は計算を必要とし、その後、例えば、複数の場所でその値を使用したクエリのいずれかのタイプを実行した場合selectとorder by、SQL Serverは、行ごとに二回、それが計算されますかそれがキャッシュされますか?さらに、これはユーザー定義関数でどのように機能しますか? 例: SELECT CompanyId, Count(*) FROM Sales ORDER BY Count(*) desc SELECT Geom.BufferWithTolerance(@radius, 0.01, 0).STEnvelope().STPointN(1).STX, Geom.BufferWithTolerance(@radius, 0.01, 0).STEnvelope().STPointN(1).STY FROM Table SELECT Id, udf.MyFunction(Id) FROM Table ORDER BY udf.MyFunction(Id) それをより効率的にする方法はありますか、それともSQL Serverはそれを処理するのに十分スマートですか?
10 sql-server 

1
スーパーセットのみを選択
次のコマンドで作成できる2つのテーブル(非クラスター化インデックスと共に)があります。 CREATE TABLE GroupTable ( GroupKey int NOT NULL PRIMARY KEY, RecordCount int NOT NULL, GroupScore float NOT NULL ); CREATE TABLE RecordTable ( RecordKey varchar(10) NOT NULL, GroupKey int NOT NULL, PRIMARY KEY(RecordKey, GroupKey) ); CREATE UNIQUE INDEX ixGroupRecord ON RecordTable(GroupKey, RecordKey); 技術的にはテーブルが少し異なり、他のいくつかのテーブルに参加していますが、これは私の状況に適したプロキシです。 GroupKeys別のサブセットではないものをすべて選択したいGroupKey。 特定のスーパーセットについて、GroupScoreすべてのサブセット(それ自体を含む)の最大値を取得したいと思います。 a GroupKeyにRecordKeys別のとまったく同じものが含まれている場合GroupKey(s)、そのうちの1つだけGroupKeysが取得されます(どちらを使用してもかまいません)。 別のものとGroupKeyまったく同じであるものはすべて同じになります。RecordKeysGroupKey(s)GroupScore 非関連GroupKeysも同じスコアを持つことができます。 …

2
クラスタ化インデックスの作成がテーブルの作成に失敗する
次のスクリプトを実行するとエラーが発生します。 IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='Table_Name') BEGIN CREATE TABLE Table_Name ( Field_Name_1 binary(32) NOT NULL CONSTRAINT PK_Name_Goes_Here PRIMARY KEY NONCLUSTERED , Field_Name_2 int NOT NULL , Field_Name_3 datetime NOT NULL INDEX IX_Name_Goes_Here CLUSTERED ) END 特に、次のエラーをスローするクラスター化インデックスの作成です。 メッセージ1018、レベル15、状態1、行15 「INDEX」付近の構文が正しくありません 。これがテーブルヒントの一部として意図されている場合、WITHキーワードと括弧が必要になりました。適切な構文については、SQL Server Books Onlineを参照してください。 特定のQAサーバーを除くすべてのサーバーで機能するため、これは奇妙です。私たちが行った修正は、テーブル作成ステートメントの外でクラスター化インデックスを作成することですが、誰かが以前にこの問題に遭遇したことがあれば、興味がありますか?

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