タグ付けされた質問 「sql-server」

Microsoft SQL Serverのすべてのバージョン(MySQL以外)。sql-server-2016のようなバージョン固有のタグも追加してください。これは、質問に関連することが多いためです。

1
一時テーブルを作成するストアドプロシージャの最後で一時テーブルを切り捨てるのはなぜですか?
SQL Serverは、ストアドプロシージャ内で作成された一時テーブルをキャッシュし、プロシージャが終了してその後実行されるときにそれらの名前を変更するだけです。私の質問は、tempdbスペースがいつ解放されるかに関するものです。手順の最後でテーブルが切り捨てられることを読みました。これはセッションごとに処理されることをコメントで読んでおり、クリーンアップが必要かどうかについての質問がMSDNで回答されています。しかし、同じセッションで2回実行されない場合はどうでしょうか? また、テーブルが範囲外になるとその領域を解放するバックグラウンドガベージコレクションプロセスがあることも聞いたことがあります。 それを作成するストアドプロシージャの最後で一時テーブルを切り捨てると、逆の期待にもかかわらず、truncateステートメントが使用されていない場合よりも、テーブルがtempdbでデータ用に使用するスペースがより速く解放されるようです。どうして? そのような切り捨てステートメントを使用するかどうかの相対的なパフォーマンスへの影響はどうなりますか?SNAPSHOT分離を使用する場合、tempdbにストレスがかかることがよくあります。tempdbで使用されているスペースをできるだけ大きなtempテーブルからできるだけ早く解放すると、tempdbの不必要な増大を防ぐことができると思います。この潜在的なスペース節約は、パフォーマンスを犠牲にして実現されるでしょうか? 以下に、問題を再現するためのコードを示します(主に@TheGameiswarから、いくつかの変更を加えたものです)。 SET NOCOUNT ON; GO ALTER PROC usp_test AS BEGIN IF object_id('tempdb..#temp') IS NOT NULL DROP TABLE #temp SELECT * INTO #temp FROM [dbo].[Event_28] -- This is a table with 15313 rows, using 35648 KB according to sp_spaceused --SELECT SUM(user_object_reserved_page_count) AS [user object pages used] …

3
SQL Serverは、コミットされていない操作を記録しますか?
私は頻繁にSQLサーバーのログレコードのようなステートメントがすべてのtransctionとopeationを見ます。 しかし、トランザクションが最終的にロール バックされるときに何が起こるかについて私は混乱しています。 :明示的なトランザクションは3文があると言うstatement A、statement B、statement C、そして最後にrollback statement D。 ここで、実行がに達していない場合、SQLサーバーログに記録されrollback statement Dた変更statements A through Cは記録されますか? 理解1: ステートメントAからDはすべて記録されます。SQL Serverは、何があってもすべてを記録します。 理解2:変更はメモリのどこかにのみ保存され、SQL Serverがcommitステートメントを認識したときにのみログに記録されます。rollbackステートメントであることが判明した場合、SQL Serverは単純にトランザクションを無視します。目的を果たさないため、ログへの書き込みは発生しません。ある場合、他の言葉では、SQL Serverがログに記録し、正味の結果の前と後の取引が。 少なくとも私には両方とも論理的に思えますが、両方とも正しいとは言えません。助けてくれてありがとう。
12 sql-server 

5
前の月末値に基づいて欠落データを入力する
次のデータが与えられた場合: create table #histories ( username varchar(10), account varchar(10), assigned date ); insert into #histories values ('PHIL','ACCOUNT1','2017-01-04'), ('PETER','ACCOUNT1','2017-01-15'), ('DAVE','ACCOUNT1','2017-03-04'), ('ANDY','ACCOUNT1','2017-05-06'), ('DAVE','ACCOUNT1','2017-05-07'), ('FRED','ACCOUNT1','2017-05-08'), ('JAMES','ACCOUNT1','2017-08-05'), ('DAVE','ACCOUNT2','2017-01-02'), ('PHIL','ACCOUNT2','2017-01-18'), ('JOSH','ACCOUNT2','2017-04-08'), ('JAMES','ACCOUNT2','2017-04-09'), ('DAVE','ACCOUNT2','2017-05-06'), ('PHIL','ACCOUNT2','2017-05-07') ; ...特定のユーザーがいつアカウントに割り当てられたかを表します。 毎月の最終日に特定のアカウントを誰が所有したかを確認しようとしています(割り当てられた日付はアカウントが所有権を譲渡した日付です)、不足している月末が入力されてdatesいます(利用可能な便利なテーブルから作成される可能性があります)有用な列を使用してDateKey、DateおよびLastDayOfMonth[[@AaronBertrandの提供])1。 望ましい結果は次のとおりです。 PETER, ACCOUNT1, 2017-01-31 PETER, ACCOUNT1, 2017-02-28 DAVE, ACCOUNT1, 2017-03-31 DAVE, ACCOUNT1, 2017-04-30 FRED, ACCOUNT1, 2017-05-31 FRED, ACCOUNT1, …

