タグ付けされた質問 「performance-tuning」

データベースアプリケーションまたはシステムのパフォーマンス特性の向上。

6
トップ1を追加するとパフォーマンスが劇的に低下するのはなぜですか?
私はかなり単純なクエリを持っています SELECT TOP 1 dc.DOCUMENT_ID, dc.COPIES, dc.REQUESTOR, dc.D_ID, cj.FILE_NUMBER FROM DOCUMENT_QUEUE dc JOIN CORRESPONDENCE_JOURNAL cj ON dc.DOCUMENT_ID = cj.DOCUMENT_ID WHERE dc.QUEUE_DATE <= GETDATE() AND dc.PRINT_LOCATION = 2 ORDER BY cj.FILE_NUMBER それは私に恐ろしいパフォーマンスを与えています(それが終わるのを待つことを決して気にしないような)クエリプランは次のようになります。 しかし、削除するTOP 1と、次のような計画が得られ、1〜2秒で実行されます。 以下のPKとインデックスの修正。 TOP 1クエリプランが変更されたからといって驚くことはありませんが、それによって事態がさら​​に悪化していることに少し驚いています。 注:この投稿の結果を読んで、a Row Goalなどの概念を理解しています。私が興味を持っているのは、より良いプランを使用するようにクエリを変更する方法です。現在、データを一時テーブルにダンプしてから、最初の行を取り出しています。より良い方法があるかどうか疑問に思っています。 編集事実の後にこれを読んでいる人々のために、ここにいくつかの追加情報があります。 Document_Queue-PK / CIはD_IDであり、〜5k行があります。 Correspondence_Journal-PK / CIはFILE_NUMBER、CORRESPONDENCE_IDで、行数は約140万です。 私が始めたとき、他のインデックスはありませんでした。私はCorrespondence_Journal(Document_Id、File_Number)で1つになりました

2
トリガーは毎回コンパイルされますか?
CPU使用率が高いサーバーのトラブルシューティングを行っています。クエリが実際に原因ではないことがわかった後、コンパイルを検討し始めました。 パフォーマンスモニターは、50コンパイル/秒未満および15再コンパイル/秒未満を示しています。 XEセッションを実行してコンパイルを探した後、毎秒数千のコンパイルが発生しています。 このシステムは、トリガーを使用して変更を監査しています。ほとんどのコンパイルはトリガーによるものです。トリガーはsys.dm_tran_active_transactionsを参照します。 最初に考えたのは、トリガーでDMVを参照すると毎回コンパイルされるか、この特定のDMVだけでトリガーされる可能性があるということでした。それで、私はその理論をテストし始めました。毎回コンパイルしますが、DMVを参照せず、代わりに値をハードコードするときにトリガーがトリガーされるたびにコンパイルされるかどうかはチェックしていませんでした。トリガーされるたびにコンパイルされていました。トリガーをドロップすると、コンパイルが停止します。 XEセッションでsqlserver.query_pre_execution_showplanを使用してコンパイルを追跡しています。なぜそれとPerfMonカウンターの間に矛盾があるのですか? トリガーが実行されるたびにコンパイルイベントを取得するのは正常ですか? 再現スクリプト: CREATE TABLE t1 (transaction_id int, Column2 varchar(100)); CREATE TABLE t2 (Column1 varchar(max), Column2 varchar(100)); GO CREATE TRIGGER t2_ins ON t2 AFTER INSERT AS INSERT INTO t1 SELECT (SELECT TOP 1 transaction_id FROM sys.dm_tran_active_transactions), Column2 FROM inserted; GO --Both of these show compilation …

