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

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

1
OPTION FORCE ORDERにより、行が削除されるまでパフォーマンスが向上します
やや複雑なSQL Server 2008クエリ(約200行のかなり高密度のSQL)があり、必要なときに実行されませんでした。時間の経過とともに、パフォーマンスは約0.5秒から約2秒に低下しました。 実行計画を見ると、結合を並べ替えることでパフォーマンスが向上することは明らかでした。私はそうしました、そしてそれは...約0.3秒にまで減少しました。これで、クエリに「OPTION FORCE ORDER」というヒントが追加されました。 今日、私はデータベースをクリーンアップします。行の約20%をアーカイブし、行を削除する以外は関連するデータベースでアクションを実行しません...実行プランは完全にホースされます。特定のサブツリーが返す行数を完全に誤って判断し、(たとえば)次のものを置き換えます。 <Hash> と <NestedLoops Optimized='false' WithUnorderedPrefetch='true'> これで、クエリ時間が約0.3秒から約18秒に急上昇します。(!)行を削除したからといって。クエリヒントを削除すると、クエリ時間は約2秒に戻ります。良いが悪い。 データベースを複数の場所とサーバーに復元した後、問題を再現しました。各テーブルから行の約20%を削除するだけで、常にこの問題が発生します。 強制結合順序がクエリの見積もりを完全に不正確にする(したがってクエリの時間を予測できない)のは、これが正常ですか? 最適ではないクエリのパフォーマンスを受け入れる必要があるか、それともタカのように見て、頻繁に手動でクエリのヒントを編集する必要があると思いますか?または、すべての結合についてもヒントがありますか?.3sから2sは大ヒットです。 行を削除した後にオプティマイザが停止した理由は明らかですか?たとえば、「はい、サンプルスキャンを実行しました。データ履歴の前半でほとんどの行をアーカイブしたため、サンプルはスパースな結果を生成したため、ソートされたハッシュ演算の必要性を過小評価していました」 実行計画を見たい場合は、投稿できる場所を提案してください。そうでなければ、私は最も素晴らしいビットをサンプリングしました。これが根本的な誤推定です。括弧内の数字は(推定:実際の)行です。 / Clustered Index Scan (908:7229) Nested Loops (Inner Join) --< \ NonClustered Index Seek (1:7229) 内部ループは908行をスキャンすると予想されますが、代わりに52,258,441をスキャンすることに注意してください。正確であれば、このブランチは12秒ではなく、約2ミリ秒で実行されたはずです。行を削除する前に、この内部結合の推定は合計係数2だけオフであり、2つのクラスター化インデックスのハッシュ一致として実行されました。

2
SQL I / O SimとSQL IOツールの違いは何ですか?
ベンチマークツールでさまざまなSQL Serverの代替案をテストしたい。マイクロソフトの2つのツールを見つけました。 SQLIOディスクサブシステムベンチマークツール SQL IO Sim それらの違いは何ですか?同じことですか? ありがとう!

1
sp_executeは、タイプ 'int'のパラメータ '@handle'を予期しています
宛先データベースにテーブルが存在するかどうかをストアドプロシージャでチェックインしようとしています。そうでない場合は、ソースデータベースのinformation_schemaテーブルを使用してテーブルを作成します。しかし、sp_executeを使用して、テーブルが存在する場合に返してみると、エラープロシージャで型 'int'のパラメーター '@handle'が予期されます。 @handleパラメータを使用していません。誰かがこのエラーの意味を教えてもらえますか?なぜ私がそれを受け取っているのですか?私のコードの関連部分は以下です。 DECLARE @SQL NVARCHAR(MAX), @Parameters NVARCHAR(4000), @TableNotExists INT, @SourceTable NVARCHAR(200), @DestDB NVARCHAR(200) BEGIN SET @SourceTable = 'table' SET @DestDB = 'database' SET @Parameters = N'@SourceTableIN NVARCHAR(200), @TableNotExistsOut INT OUTPUT' SET @SQL = N'USE [' + @DestDB + '] IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE …

1
SQL Serverジョブのタイムアウト
したがって、SQL Serverジョブの各ステップごとにタイムアウトを設定することはできないようです(StackExchangeの記事)。 もちろん、エージェントのタイムアウトを設定できることをMSDNは指摘しています。 SQL Serverエージェントのプロパティ。 ジョブ実行シャットダウンを設定します。 ご質問 エージェントのタイムアウトはどのように機能しますか? シングルステップタイムアウトを設定する他の方法(できれば構成による)はありますか? ジョブ全体のタイムアウトを設定する他の方法(できれば構成による)はありますか?