3
並列処理(パーティションストリーム)演算子が行の推定値を1に減らすのはなぜですか?
SQL Server 2012 Enterpriseを使用しています。私は完全に直感的ではないいくつかの動作を示しているSQLプランに出会いました。大量のパラレルインデックススキャン操作の後、パラレル化(パーティションストリーム)操作が発生しますが、インデックススキャン(Object10.Index2)によって返される行の推定値を強制終了し、推定値を1に減らします。この振る舞いを説明するものに出会ったことはありません。クエリは非常に単純ですが、各テーブルには数百万のレコードが含まれています。これはDWHロードプロセスの一部であり、この中間データセットは何度も触れられますが、私が抱えている問題は、特に行の見積もりに関連しています。正確な行の推定値が並列処理(パーティション分割)演算子内で1になる理由を説明できますか?また、 計画を貼り付けるために完全な計画を投稿しました。 問題の操作は次のとおりです。 コンテキストを追加する場合に備えてプランツリーを含める: Paul Whiteが提出したこのConnectアイテムのバリエーションにぶつかることはありますか(彼のブログでさらに詳しく説明しています)。少なくとも、私が見つけた唯一のものは、プレイ中のTOP演算子がなくても、私が実行しているものに少しでも近いようです。

2
ストアドプロシージャの実行計画がない
ストアドプロシージャのキャッシュから計画が欠落する理由は何ですか? WITH RECOMPILE 動的SQL 暗号化されたコード 重要なデータ変更 統計を更新する ほかに何か? 最近、2つのサーバー(SQL Server 2008 R2およびSQL Server 2012)で作業しましたが、非常にリソースを消費するストアドプロシージャのキャッシュに計画がありませんでした。ストアドプロシージャ内のステートメントの多く(おそらくすべて)にも、キャッシュに計画がありませんでした。一部のストアドプロシージャは、1秒間に数回のようにかなり頻繁に実行されます。 メモリーのプレッシャーは一切ありません。サーバーの1つには、必要以上のハードウェアが搭載されています。 不足している計画は、ストアドプロシージャの途中で一時テーブルが作成されたためだと思いましたが、それはSQL Server 2000以前の古い情報のようです。SQL Server 2005以降、DDLの後のステートメントのステートメントレベルで再コンパイルが行われます。それはすべての場合に当てはまりますか、それとも新しいバージョンでも発生しますか? 不足している計画の原因は他に何でしょうか?このトピックに関するいくつかの記事をざっと読みましたが、何も当てはまらないようです。 アドホックワークロードの最適化は、今週見ているサーバーで有効になっています。ストアドプロシージャの1つは1日に1回のみ実行されます。私はそのためのコードを持っています。1分間に100回以上実行するコードはありませんが、入手できます。コードを投稿することはできませんが、質問に関連して説明できます。 プロシージャキャッシュを解放したり、クリーンバッファを削除したりする人はいないと思います。このクライアントは、監視ツールの1つとしてSolarwinds DPAを使用しています。DPAは、1日に1回呼び出されるストアドプロシージャ内のステートメントの実行計画の1つをキャプチャしました。その文には、引数なしのWHERE句のために大量の読み取りがあります。DPAがステートメントをキャプチャした場合、それは推定プランであり、一度にプランキャッシュ内にありました。トラブルシューティングを行っているときは、そこにはありません。sp_WhoIsActiveテーブルへのロギングを開始します。 を使用していsp_BlitzCacheます。(私はBrent Ozar Unlimitedで働いています)これにより、ストアドプロシージャ全体の計画と、個々のステートメントの計画(存在する場合)が表示されます。存在しない場合は、「このクエリのプランが見つかりませんでした。これには、動的SQL、RECOMPILEヒント、暗号化コードが考えられます」という警告が表示されます。そして、その警告は声明にもあります。 TF 2371は設置されていません。待機状況を確認しています。サーバーはかなり退屈です。PLEは130,000を超えています。 これで、さらに2つのストアドプロシージャのコードを入手できました。そのうちの1つは、動的SQLを使用しているexec (@sql)ので、なぜ計画がないのかがわかります。しかし、もう1つは、これは1分間に100回以上実行されているもので、異常なものは何もありません。その中で際立っている唯一のものは、一時テーブルが1000行を超えるコードの途中で作成されていることです。たくさんの子ストアドプロシージャも呼び出します。 SQL Server 2008のプランキャッシュに関して、8k以上のリテラルは表示されませんが、ストアドプロシージャの1つには、別のストアドプロシージャを呼び出す直前に一括挿入に関するコメントがあります。しかし、私が見ている外部ストアドプロシージャには一括挿入は表示されません。この記事の「再コンパイルのしきい値」セクションは興味深いものです。一時テーブルで私が目にしているのは、大量のINSERT(何百万行になる可能性がある)、いくつかの更新と削除です。そのため、一時テーブルに多くのデータが変更されます。数百万。