3
高速(<1s)の読み取りクエリパフォーマンスを備えた大規模(> 22兆項目)地理空間データセット
私は、迅速な読み取りクエリのパフォーマンスを必要とする大規模な地理空間データセット用の新しいシステムを設計しています。したがって、次の状況で必要なパフォーマンスを達成するために、適切なDBMS、データ構造、または代替方法について可能性があると思うか、経験/アドバイスを持っている人がいるかどうかを確認したいと思います。 データは、処理された衛星レーダーデータから継続的に生成され、グローバルカバレッジになります。衛星の解像度と地球の土地被覆率に基づいて、全データセットを推定して、地球上の750億の場所で値を生成します。単一の衛星の寿命にわたって、出力はこれらの場所のそれぞれで最大300の値を生成します(したがって、22兆を超える値の合計データセット)。これは1つの衛星のためのものであり、軌道上にはもう1つの衛星があり、新しい数年でもう2つの衛星が計画されています。したがって、多くのデータがあります!単一のデータアイテムは非常に単純で、(経度、緯度、値)のみで構成されますが、アイテムの数が原因で、1つの衛星で最大100 TBを生成すると推定しています。 書き込まれたデータは更新する必要はありません。新しい衛星の取得が処理されると成長するからです。書き込みパフォーマンスは重要ではありませんが、読み取りパフォーマンスは重要です。このプロジェクトの目標は、Googleマップ上のレイヤーなどのシンプルなインターフェイスを介してデータを視覚化できるようにすることです。各ポイントには、時間の平均、勾配、または何らかの関数に基づいた色付きの値があります。(投稿の最後にデモ)。 これらの要件から、データベースはスケーラブルである必要があり、クラウドソリューションを検討する可能性があります。システムは、「points near(lat、lon)」や「points within(box)」などの地理空間クエリを処理できる必要があります。また、単一のポイントと最大で50,000ポイント(ただし、最大200,000ポイントが望ましい)。 これまでのところ、1億1100万の場所に最大7億5,000万のデータ項目のテストデータセットがあります。私はpostgres / postGISインスタンスを試してみましたが、これは問題なく動作しましたが、シャーディングの可能性がなければ、これはデータの増加に応じて対処できるでしょう。シャーディングでは、データボリュームに合わせて拡張するだけで十分な場合があります。最近、私はelasticsearchについて少し学んだので、これについてのコメントは私にとって新しいので役立つでしょう。 完全なデータセットで達成したいものの簡単なアニメーションを次に示します。 このgif(私のpostgresトライアルから)は(6x3)事前に計算されたラスタータイルを提供し、それぞれが〜200,000ポイントを含み、それぞれを生成するのに〜17秒かかります。ポイントをクリックすると、1秒未満で最も近い場所にあるすべての履歴値を取得して、グラフが作成されます。 長い投稿に謝罪、すべてのコメント/アドバイスは大歓迎です。

4
ID列のインデックスは非クラスター化する必要がありますか?
ID列を持つテーブルの場合、ID列に対してクラスター化または非クラスター化PK /一意のインデックスを作成する必要がありますか? その理由は、クエリ用に他のインデックスが作成されるためです。非クラスター化インデックス(ヒープ上)を使用し、インデックスでカバーされない列を返すクエリは、余分なクラスター化インデックスBツリーシークステップがないため、使用する論理I / O(LIO)が少なくなりますか? create table T ( Id int identity(1,1) primary key, -- clustered or non-clustered? (surrogate key, may be used to join another table) A .... -- A, B, C have mixed data type of int, date, varchar, float, money, .... B .... C .... ....) create …

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 = …

2
データベースのデフォルトの照合順序を変更したときのLatin1_General_BINのパフォーマンスへの影響
データベース照合をに設定して、Latin1_General_BIN文字列比較で大文字と小文字を区別します。これはパフォーマンスに影響しますか?データベースのDMLまたはDDL操作に影響はありますか?データベースは既にテーブルとともに存在しています。

4
SQL Serverは、15秒以上かかるI / O要求の発生を検出しました
実稼働SQL Serverには、次の構成があります。 3台のDell PowerEdge R630サーバーを可用性グループに統合3台すべてがRAIDアレイである単一のDell SANストレージユニットに接続されている 時々、PRIMARYで次のようなメッセージが表示されます。 SQL Serverは、データベースID 8 のファイル[F:\ Data \ MyDatabase.mdf]で完了するのに15秒以上かかるI / O要求が11回発生しました。OSファイルハンドルは0x0000000000001FBCです。 最新の長いI / Oのオフセットは0x000004295d0000です。 長いI / Oの継続時間は37397ミリ秒です。 パフォーマンストラブルシューティングの初心者です ストレージに関連するこの特定の問題のトラブルシューティングで最も一般的な方法またはベストプラクティスは何ですか?このようなメッセージの根本原因を絞り込むには、どのパフォーマンスカウンター、ツール、モニター、アプリなどを使用する必要がありますか?役立つ可能性のある拡張イベント、または何らかの種類の監査/ログがありますか?