3
SQL Server 2012 Standard Edition-複数のインスタンスとメモリ使用率
RAMが192 GBの1台のサーバー上にSQL Server 2012 Standard Editionの複数のインスタンス(64 GBのメモリ制限がある)がある場合、両方のインスタンスが最初の64 GBのメモリにしかアクセスできないか、または別のインスタンスにアクセスできるかそれぞれが独自の64 GBの「チャンク」を持つことができるように、メモリの一部。 これは、両方のノードが単一のノードにフェイルオーバーする場合のアクティブ/アクティブクラスターの考慮事項です。

2
SQL Serverの「データベースの作成」ステートメント。自動拡張設定を継承する方法は?
SQL Server 2008 R2を使用しており、継続的な展開を通じてデータベースを作成しています。 私たちのシステムでは、SQL Serverのデフォルトの1Mb / 10%自動拡張設定は、データを適切に処理しません。特に、スキーマをあまり変更できないレガシーアプリケーションがあるためです。データベースの設定をインスタンスレベルで構成して、段階的な展開で変更できるようにします。 新しいデータベースのデフォルト設定が「モデル」の設定に基づいていることをいくつか読んだことがありますが、これはSQL Management Studio UIで新しいデータベースをクリックすることによってのみ機能し、スクリプト、たとえばCREATE DATABASE [MyDb]からは機能しないようです。 msdn.microsoft.com/en-us/library/ms186388(v=sql.105).aspx sqlservercentral.com/Forums/Topic1065073-391-1.aspx /programming/8828557/possible-to-configure-database-autogrowth-settings-at-the-instance-level/8828604#comment15586568_8828604 実際にこれを作成スクリプトで機能させる人はいますか?サーバーインスタンスごとに自動拡張を設定できる別の方法はありますか?

1
単一の包含データベースのユーザーを作成する
私はMSSQLでの作業はかなり新しく、現時点では2012バージョンを使用しています。私がやろうとしているのは、包含データベースのユーザーを作成し、そのユーザーにそのデータベースへのアクセスのみを許可することです。 準備済みステートメントを使用して、JavaからこのSQLを呼び出します。

2
数行を巨大なテーブルに挿入するとパフォーマンスが低下する
店舗からデータを取得し、会社全体の在庫表を更新するプロセスがあります。このテーブルには、日付別およびアイテム別のすべてのストアの行があります。多くの店舗を持つ顧客では、このテーブルは非常に大きくなる可能性があり、5億行程度になります。 この在庫更新プロセスは、通常、ストアがデータを入力するときに1日に何度も実行されます。これらの実行は、ほんの数店舗のデータを更新します。ただし、これを実行して、たとえば過去30日間のすべての店舗を更新することもできます。この場合、プロセスは10のスレッドを起動し、各ストアの在庫を別のスレッドで更新します。 お客様から、プロセスに時間がかかっているとの不満が寄せられています。プロセスのプロファイルを作成したところ、このテーブルにINSERTを実行する1つのクエリが予想以上に多くの時間を消費していることがわかりました。このINSERTは、30秒で完了する場合があります。 このテーブルに対してBEGIN TRANとROLLBACKで区切られたアドホックSQL INSERTコマンドを実行すると、アドホックSQLはミリ秒のオーダーで完了します。 パフォーマンスの遅いクエリは次のとおりです。アイデアは、そこにないレコードを挿入し、後でデータのさまざまなビットを計算するときにそれらを更新することです。プロセスの前のステップでは、更新する必要のあるアイテムを特定し、いくつかの計算を行い、結果をtempdbテーブルUpdate_Item_Workに詰め込みました。このプロセスは10個の個別のスレッドで実行されており、各スレッドはUpdate_Item_Workに独自のGUIDを持っています。 INSERT INTO Inventory ( Inv_Site_Key, Inv_Item_Key, Inv_Date, Inv_BusEnt_ID, Inv_End_WtAvg_Cost ) SELECT DISTINCT UpdItemWrk_Site_Key, UpdItemWrk_Item_Key, UpdItemWrk_Date, UpdItemWrk_BusEnt_ID, (CASE UpdItemWrk_Set_WtAvg_Cost WHEN 1 THEN UpdItemWrk_WtAvg_Cost ELSE 0 END) FROM tempdb..Update_Item_Work (NOLOCK) WHERE UpdItemWrk_GUID = @GUID AND NOT EXISTS -- Only insert for site/item/date combinations that don't …