2
このクエリをリファクタリングして、並列に実行できますか?
サーバーで実行するのに約3時間かかるクエリがありますが、並列処理を利用していません。(で約115万レコード、dbo.Deidentifiedで300レコードdbo.NamesMultiWord)。サーバーは8つのコアにアクセスできます。 UPDATE dbo.Deidentified WITH (TABLOCK) SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml), DE461 = dbo.ReplaceMultiWord(DE461), DE87 = dbo.ReplaceMultiWord(DE87), DE15 = dbo.ReplaceMultiWord(DE15) WHERE InProcess = 1; そしてReplaceMultiword、次のように定義された手順です。 SELECT @body = REPLACE(@body,Names,Replacement) FROM dbo.NamesMultiWord ORDER BY [WordLength] DESC RETURN @body --NVARCHAR(MAX) ReplaceMultiword並行計画の形成を防ぐことへの呼びかけはありますか?これを書き換えて並列処理を可能にする方法はありますか? ReplaceMultiword 置換の一部は他の置換の短いバージョンであり、最長一致が成功するようにするため、降順で実行されます。 たとえば、「ジョージワシントン大学」と「ワシントン大学」の他の大学があります。「ワシントン大学」の試合が最初であれば、「ジョージ」は取り残されます。 技術的にはCLRを使用できますが、その方法はよくわかりません。

2
一括挿入の制約のない委任を構成する
Always On可用性グループにMicrosoft SQL Server 2016ノードのペアがあります。BULK INSERTWindows Server 2016ファイルサーバーフェールオーバークラスターにあるファイルに対して(SQL Server 2016 Management Studioクエリを使用して)実行しようとしていますが、次のエラーが表示されます。 メッセージ4861、レベル16、状態1 ファイル "\ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt"を開けなかったため、一括読み込みできません。オペレーティングシステムエラーコード5(アクセスが拒否されました)。 これは、アクティブノード名(nas2.my.domain)またはフェールオーバークラスターリスナー(nas.my.domain)を使用するかどうかに関係なく発生します。 調べてみると、これは、SQL Serverが、ニュアンスが原因で接続しているユーザーアカウントを偽装できないことが原因であることがわかりましたBULK INSERT。 Windows認証を使用してSQL Serverに接続する場合、SQL Serverサービスアカウントは、ファイルサーバーへの接続時にユーザーアカウントを偽装しようとします。SQL Server認証を使用して接続する場合、SQL Serverサービスアカウントとしてファイルサーバーに接続します。 委任と偽装が適切に構成されていない場合(既定の状態)、SQL Serverサービスはユーザーアカウントを偽装できず、匿名ユーザーとしてファイルサーバーに接続しようとします。 これは、ファイルサーバーのセキュリティイベントログを調べることで確認できます。これらの事実は、制約なしおよび制約付き委任の構成に関するガイドとともに、次のリンクに記載されています。 方法:制約付き委任を使用したSQL Server一括挿入(アクセスが拒否されました) 一括挿入とKerberos 私はsqldudeのガイドの指示に従ってみましたが、まだ機能していません。 私が行おうとしBULK INSERTているデータベースは可用性グループの一部ではないため、MSSQL1ノードのみが関連するはずです。ファイルサーバーはNAS2ノードでアクティブでした。ファイルサーバーのイベントログを確認すると、この問題が引き続き発生しており、SQL Serverがユーザーアカウントを偽装するのではなく匿名ユーザーとしてファイルサーバーに認証しようとしていることがわかります。 誰が何が間違っているのか知っていますか?または、これらのガイドを廃止するためにSQL Server 2016で何かが変更された場合はどうなりますか? ファイルサーバーセキュリティイベントログエントリ サービスアカウントの委任 サービスアカウントSPN SQL …