2
結合ヒントを追加すると、SQL Serverの行の見積もりが変更されるのはなぜですか?
私はいくつかのテーブルを結合し、かなり悪いパフォーマンスを発揮するクエリを持っています-行の推定はかなり(1000回)オフであり、ネストされたループ結合が選択され、複数のテーブルスキャンが発生します。クエリの形状は非常に単純で、次のようになります。 SELECT t1.id FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id LEFT OUTER JOIN t3 ON t2.id = t3.t2_id LEFT OUTER JOIN t4 ON t3.t4_id = t4.id WHERE t4.id = some_GUID クエリをいじると、結合の1つにMerge結合を使用するようにヒントを出すと、実行が何倍も速くなることに気付きました。これは理解できます-結合結合は、結合されるデータにとってより良いオプションですが、SQL Serverはネストされたループを選択するだけでは正しく推定しません。 私が完全に理解していないのは、この結合ヒントがすべてのプラン演算子のすべての推定値を変更する理由です。さまざまな記事や本を読んで、計画を構築する前にカーディナリティの推定が実行されると想定したため、ヒントを使用しても推定は変更されず、SQL Serverに特定の物理結合実装を使用するよう明示的に指示します。 ただし、Mergeヒントを使用すると、すべての推定がほぼ完璧になります。なぜこれが起こるのか、ヒントなしでクエリオプティマイザーがより良い推定を行う一般的な手法はありますか?統計が明らかにこれを許可していることを考慮して? UPD:匿名化された実行計画はここにあります:https : //www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan ? dl = 0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hints_join.sqlplan?dl = 0 TF 3604、9202、9204を使用して両方のクエリで使用される統計情報を確認しましたが、これらは同じです。ただし、スキャン/シークされるインデックスはクエリによって異なります。 それに加えて、クエリを実行しようとしましたOPTION …

2
1秒未満で発生するブロッキングを追跡する方法-SQL Server
1秒未満で発生するブロッキングの問題をトラブルシューティングしようとしています。OLTPアプリケーションは非常に機密性が高く、合意されたSLAに従って一部のトランザクションの応答時間が200ミリ秒未満である必要があります。新しいコードリリースにはロックエスカレーションの問題がいくつかあり、更新プログラムのバッチサイズを小さくすることで解決できました。バッチサイズが小さい場合でも、新しいspがOLTPトランザクションが更新しているのと同じ行をブロックしていると思われます。 ブロックされているセッションと待機しているリソースを見つける必要があります。私の理解では、「ブロックされたプロセスのしきい値」は最低1秒に設定できるため、ブロックはキャプチャされません。 wait_infoイベントとwait_completed xイベントを試しています。 これを追跡できる他の方法はありますか。ありがとう