2
SQL Serverは外部キー参照のインデックスキーをどのように選択しますか?
MS Accessからインポートされたレガシーデータベースを使用しています。MS Access> SQL Serverのアップグレード中に作成された、クラスター化されていない一意の主キーを持つ約20のテーブルがあります。 これらのテーブルの多くには、主キーの複製である一意の非クラスター化インデックスもあります。 私はこれを片付けようとしています。 しかし、主キーをクラスター化インデックスとして再作成した後、外部キーを再構築しようとすると、外部キーが(重複していた)古い重複インデックスを参照しています。 重複したインデックスを削除できないため、これを知っています。 SQL Serverでは、主キーが存在する場合は常にそれを選択すると思います。SQL Serverには、一意のインデックスと主キーの間で選択する方法がありますか? 問題を再現するには(SQL Server 2008 R2の場合): IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Child') DROP TABLE Child GO IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Parent') DROP TABLE Parent GO -- Create the parent table CREATE …

2
SQL Serverは行ごとに関数を1回評価しますか?
次のようなクエリがあります。 SELECT col1 FROM MyTable WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) BETWEEN col2 AND col3 ; これにより、次のような実行プランのツールチップが表示されます。 dateadd求める述語の一部は、クエリ内のすべての行に対して実行されますか?または、SQL Serverはクエリ全体の値を1回計算しますか?

4
本当に.LDFファイルを保持する必要がありますか?
毎月、本番データベースの月末のスナップショットを作成しています。これらの月末のスナップショットは、レポート作成のみを目的としており、挿入、更新、削除は行われていません。これらの各スナップショットには、.MDFand .LDFファイルがあります。 .LDFファイルを削除してサーバーの空き容量を増やしたい。.LDFファイルを保持する必要がある理由はありますか? 明確化: 本番データベースは、別のシステムからのファイル抽出から毎晩再作成されます。本番データベースからのレポートのみです...更新は行われません。 毎晩のプロセス: 私が言えることから... 毎晩、データベーステーブルは切り捨てられ ますテーブルは、一連の一括挿入ステートメントを介して入力 されますインデックスは再構築されます

5
RESTORE DATABASEイベント後にストアドプロシージャを自動的に実行する
それが持っていることが可能であるSQL Server 2008 R2の標準が自動的にされる任意のデータベースにストアド・プロシージャを実行復元またはattachcedインスタンスに? DDLイベントの後、CREATE_DATABASEまたはALTER_DATABASE起動された後に、特定のデータベースでストアドプロシージャを実行するサーバーレベルのトリガーを作成することで、ソリューションに近づきました。残念ながら、これはデータバックバックアップの復元では機能しません。 詳しく説明すると、復元するすべてのデータベースに存在する「クリーンアップ」ストアドプロシージャがあり、バックアップがインスタンスに復元されるたびにこれを自動的に実行する方法を探しています。 グーグルによって、SQL Serverで監査またはポリシーを構成してこの機能を取得するよう指示されましたが、これらの機能は一見すると非常に圧倒されるため、監査または警察が調査を開始するための手段であるかどうかわかりません。

1
sp_executesqlのセキュリティ上の意味は何ですか?
デフォルトでは、SQL Serverでは、[public]ロールはEXECUTEに対する権限を持っていsp_executesqlます。 ただし、以前のDBAがのEXECUTE権限を取り消したデータベースサーバーを継承しましたsp_executesql。 一時的な回避策として、私は必要に応じて(masterデータベースのロールを介して)にEXECUTE権利を付与していsp_executesqlます。しかし、これはメンテナンスの問題になり始めています。 私が許可した場合EXECUTE、公開に戻って、私が知っておく必要がある任意の影響がありますか。

1
SQL ServerのFILL FACTORがデフォルトで0(100%)になるのはなぜですか?
FILL FACTOR、ページ、インデックス構造を理解しているため、100%FILL FACTORがまれなベストプラクティスである理由を理解しています。それでは、なぜデフォルトで0(または100%)になっているのですか?なぜ90または95ではないのですか? 行方不明のものはありますか?

3
トランザクションログファイルを別のドライブに配置すると、パフォーマンス上のメリットはありますか?
SQL Serverデータファイルを1つのハードドライブに配置し、トランザクションログを別のハードドライブに配置することのメリットを称賛する多くのブログ投稿とベストプラクティスの記事があります。理由は、トランザクションログにはシーケンシャルな書き込みしかありませんが、データベースファイルではランダムな読み取りと書き込みが発生するためです。 しかし、何百ものデータベースがある場合はどうでしょうか?数百のトランザクションログファイルを別のディスクに配置することには、本当にパフォーマンス上のメリットがありますか 複数のトランザクションログが書き込まれている場合、トランザクションログの書き込みはデータベースの書き込みと同じくらいランダムになると思います。

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