1
クエリでスカラーUDFを一度だけ評価するにはどうすればよいですか?
スカラーUDFの結果に対してフィルタリングする必要があるクエリがあります。クエリは単一のステートメントとして送信する必要があるため(UDF結果をローカル変数に割り当てることができません)、TVFを使用できません。スカラーUDFによって引き起こされるパフォーマンスの問題を認識しています。これには、計画全体を連続的に実行すること、過剰なメモリ許可、カーディナリティー推定の問題、インライン化の欠如が含まれます。この質問については、スカラーUDFを使用する必要があると想定してください。 UDF自体は呼び出すのにかなり費用がかかりますが、理論的には、関数を一度計算するだけで済むように、オプティマイザーによってクエリを論理的に実装できます。この質問の非常に単純化された例をモックアップしました。次のクエリは、マシンで実行するのに6152ミリ秒かかります。 SELECT x1.ID FROM dbo.X_100_INTEGERS x1 WHERE x1.ID >= dbo.EXPENSIVE_UDF(); クエリプランのフィルター演算子は、関数が行ごとに1回評価されたことを示しています。 DDLおよびデータ準備: CREATE OR ALTER FUNCTION dbo.EXPENSIVE_UDF () RETURNS INT AS BEGIN DECLARE @tbl TABLE (VAL VARCHAR(5)); -- make the function expensive to call INSERT INTO @tbl SELECT [VALUE] FROM STRING_SPLIT(REPLICATE(CAST('Z ' AS VARCHAR(MAX)), 20000), ' '); RETURN 1; …

3
SQL Server 2016、シャードを備えたマルチテナントシステム、またはテナントごとに個別のデータベースを介してテナントを分離する必要がありますか?
ユースケースを考えます: テナントデータはクロストークしてはいけません。あるテナントは別のテナントのデータを必要としません。 各テナントには、大量の履歴データが潜在的に含まれている可能性があります。 SQL ServerはAWS EC2インスタンスでホストされます。 各テナントは地理的に離れています。 PowerBI Embeddedなどのサードパーティの視覚化ツールを使用する意図があります。 データ量は時間とともに増加すると予想されます システムのコストには制約があります。 ソリューションは、24時間365日の実稼働DBAなしで保守可能でなければなりません。 ソリューションは水平方向にスケーリングできる必要があります。 テナントの総数は50未満です 推奨されるアーキテクチャは何ですか?このユースケースのリファレンス実装はありますか?多くの人がエンタープライズソフトウェア開発のためにすでにこの問題に直面していると思います。 これは、マルチテナントデータベースアーキテクチャで増加するテナントの処理とは異なる状況だと思います。その質問で言及されているユースケースは、より多くのテナントを扱っていますが、これは非常に少数の大きなテナントを持つこととは非常に異なります。ここで説明したアーキテクチャは、ここで解決策になる可能性があります。これは、私がもっと知りたいことです。

4
ドライブvsマウントポイント?
以前のシニアDBAは、会社全体のすべてのSQL Serverのすべてのドライブにマウントポイントを設定しました。新しいシニアDBA は、マウントポイントが私たちの標準を変更したいので怖がっています(主に、経験がないためだと思います)。 多数のインターネット検索の結果に基づいて、マウントポイントを使用しない理由(SQL Server 2000以降)が見つかりません。 このトピックに関するWindows OSの制限を知っている人はいますか? 最近、「OSはマウントポイントを認識しない」という主張をよく耳にします。(私たちが使用しているWindows Serverのバージョンに関する私の調査に基づいて、真実ではありません)。 SQL Serverでマウントポイントを使用しない証拠または経験に基づいた理由はありますか? ドライブ文字の不足は問題ではないと仮定します。 マウントポイントは、ワークロードの分離に非常に役立つことを理解しています。 マウントポイントは、データファイル、ログファイル、およびtempdbの各ドライブよりも効率的に、さまざまな種類のデータおよびログファイル(システムデータベースファイル、ユーザーデータベースファイル、tempDB)のワークロードを実際に分離/分離するという理解を確認または反論できますか? ?


3
「CREATE UNIQUE INDEX」の「WHERE」句で「LEN」関数を使用します
私はこの表を持っています: CREATE TABLE Table01 (column01 nvarchar(100)); そして、この条件LEN(column01)> = 5でcolumn01に一意のインデックスを作成したい 私は試した: CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE LEN(column01) >= 5; 私が得た: テーブル 'Table01'のフィルター選択されたインデックス 'UIX_01'のWHERE句が正しくありません。 そして: ALTER TABLE Table01 ADD column01_length AS (LEN(column01)); CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE column01_length >= 5; 生産物: フィルター式の列「column01_length」が計算列であるため、フィルター索引「UIX_01」を表「Table01」に作成できません。この列が含まれないようにフィルター式を書き直してください。

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; 他のオプションはありますか、スキーマアプローチには欠点がありますか?

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