データベース管理者

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


1
名前列の順列と組み合わせを生成する
順列と組み合わせについて、次のサンプルデータがあります。 create table tbltest ( name varchar(50), addres varchar(100) ); insert into tbltest values('Sam Mak John','Street 1 HNo 101 USA'); insert into tbltest values('Donatella Nobatti','HNo 101 UK'); insert into tbltest values('Sam Buca','Main Road B Block UAE'); insert into tbltest values('Juan Soponatime','Hight Street CA'); insert into tbltest values('Aaron Spacemuseum','HNo A10 100 …

1
SQL Serverのすべての接続でARITHABORTをONに設定すると、どのような影響がありますか?
そのため、SQL Serverの不安定な動作は.Net SqlClientデータプロバイダーのデフォルト設定が原因であると判断しましたSET ARITHABORT OFF。そうは言っても、これを実装する最良の方法を議論するさまざまな記事を読んだことがあります。私にとっては、SQL Serverに問題があり、クエリのチューニングがアプリ全体で完全に超えていない(そして明らかにSETsp に追加しても機能しない)ため、簡単な方法が欲しいだけです。 Erland Sommarskogのこのトピックに関する素晴らしい記事では、基本的にアプリを変更SET ARITHABORT ONして接続用に発行することで安全なアプローチを取ることを提案しています。ただし、dba.stackexchange 質問からのこの回答では、Solomon Rutzkyがインスタンス全体とデータベース全体の両方のアプローチを提供しています。 これをインスタンス全体に設定すると、どのような影響がありますか?私が見ているように... SSMSにはONデフォルトでこれが設定されているONため、すべての接続に対してサーバー全体に設定しても問題はありません。結局のところ、何よりもこのSQL Serverを実行する必要があるだけです。


5
SQL Serverの同じ列での複数の外部キーの使用
SQL Serverでは、列に複数の外部キーを作成できます。異なる名前を使用するたびに、同じオブジェクトを参照する別のキーを作成できます。基本的に、すべてのキーは同じ関係を定義しています。同じ列で定義され、別のテーブルの同じ列を参照する複数の外部キーを使用する方法を知りたい。SQL Serverがそのようなことを可能にすることの利点は何ですか?

1
フロートの非決定的合計
明らかなこぶしを述べさせてください。浮動小数点型は10進数値を正確に表すことができないことを完全に理解しています。これはそれについてではありません!それにもかかわらず、浮動小数点計算は決定論的であることになっています。 これが邪魔にならないところで、今日私が観察した奇妙なケースを紹介しましょう。浮動小数点値のリストがあり、それらを合計したいと思います。 CREATE TABLE #someFloats (val float); INSERT INTO #someFloats (val) VALUES (1), (1), (1.2), (1.2), (1.2), (3), (5); SELECT STR(SUM(#someFloats.val), 30, 15) FROM #someFloats; DROP TABLE #someFloats; -- yields: -- 13.600000000000001 これまでのところ、とても良いです-ここに驚きはありません。1.2バイナリ表現で正確に表現できないことは誰でも知っているので、「不正確な」結果が予想されます。 ここで、別のテーブルを左結合すると、次の奇妙なことが起こります。 CREATE TABLE #A (a int); INSERT INTO #A (a) VALUES (1), (2); CREATE TABLE #someFloats (val …

2
WSRMを使用して最大CPU使用率を制限するSQL SERVER
SQL Serverの1つのインスタンスを実行している物理サーバーがあります。 このサーバーがCPU使用率100%で実行されていることがよくあります。 私のITチームはこれに満足しておらず、32コアのうち2コアをOS用に予約することを提案しました。 これは問題なく機能し、最大使用率のピークは90%未満になりました。さらに、さまざまなユーザーからの遅いデータ取得は報告されなくなりました。 SQLリソースガバナーの代わりに、この方法でWSRM(Windowsシステムリソースマネージャー)を使用しない理由はありますか?

1
システム正常性拡張イベントからの誤ったプロセス使用率?
私は最近、システムヘルス拡張イベントイベントファイルに格納されているデータまたはメトリックの理解に取り組んでいます。 ここで提供されているように、システムヘルスを使用してパフォーマンスメトリックのデータコレクションを実装しようとしています という名前のシステムヘルスイベントから収集されるCPU使用率、その他のプロセス使用率などのメトリックを提供するレポートがあります。 scheduler_monitor_system_health_ring_buffer_recorded SQL CPU使用率としてレポートにリストされているフィールド "process_utilization"がほとんどの場合100を超える時間である理由をいくつかのビジーサーバーで理解できません。サーバーアクティビティモニターから確認した場合でも、常に100を超えるCPUが表示されます。 私はGithubでこの問題を提起しましたが、修正または応答がないようです。 したがって、私の質問は 記録されたシステムヘルスリングバッファーを使用して、サーバーのSQL CPU使用率の正確な数値を取得するにはどうすればよいですか? レポートには、レポートごとに計算された2つ未満のフィールドのカウンターも表示されます OtherProcessUtilとしての100-System_idle-process_utilization SystemUtilとしての100-system_idle これらのOtherProcessUtilおよびSystemUtilは何のために必要/役立ちますか? また、毎回メモリ使用率が常に100と表示されています。これも正しくないようです。誰か気づいたことがありますか? Idera&sentry [私がテストしたもの]のような他のツールでは、同じサーバーのCPU使用率が100%を超えていません。同じ負荷に対して並べて比較しました。

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のテスト結果に近いマップ

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