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

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

1
SQL Serverが過剰なメモリ許可を警告するのはいつですか?
「過剰付与」実行計画の警告を生成する条件は何ですか? クエリメモリ許可が「ExcessiveGrant」を検出しました。これは信頼性に影響を与える可能性があります。許可サイズ:初期5128 KB、最終5128 KB、使用済み16 KB。 SSMS 計画エクスプローラー Showplan XML <Warnings> <MemoryGrantWarning GrantWarningKind="Excessive Grant" RequestedMemory="5128" GrantedMemory="5128" MaxUsedMemory="16" /> </Warnings>

1
単一行のINSERT…SELECTは、個別のSELECTよりもはるかに遅い
1〜400の番号が付けられた400行の次のヒープテーブルがあるとします。 DROP TABLE IF EXISTS dbo.N; GO SELECT SV.number INTO dbo.N FROM master.dbo.spt_values AS SV WHERE SV.[type] = N'P' AND SV.number BETWEEN 1 AND 400; および次の設定: SET NOCOUNT ON; SET STATISTICS IO, TIME OFF; SET STATISTICS XML OFF; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 次のSELECT文は約6秒で完了します(demo、plan): DECLARE @n integer = 400; …

1
この派生テーブルがパフォーマンスを改善するのはなぜですか?
json文字列をパラメーターとして受け取るクエリがあります。jsonは、緯度と経度のペアの配列です。入力例は次のとおりです。 declare @json nvarchar(max)= N'[[40.7592024,-73.9771259],[40.7126492,-74.0120867] ,[41.8662374,-87.6908788],[37.784873,-122.4056546]]'; それは、1,3,5,10マイルの距離で、地理的なポイントの周りのPOIの数を計算するTVFを呼び出します。 create or alter function [dbo].[fn_poi_in_dist](@geo geography) returns table with schemabinding as return select count_1 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 1,1,0e)) ,count_3 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 3,1,0e)) ,count_5 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 5,1,0e)) ,count_10 = count(*) from dbo.point_of_interest where LatLong.STDistance(@geo) <= 1609.344e …

1
列で統計が作成されないようにする方法は?
統計を作成または更新したくない列のあるテーブルがあります。クエリオプティマイザーがその列の統計ヒストグラムではなく主キーの統計の密度を使用するように強制すると、より優れた結合カーディナリティの推定値が得られます。自動更新と自動作成の統計はデータベースレベルでオンになっており、変更できません。 統計の作成を防ぐための代替案を提案したい場合、テーブルは何千もの異なるクエリによって参照されるビューで使用されることに留意してください。実行されるクエリを制御できません。 私の最初の戦略は、NOCOMPUTEとSAMPLE 0 ROWSオプションで列の統計を作成することでした。SQL Serverは、統計オブジェクトが既に存在する列に統計を自動的に作成しないという印象を受けましたが、これは開発サーバーとQAサーバーで発生しています。 の新しい統計情報が作成されましたCOL_GROUP。私のNORECOMPUTE統計は更新されませんでした。統計が作成された理由はわかりませんが、クエリを実行してそれをトリガーすることはできませんでした。 SQL Serverが1つの列の統計を自動的に作成しないようにする方法はありますか?私のテーブルには2つの列しかないので、1つのテーブルで自動統計が作成されないようにする解決策でも問題は解決します。 トレースフラグ4139および2371は、違いが生じる場合に備えてオンになっています。 テーブル構造を試してみたい場合は、以下の表データとサンプルデータを含めました。 CREATE TABLE X_NO_COLUMN_STATS( [COL_USER] [varchar](256) NOT NULL, [COL_GROUP] [int] NOT NULL, CONSTRAINT [PK_X_NO_COLUMN_STATS] PRIMARY KEY CLUSTERED ( [COL_USER] ASC, [COL_GROUP] ASC )WITH (DATA_COMPRESSION = PAGE) ); -- prevent stats from being updated on COL_GROUP CREATE STATISTICS [X_NO_COLUMN_STATS__COL_GROUP] ON X_NO_COLUMN_STATS …

2
「SELECT TOP」パフォーマンスの質問
selectを使用するtop 100とはるかに高速に実行され、select を使用しないとはるかに低速になるクエリがありますtop 100。返されるレコードの数は0です。クエリプランの違いについて説明したり、そのような違いが説明されているリンクを共有したりできますか。 topテキストなしのクエリ: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; 上記のクエリプラン(なしtop): https://pastebin.com/cbtJpxFf IOおよびTIME統計(なしtop): SQL Server parse and compile time: CPU time = …

