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

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

3
フィルター条件がクラスター化列ストアインデックスに正しく適用されない
以下の例を使用すると、述語は同じですが、上のステートメントは(正しく)0行を返し、下のステートメントは1を返します-述語が一致しない場合でも: declare @barcode nchar(22)=N'RECB012ZUKI449M1VBJZ' declare @tableId int = null declare @total decimal(10, 2) = 5.17 SELECT 1 FROM [dbo].[transaction] WITH (INDEX([IX_Transaction_TransactionID_PaymentStatus_DeviceID_DateTime_All])) WHERE Barcode = @barcode AND StatusID = 1 AND TableID = @tableID AND @total <= Total SELECT 1 FROM [dbo].[transaction] WHERE Barcode = @barcode AND StatusID = 1 AND …

1
SQL ServerがCTEを「最適化フェンス」として使用する場合に決定するルールは何ですか?
しばらく前に、Brent OzarがSQL ServerとPostgreSQLの違いのいくつかを詳しく説明した投稿を公開しました: SQL ServerとPostgreSQLの2つの重要な違い 最初のポイント(「CTEは最適化フェンス」)が私の目を引きました。提供されている例では、SQL ServerがCTEとメインクエリを組み合わせ、それを単一のクエリとして最適化している( PostgreSQL)。 ただし、この動作は、SQL ServerがCTEを最適化フェンスとして扱う他のブログやトレーニングクラスで見た例とは逆のようです。これにより、インデックスの使用やパフォーマンスの向上などが可能になります。次に例を示します。 星を選択するより良い方法 したがって、SQL ServerはCTEを最適化のフェンスとして「称賛」しているようです。SQL ServerがCTEを最適化フェンスとして確実に尊重する既知のケース(またはその逆の動作)の特定のリストを文書化する優れたリソースはありますか?

1
SHRINKFILEの失敗-ファイルサイズを大きくすると解決するのはなぜですか?
SHRINKFILEファイルグループ内の小さな不要なファイルをクリーンアップするために、いくつかの操作を実行しています。縮小の1つについて、以下のコマンドはエラーになります。 DBCC SHRINKFILE (N'myfile' , EMPTYFILE)' データベースID xのファイルID xは、別のプロセスによって縮小されているか、空であるため縮小できません 空ではなく、縮んでもいない。現在私以外の誰も使用していないデータベースで実行されています。自動縮小は有効になっておらず、一度も有効になりませんでした。ただし、それが問題になる場合は、私が手に入れる前に、このデータベースで定期的に手動で縮小が行われていました。 でSQLServerCentral、十年前からのスレッドがあることがあるため、ファイルに数MBを追加提案し、「それは今シュリンクの途中ではありません、それを伝える内部カウンタまたはスイッチをリセットします。」 これはうまくいった-素晴らしい。しかし、SQL Serverの内部に関してこれがどのように/なぜ機能するのか、誰でも詳細に説明できますか?

2
カンマを大きな数に入れる最良の方法
私は新しい仕事を始めました、そしてそれはたくさんの大きな数を見ることを含みます。intor decimalフィールドにカンマを追加して読みやすくする簡単な方法はありますか? たとえば、SQL Serverは左側の列を出力しますが、私自身の健全性のために、右側の列のようにする必要があります。 2036150 -> 2,036,150 ...または私は凶悪なものを書かなければならないでしょう left(right(vandalized_data),6),3) + ',' + right(left(vandalized_data),6),3) 関数? 完璧なのは、表示グリッドのコンマであり、出力のプレーン整数です。

2
なぜこれがより速く、安全に使用できますか?(最初の文字がアルファベットの場合)
要するに、非常に大きな人々のテーブルからの値で人々の小さなテーブルを更新しています。最近のテストでは、この更新の実行に約5分かかります。 私たちは可能な限り最も賢い最適化のように思われるものに偶然出会いました。同じクエリが2分未満で実行され、同じ結果が完全に生成されます。 これがクエリです。最後の行は「最適化」として追加されます。クエリ時間が大幅に減少するのはなぜですか?何かが足りませんか?これは将来的に問題を引き起こす可能性がありますか? UPDATE smallTbl SET smallTbl.importantValue = largeTbl.importantValue FROM smallTableOfPeople smallTbl JOIN largeTableOfPeople largeTbl ON largeTbl.birth_date = smallTbl.birthDate AND DIFFERENCE(TRIM(smallTbl.last_name),TRIM(largeTbl.last_name)) = 4 AND DIFFERENCE(TRIM(smallTbl.first_name),TRIM(largeTbl.first_name)) = 4 WHERE smallTbl.importantValue IS NULL -- The following line is "the optimization" AND LEFT(TRIM(largeTbl.last_name), 1) IN ('a','à','á','b','c','d','e','è','é','f','g','h','i','j','k','l','m','n','o','ô','ö','p','q','r','s','t','u','ü','v','w','x','y','z','æ','ä','ø','å') テクニカルノート:テストする文字のリストには、さらに数文字が必要になる場合があることを認識しています。また、「DIFFERENCE」を使用した場合のエラーの明らかなマージンも認識しています。 クエリプラン(通常): https : //www.brentozar.com/pastetheplan/?id=rypV84y7V クエリプラン( "最適化"付き): …