4
CXPACKET待機の処理-並列処理のコストしきい値の設定
Sharepointサイトのトラブルシューティングに関する以前の質問のフォローアップとして、CXPACKETの待機について何かできるかどうか疑問に思いました。 ひざまずく解決策は、MAXDOPを1に設定することですべての並列処理をオフにすることであることを知っています。これは悪い考えのように聞こえます。しかし、別のアイデアは、並列処理が開始される前にコストのしきい値を増やすことです。実行計画のコストのデフォルトの5はかなり低いです。 だから私は、実行計画コストが最も高いクエリを見つけるクエリがすでに書かれているのだろうかと思っていました(実行期間などが最も長いクエリを見つけることができることを知っていますが、実行プランのコストはどこかで取得可能です、また、そのようなクエリが並行して実行されたかどうかも教えてくれます。 誰かがそのようなスクリプトを手元に持っていますか、またはこれを見つけるために関連するDMV、DMFまたは他のシステムカタログビューの方向に私を向けることができますか?

1
多くのINSERTとbyteaの更新のためにPostgreSQLを最適化します
私たちが持っているもの(ソフトウェア): 基本構成のPostrgeSQL 9.3(変更なしpostgresql.conf) Windows 7 64ビット ハードウェア: インテルCore i7-3770 3.9 Ghz 32 Gb RAM WDC WD10EZRX-00L4HBAtaドライブ(1000Gb、SATA III) したがって、DB aproxにロードする必要があります。bytea列を含む100.000.000行、およびより単純な500.000.000行(LOBなし)。1つ目のテーブルには2つのインデックス(長さ13、19)があり、2つ目のテーブルには2 つのインデックス(長さ18、10)があります。各テーブルのID生成のシーケンスもあります。varcharvarchar 現在、これらの操作は、JDBCバッチサイズ50と並行して8つの接続で実行されています。次の図は、システム負荷を示しています。これはpostgresqlプロセスの負荷がゼロです。24時間のロード後、10.000.000行しかロードしていません。これは非常に遅い結果です。 以下のPostrgreSQL目的で、構成の調整について支援を求めています。 1)この量のデータを超高速でロードする場合、これは1回のみの操作であるため、一時的な構成になる可能性があります。 2)結合やソートを行わずに、インデックスによってこれら2つのテーブルに適度な数のSELECTを実行する本番モードの場合。

2
2,500万行以上のクエリの最適化
私はMS SQLを使用しており、同じテーブルに対して異なる基準でいくつかのクエリを実行する必要があります。最初は元のテーブルで各クエリを実行しましたが、それらはすべて何らかのフィルタリング(つまり、日付、ステータス)を共有しています。これには長い時間がかかりました(約2分)。 データ行に重複があり、すべてのインデックスがクラスタリングされていません。私の基準では4列のみに関心があり、結果はすべてのクエリについてカウントのみを出力するはずです。 :列は、必要に応じてTABLE、FIELD、AFTER、DATE、とのそれぞれにインデックスがあるDATEとはTABLE。 必要なフィールドのみを含む一時テーブルを作成した後、1:40分になりましたが、それでも非常に悪いです。 CREATE TABLE #TEMP ( TABLE VARCHAR(30) NULL, FIELD VARCHAR(30) NULL, AFTER VARCHAR(1000) NULL, DATE DATETIME, SORT_ID INT IDENTITY(1,1) ) CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID) INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE) SELECT TABLE, FIELD, AFTER, DATE FROM mytbl WITH (NOLOCK) WHERE TABLE = 'OTB' …

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

3
並列実行のためにスカラー関数をTVF関数に変換-引き続きシリアルモードで実行
の私のクエリの1つは、リリース後にシリアル実行モードで実行されていましたが、アプリケーションから生成されたLINQ to SQLクエリで参照されるビューで2つの新しい関数が使用されていることに気付きました。そのため、これらのSCALAR関数をTVF関数に変換しましたが、クエリはシリアルモードで実行されています。 以前、他のいくつかのクエリでスカラーからTVFへの変換を実行し、強制的なシリアル実行の問題を解決しました。 これがスカラー関数です: CREATE FUNCTION [dbo].[FindEventReviewDueDate] ( @EventNumber VARCHAR(20), @EventID VARCHAR(25), @EventIDDate BIT ) RETURNS DateTime AS BEGIN DECLARE @CurrentEventStatus VARCHAR(20) DECLARE @EventDateTime DateTime DECLARE @ReviewDueDate DateTime SELECT @CurrentEventStatus = (SELECT cis.EventStatus FROM CurrentEventStatus cis INNER JOIN Event1 r WITH (NOLOCK) ON (cis.Event1Id = r.Id) WHERE (r.EventNumber = …

3
一括削除後にmysqlテーブルのインデックスを再作成する必要がありますか?
MySQLに、毎秒多くのINSERTとSELECTを実行するテーブルがあります。そして、1日に1回、古いデータの一括削除があります。削除後にテーブルのインデックスを再作成する必要がありますか?性能を上げたい。誰かがいくつかのヒントを提案できますか?ストレージエンジンとして「innodb」を使用する。変更する必要がありますか?同時挿入と選択の方が良いと思います。あなたの提案をお願いします。インデックスの再作成を行う必要がありますか? 前もって感謝します..

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