6
ALTER INDEX ALL REBUILDは、各インデックスを個別に再構築するよりも単純な復旧モデルでより多くのトランザクションログ領域を使用しますか?
トランザクションログの領域が不足したため、SQL Server 2012での「ALTER INDEX ALL REBUILD」操作は失敗しました。インデックスは再編成または再構築されたことがないため、ほぼすべてのインデックスで断片化が80%を超えています。 DBは単純な復旧モデルを使用します。「ALL」形式のコマンドによって実行される各インデックス操作に続いて、次のインデックス再構築の前にトランザクションログデータがフラッシュされると想定しました。それは実際にどのように機能するのですか、またはインデックスの再構築は単一のトランザクションの一部であるかのように記録されますか? 言い換えると、各再構築を個別に実行するスクリプトを記述することにより、トランザクションログの増加を減らすことができますか?考慮すべき他の要因はありますか?
18 sql-server  index 

1
データをパージする最も簡単な方法は何ですか?
シナリオ: 我々は2つのテーブル持っているTbl1&Tbl2加入者サーバ上に。Tbl1出版社から複製されServer A、それは2つのトリガーがある-挿入および更新を。トリガーはにデータを挿入および更新していますTbl2。 今、私たちはパージしなければなりません(約9億件のレコード)からTbl2、合計で1億件以上のレコードがあります。以下は、1か月から1分間のデータ分布です。 1か月-14986826行 1日-483446行 1時間-20143行 1分-335行 私が探しているもの; 生産上の問題、データの一貫性、そしておそらくダウンタイムなしでそのデータを消去する最速の方法。だから、私は以下の手順に従うことを考えていますが、立ち往生しています:( 手順: BCP既存のテーブルTbl2から必要なデータを出力します(約1億レコード、約30分かかる場合があります)。 1Fab2018の午後10:00にアクティビティを開始し、1Fab2018の午後10:30に終了したとします。アクティビティが完了するまでに、テーブルTbl2はデルタになる新しいレコードを取得します Tbl3という名前でデータベースに新しいテーブルを作成します 新しく作成されたテーブルTbl3にエクスポートされたデータのBCP(約1億レコード、約30分かかる場合があります) 複製ジョブを停止します BCP-inが完了したら、tsqlスクリプトを使用して新しいデルタデータを挿入します。 課題は-デルタ「更新」ステートメントに対処する方法ですか? レプリケーションを開始する 追加の質問: シナリオに対処する最良の方法は何ですか?

2
なぜAT TIME ZONEは非決定的ですか?
SQL Server 2016はAT TIME ZONE非決定的と思われます。ただし、これを公式に説明したり、その背後にある理由について理論的根拠を示したりする文書を見つけることができませんでした。 なぜAT TIME ZONE非決定的ですか? 非決定性を示す例 実行中: CREATE TABLE Test ( LegacyTimestamp DATETIME, Timestamp AS LegacyTimestamp AT TIME ZONE 'Eastern Standard Time' PERSISTED ); 次のエラーを返します。 Msg 4936, Level 16, State 1, Line 1 Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is non-deterministic.

6
常に単一の整数列を主キーとして持つことの欠点は何ですか?
私が取り組んでいる1つのWebアプリケーション内で、すべてのデータベース操作は、Entity Framework ORMで定義されたいくつかの汎用リポジトリを使用して抽象化されています。 ただし、汎用リポジトリのシンプルなデザインを実現するには、関連するすべてのテーブルで一意の整数(Int32C#、intSQL)を定義する必要があります。これまで、これは常にテーブルのPKであり、IDENTITY。 外部キーは頻繁に使用され、これらの整数列を参照します。これらは、一貫性とORMによるナビゲーションプロパティの生成の両方に必要です。 通常、アプリケーション層は次の操作を実行します。 テーブルからの初期データロード(*)-SELECT * FROM table 更新 -UPDATE table SET Col1 = Val1 WHERE Id = IdVal 削除 -DELETE FROM table WHERE Id = IdVal 挿入 -INSERT INTO table (cols) VALUES (...) 頻度の低い操作: 一括挿入 - BULK INSERT ... into tableその後に(*)すべてのデータロード(生成された識別子を取得するため) 一括削除 -これは通常の削除操作ですが、ORMの観点からは「一括」です。DELETE FROM table where OtherThanIdCol …

1
キャッシュサイズと予約メモリを計画する
実際の実行計画を含むクエリを実行すると、ルート演算子(SELECT)からキャッシュされた計画サイズが32KBであることが通知されます。 sys.dm_exec_cached_plansとを結合するクエリはsys.dm_os_memory_objects、問題のプランを見て、との値が32768(32KB)であり、キャッシュされたプランのサイズと一致するpages_in_bytesと言いますmax_pages_in_bytes。 私が理解していないのは、の値sys.dm_exec_cached_plans.size_in_bytesが49152(48KB)の略であるということです。これらすべてのコラムでBOLを読みました。特に次のようsize_in_bytesに述べています。 「キャッシュオブジェクトが消費したバイト数。」 それが本当に何を意味するのか理解するために、私はパズルの最後の部分を配置することはできません。 すべての演算子(並べ替えとハッシュに使用される追加のメモリ許可については説明しません)は、キャッシュに最適化されたプランで保存される状態の保存、計算の実行などのために、ある程度の固定メモリを必要としますが、どこにありますか? だから、私の質問は: size_in_bytes本当にどういう意味ですか 「キャッシュされた計画サイズ」よりも高い値になるのはなぜですか? すべての演算子/イテレータのメモリの固定量はどこに予約されていますか、「キャッシュされたプランサイズ」(この例では32Kb)ですか、それとも他の場所ですか? 私はそれらが異なる機能を持つ異なるDMVであることを知っていますが、それらは関連しています。でコンパイルされた(キャッシュされた)計画sys.dm_exec_cached_plans参加するsys.dm_os_memory_objects上でmemory_object_addressのカラム。私がここに質問を投稿する理由は、私がこれについて助けを求めて、DMVとそれらのコラムを解釈する方法を理解しているからです。 場合はsize_in_bytes、なぜSQL Serverは、実際の実行計画で別の値をキャッシュされたプランのサイズと言うんですか? 新しいクエリ、新しい番号: 実際の計画 キャッシュされたプランサイズ16KB CompileMemory 96KB DMV: sys.dm_exec_cached_plans.size_in_bytes 24KB sys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes 16KB。 また、このクエリでは、並べ替えおよびハッシュ操作に追加のメモリ許可が必要ないことに注意してください。 Microsoft SQL Server 2012-11.0.5343.0(X64)

7
SQL Serverでの数値範囲(間隔)検索の最適化
この質問は、IP範囲検索の最適化に似ていますか?ただし、その1つはSQL Server 2000に制限されています。 次のように構造化され、入力されたテーブルに1,000万個の範囲が暫定的に保存されているとします。 CREATE TABLE MyTable ( Id INT IDENTITY PRIMARY KEY, RangeFrom INT NOT NULL, RangeTo INT NOT NULL, CHECK (RangeTo > RangeFrom), INDEX IX1 (RangeFrom,RangeTo), INDEX IX2 (RangeTo,RangeFrom) ); WITH RandomNumbers AS (SELECT TOP 10000000 ABS(CRYPT_GEN_RANDOM(4)%100000000) AS Num FROM sys.all_objects o1, sys.all_objects o2, sys.all_objects o3, sys.all_objects o4) …

4
なぜ差分バックアップではベースを指定できないのですか?
これは私の最初のDBA.SE投稿ですので、間違いがある場合はお知らせください、ありがとう! 私は新しいDBAです(ITプロフェッショナルではなく、社内の他の誰もやっていません)。私はデータベースのバックアップ戦略について読んでいます(または、それらを呼び出すことを学んだように、「復元戦略」)。完全バックアップ、差分バックアップ、およびトランザクションログバックアップの機能は理解していますが、差分バックアップが最新の完全バックアップのみに基づいている理由を知りたいです。 最後の完全バックアップ以降に変更されたすべてが差分バックアップである場合、選択したバックアップに基づいて差分を作成できないのはなぜですか?もっと明確にするために、復元時ではなく、バックアップ時のベースの指定について尋ねています。復元時に、正しいベースとそれに対応する差分を選択して復元を実行すると想定しています(ベースAから復元するためにベースBから作成された差分を使用しない)。 この機能が使用できなくなる理由は何ですか?理由があるに違いないと思うのですが、それが何なのかわかりません。 注:ベースを指定できないことは理解していますが、質問はなぜですか?(「なぜあなたは?」についての議論にも興味がありません) 類推 差分バックアップを理解する方法の例えを以下に示します。 セルにいくつかのデータを含むExcelファイルがあります。 1日目に、このファイルのコピーを作成し、別の場所に保存します(「フルバックアップ」)。 2日目に、ファイルを見て、1日目に作成したバックアップコピーと比較し、変更されたすべてのセルとそれらの新しい値を確認します(「差分バックアップ」)。セルに加えられたすべての変更に注目するのではなく、その最終的な価値に注目します。セルA1が「Alfred」として始まり、「Betty」、「Charlie」、そして「Dave」に変わった場合、「A1 is now Dave」にしか気付かないでしょう。 3日目に、現在のファイルとバックアップファイルを再度比較し、変更を確認します(2日目と同じベースの別の「差分バックアップ」)。繰り返しますが、観察された時間のセルごとの最終値のみに注目し、そのセルが一日中ずっとあったすべての値ではありません。 4日目に、私は再び比較し、再び変化に注意します。セルA1を続けると、「Sarah」と表示されますが、たとえ1日中10名だったとしても、「今A1はSarah」です。 5日目に、私のファイルが台無しになります。したがって、1日目に作成したバックアップコピーを確認し、4日目に最終状態を記録し、記録した変更をバックアップコピーに適用すると、4日目にファイルが「復元」されます。したがって、1日目に作成されたバックアップを見て、4日目にセルA1が「サラ」として終了したことを確認し、バックアップセルA1を「サラ」に変更します。 2日目にファイルの別のバックアップコピー(「フル」)を作成した場合、なぜ問題になるのですか?3日目または4日目のファイルと1日目に作成されたコピーを比較(読み取り、「差分バックアップ」)することがまだできないのはなぜですか?私が理解しているように、SQL Serverでは、(別の差分バックアップを作成する場合)2日目に作成された完全バックアップ(作成されている場合)と比較する必要があります。他のオプションはありません。

1
マルチステートメントTVFとインラインTVFパフォーマンス
Palindromeの質問に対する回答の一部を比較すると(回答を削除したため、1万人以上のユーザーのみ)、紛らわしい結果が得られています。 複数のステートメント、スキーマにバインドされたTVFを提案しました。これは、標準関数を実行するよりも高速だと思いました。また、以下に示すように、マルチステートメントTVFは「インライン化」されるという印象もありましたが、その点では間違っています。この質問は、TVFのこれら2つのスタイルのパフォーマンスの違いに関するものです。まず、コードを確認する必要があります。 次に、複数ステートメントのTVFを示します。 IF OBJECT_ID('dbo.IsPalindrome') IS NOT NULL DROP FUNCTION dbo.IsPalindrome; GO CREATE FUNCTION dbo.IsPalindrome ( @Word NVARCHAR(500) ) RETURNS @t TABLE ( IsPalindrome BIT NOT NULL ) WITH SCHEMABINDING AS BEGIN DECLARE @IsPalindrome BIT; DECLARE @LeftChunk NVARCHAR(250); DECLARE @RightChunk NVARCHAR(250); DECLARE @StrLen INT; DECLARE @Pos INT; SET @RightChunk = …

2
列サイズが大きくなった後、インデックスの作成に時間がかかるのはなぜですか?
ベンダーは、データベース全体のほとんどすべての列の列幅を変更しました。データベースは約7TB、9000以上のテーブルです。55億行のテーブルにインデックスを作成しようとしています。ベンダーのアップグレードの前に、2時間でインデックスを作成できました。今では数日かかります。彼らが行ったことは、varchar(xx)サイズをvarchar(256)に増やすことです。そのため、ほとんどの列はvarchar(18)またはvarchar(75)などでした。 とにかく、主キーは6列で構成され、幅は合計で126文字でした。アップグレード後、プライマリキーは1283文字になり、SQL Serverの900文字の制限に違反します。テーブルの列全体の幅は、1049の合計varcharカウントから4009の合計varcharカウントになりました。 データの増加はありません。テーブルはすべての列幅が増加する前よりも「スペース」を消費しませんが、インデックスのような単純なものを作成するためのパフォーマンスには不合理な時間がかかります。 列のサイズを大きくすることだけが行われたのに、作成とインデックス作成に非常に長い時間がかかる理由を誰でも説明できますか? pkはクラスター化インデックスであるため、作成しようとしているインデックスは非クラスター化です。インデックスの作成を何度か試みた後、私たちはあきらめました。完了せずに4〜5日間実行されたと思います。 ファイルシステムのスナップショットを取得して非稼働環境でこれを試し、より静かなサーバーでデータベースを起動しました。

2
一時テーブルがシークおよびブックマークルックアップを使用しているときに、テーブル変数がインデックススキャンを強制するのはなぜですか?
テーブル変数を使用すると、オプティマイザーがインデックスシークを使用してからブックマークルックアップとインデックススキャンを使用できなくなる理由を理解しようとしています。 テーブルにデータを入力する: CREATE TABLE dbo.Test ( RowKey INT NOT NULL PRIMARY KEY, SecondColumn CHAR(1) NOT NULL DEFAULT 'x', ForeignKey INT NOT NULL ) INSERT dbo.Test ( RowKey, ForeignKey ) SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (SELECT 0)), ABS(CHECKSUM(NEWID()) % 10) FROM sys.all_objects s1 CROSS JOIN sys.all_objects s2 CREATE INDEX …

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