3
varchar(max)が原因で流出をtempdbにソート
32 GBのサーバーでは、最大メモリが25 GBのSQL Server 2014 SP2を実行しており、2つのテーブルがあります。ここでは、両方のテーブルの構造が簡略化されています。 CREATE TABLE [dbo].[Settings]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceId] [int] NULL, [typeID] [int] NULL, [remark] [varchar](max) NULL, CONSTRAINT [PK_Settings] PRIMARY KEY CLUSTERED ([id] ASC) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Resources]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceUID] [int] NULL, CONSTRAINT [PK_Resources] PRIMARY KEY CLUSTERED …

1
EXCEPT演算子の背後にあるアルゴリズムは何ですか?
SQL Serverのカバーの下でExcept演算子がどのように機能するかの内部アルゴリズムは何ですか?内部的に各行のハッシュを取得して比較しますか? David Lozinksiは、SQLの調査を実行しました。新しいレコードが存在しない場合に、新しいレコードを挿入する最も速い方法です。以下の結果に密接に関連しています。 前提:1つの列のみを比較するため、左結合が最も高速になると思いますが、すべての列を比較する必要があるため、例外として最も時間がかかります。 これらの結果により、今、私たちの考えは、自動的かつ内部的に各行のハッシュを取ることを除いてですか?私は実行計画を除いて見て、それはいくつかのハッシュを利用しています。 背景:私たちのチームは2つのヒープテーブルを比較していました。テーブルAテーブルBにない行がテーブルBに挿入されました。 (レガシーテキストファイルシステムの)ヒープテーブルには、主キー/ GUID /識別子はありません。一部のテーブルには重複行があったため、各行のハッシュを見つけ、重複を削除して、主キー識別子を作成しました。 1)最初に、(ハッシュ列)を除いて、exceptステートメントを実行しました select * from TableA Except Select * from TableB, 2)次に、HashRowIdの2つのテーブル間で左結合比較を実行しました select * FROM dbo.TableA A left join dbo.TableB B on A.RowHash = B.RowHash where B.Hash is null 驚いたことに、Except Statement Insertが最速でした。 結果は実際にDavid Lozinksiのテスト結果に近いマップ

1
影響を受ける行がないにもかかわらずトリガーをトリガー
これはより一般的な質問ですが、この質問の動機は、SQL Serverの使用中に直面した問題でした。 このトリガーは、副作用として、行が挿入されなかった場合にエラーが発生するロジックを含むテーブルのInsertイベントにアタッチされています。さらに調査したところ、行が挿入されていないにもかかわらず、トリガーが発動していることがわかりました。 MicrosoftドキュメントのDMLトリガーで使用されている言語は、この動作と矛盾しているようです。 DMLトリガーは、トリガーで定義されたテーブルまたはビューに影響するDMLイベントが発生すると自動的に有効になる特殊なタイプのストアドプロシージャです。 これは、DBMS全体のデフォルトの動作ですか?影響を受ける行がないときにトリガーを起動する特別な理由はありますか?

1
結合消去がsys.query_store_planで機能しないのはなぜですか?
以下は、クエリストアで発生するパフォーマンスの問題の簡略化です。 CREATE TABLE #tears ( plan_id bigint NOT NULL ); INSERT #tears (plan_id) VALUES (1); SELECT T.plan_id FROM #tears AS T LEFT JOIN sys.query_store_plan AS QSP ON QSP.plan_id = T.plan_id; plan_id列は、主キーとして文書化されているsys.query_store_planが、実行計画は使用されません撤廃への参加が期待されるように: DMVから投影される属性はありません。 DMV主キーplan_idは一時テーブルの行を複製できません A LEFT JOINが使用されているため、から行をT削除できません。 実行計画 これはなぜですか、ここで参加の削除を取得するにはどうすればよいですか?


2
属性に特定の文字が含まれていないXMLシーケンスを返す
次の単純なXMLを考えてみます。 <xml> <customer name="Max"> <email address="me@you.com" /> </customer> <customer name="Erik"> <email address="erik@your-mom.com" /> </customer> <customer name="Brent"> <email address="brentcom" /> </customer> </xml> アイテム<Customer>のaddress属性にが含まれて<email>いないシーケンスのリストを取得したい@。 したがって、次のような出力が必要です。 <customer name="Brent"> <email address="brentcom" /> </customer> mcve: DECLARE @x XML = '<xml> <customer name="Max"><email address="me@you.com" /></customer> <customer name="Erik"><email address="erik@your-mom.com" /></customer> <customer name="Brent"><email address="brentcom" /></customer> </xml>'; このクエリ: SELECT …
10 sql-server  xml  xquery 

1
クラスタ化インデックスを使用してSQL Serverテーブルからデータを削除するときに、Bツリーは再調整されますか?
SQL Serverデータベースに、主キーにクラスター化インデックスを持つテーブルがあります。テーブルには100万行あります。テーブルから10K行を削除した場合、削除操作の実行中にインデックスが再構築されますか? 削除操作はストアドプロシージャの一部です。一度に複数のクライアントがストアドプロシージャを実行できますが、個々の実行ごとに独自の行のセット(主キーによって一意に識別される)が削除されます。複数のクライアントがプロシージャを実行すると、キーロック(タイプU)がブロックされます。ブロッカーロックは同じテーブルの行に属しており、同時に実行されているトランザクションの一部ではありません。各実行はそれ自体の行のセットを削除しようとしているため、ブロックはありません。ロックのエスカレーションはオフになっているため、発生していません。 削除操作によってインデックスが再調整されるため、再構築プロセス中にテーブルの任意の行でキーロックが発生する可能性があると思います。 これについてのご意見をいただければ幸いです。

1
負の値とゼロの値を含む列の行を乗算する方法は?
クエリでグループ化された特定の列のすべての行の積を取得しようとしています。私は組み合わせ方のポイントに私を見つけたほとんどの例exp、sumおよびlog exp(sum(log([Column A]))) 私が抱えている問題は、列に値のゼロが含まれているため、log関数にゼロが渡されたときにこのエラーが発生することです。 無効な浮動小数点演算が発生しました。 case式を使用してこれを回避できると思いましたが、すべてのケースを評価しているように見えるので、それは私が思っているように機能しません... select Name, Product = case when min([Value]) = 0 then 0 when min([Value]) <> 0 then exp(sum(log(I))) -- trying to get the product of all rows in this column end from ids group by Name SqlFiddle 次の結果セットがあるとします。 Id Name Value _________________________________ 1 a 1 …

2
Parallelism Exchangeイベントのデッドロックが被害者なしである場合、それは問題ですか?
実稼働環境(SQL Server 2012 SP2-はい...わかっています...)にこれらのクエリ内並列スレッドデッドロックが多数見られますが、拡張イベントを介してキャプチャされたデッドロックXMLを見ると、犠牲者リストは空です。 <victim-list /> デッドロックは4つのスレッドの間にあり、2つはWaitType="e_waitPipeNewRow"、2つはWaitType="e_waitPipeGetRow"。 <resource-list> <exchangeEvent id="Pipe13904cb620" WaitType="e_waitPipeNewRow" nodeId="19"> <owner-list> <owner id="process4649868" /> </owner-list> <waiter-list> <waiter id="process40eb498" /> </waiter-list> </exchangeEvent> <exchangeEvent id="Pipe30670d480" WaitType="e_waitPipeNewRow" nodeId="21"> <owner-list> <owner id="process368ecf8" /> </owner-list> <waiter-list> <waiter id="process46a0cf8" /> </waiter-list> </exchangeEvent> <exchangeEvent id="Pipe13904cb4e0" WaitType="e_waitPipeGetRow" nodeId="19"> <owner-list> <owner id="process40eb498" /> </owner-list> <waiter-list> <waiter id="process368ecf8" …

2
バッチごとにコンパイルが発生します
T-SQLステートメントをバッチで送信するサードパーティアプリケーションがあります。 データベースは、SQL Server 2016 Enterprise SP1 CU7、16コア、256 GBメモリでホストされています。アドホックの最適化が有効になっています。 これは、実行されているクエリのダミーの例です。 exec sp_executesql N' IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT select field1, field2 from table1 where field1=@1 option(keep plan, keepfixed, loop join) select field3, field4 from table2 where field3=@1 option(keep plan, keepfixed, loop join)', N'@1 nvarchar(6)',@1=N'test' データベースを監視し、毎秒のバッチ数と毎秒のコンパイル数を見ると、それらは常に同じであることがわかります。負荷が高い場合、これは1000バッチ/秒および1000コンパイル/秒になる可能性があります。平均負荷では、150バッチ/秒です。 最近コンパイルされたプランのクエリキャッシュを分析します。 SELECT …

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