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

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

2
パラメータスニッフィングの回避策
私は過去に2つの方法を使用してパラメータースニッフィングの問題を回避しました: 1)使用WITH RECOMPILE 2)パラメータ値をローカル変数に再割り当てし、パラメータの代わりにそれらを使用します 私が理解していることから、これらの両方の最終結果は同じです-現在のクエリ/パラメーターに最適化された新しい実行プランが作成され、使用されます。 これに該当する場合、これら2つの方法の間に違いはありますか、それとも本質的に同じですか?どちらか一方がもう一方よりも望ましいですか?


3
中央データベースに関数を作成するか、各データベースで繰り返しますか?
私の開発者の1人が、VB.Net関数(LastIndexOf)のように機能し、それを公開したいSQL関数を作成しました。私の質問は、これを中央データベースに配置するのではなく、各ユーザーデータベースに配置する理由は何ですか? 開発者はそれを自分のマスターデータベースのsysスキーマに配置しようとしていたため、ユーザーデータベースからの呼び出しを修飾する必要はありませんでした...ため息 しかし、私はそれを(明らかにマスターデータベースではなく)各ユーザーデータベースに対して集中化するための有効な言い訳が何であるかがわかりませんでしたか?

3
論理読み取りとスキャン数
SQL Server 2008で大きなテーブル(8M行)に対して小さなテーブル(1,000行)を結合しています。結合は大きなテーブルで非クラスター化カバリングインデックスを使用し、結合により3つのクエリプランが生成されます。私はどちらの計画がより良いかを理解しようとしていますが、この知識を一般化して、次回SQL I / O統計を調べるときに使用するヒューリスティックをよりよく理解できるようにしたいと考えています。 プラン#1はループ結合であり、次のような大きなテーブルの統計を出力します。 Scan count 2582, logical reads 35686, physical reads 1041, read-ahead reads 23052 プラン#2はマージ結合であり、次のような統計を出力します。 Scan count 1, logical reads 59034, physical reads 49, read-ahead reads 59004 プラン#3はハッシュ結合であり、次のような統計を出力します。 Scan count 3, logical reads 59011, physical reads 5, read-ahead reads 59010 カバリングインデックスはによって注文され(ID, Date)ます。クエリは、IDの約50%のデータを返し、各IDについて、最新の3か月のデータの連続したチャンクを返します。これは通常、各IDの約1/4または行です。クエリは、インデックスの合計行の約1/8を返します。言い換えると、クエリはまばらですが一貫してまばらです。 ディスクヘッドを2,500回(場合によっては1,041回)動かすのは、逐次ディスクスキャンよりもはるかにコストがかかるため、計画1はこのワークロードにとってはひどいものであると想定しています。また、#3と#2には類似した順次(したがってより効率的な)I / Oパターンがあると想定しています。 …

2
トランザクションログとミラーリング-可能な最も愚かな説明を探す
まず、トランザクションログの概念に苦労していることを認めなければなりません。つまり、データベースで発生するすべてのトランザクションのログであることは理解していますが、タスク内のコンテキストに適切に配置することに関しては、明らかに何かが欠けています。ですから、質問に答える人なら誰でも、トランザクションログの背後にある理論を自由に拡張してください。 主な質問は-SQL Server 2008と2 GBのデータベースがあり、ミラーリングが必要です(12 GBのトランザクションログがあります)。そのデータベースをミラーリングしていない場合は、シンプルモードに切り替えるか、バックアップ後にログを切り捨てることができると思います。しかし、この場合、トランザクションログを管理したい場合はどうすればよいですか?私が理解しているように、データベースを簡単にミラーリングしたい場合は(フルバックアップを実行するだけ)、トランザクションログ全体を保持する必要があります。 これを回避する方法はありますか?理想的には、毎回MDFとLDFの両方を1つのファイルに保存するバックアップが可能であり、バックアップが実行された後、データベースのトランザクションログ(LDF)が0に減少したことを望みます。このシナリオの問題は、増分バックアップです-最初のバックアップの場合切り捨てられたログでは、後でミラーリングを行う場合、2番目のバックアップが最初のバックアップを参照する必要があると思います(つまり、1つではなく多数のファイルを保持することで立ち往生します)。 だから-この問題について誰かが私を啓発できますか?私はここで多くの穴を埋めようとしていることと、提案された「ソリューション」が最良のものではない可能性があることを理解していますが、誰かがトランザクションログの正しい方向に押し出してくれれば、ミラーリングへの影響と最良の結果が得られることを心から感謝しますそれらの2つの実践。


1
ストレージの順序と結果の順序
これは、主キーで指定されたソート順から派生した質問ですが、ソートはSELECTで実行されます。 @Catcallは、ストレージの順序(クラスター化インデックス)と出力の順序についてこれを述べています。 多くの人々は、クラスター化インデックスが出力のソート順を保証すると信じています。しかし、それはそうではありません。ディスク上のストレージの順序を保証します。 たとえば、このブログ投稿をご覧ください。 Hugo Kornelisによるブログ投稿を読みましたが、インデックスがSQLサーバーが特定の順序でレコードを読み取ることを保証するものではないことを理解しています。しかし、自分のシナリオではこれを想定できないことを受け入れるのに苦労していますか? CREATE TABLE [dbo].[SensorValues]( [DeviceId] [int] NOT NULL, [SensorId] [int] NOT NULL, [SensorValue] [int] NOT NULL, [Date] [int] NOT NULL, CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED ( [DeviceId] ASC, [SensorId] ASC, [Date] DESC ) WITH ( FILLFACTOR=75, DATA_COMPRESSION = PAGE, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, …

1
SQL Server 2005のページの平均余命が0(ゼロ)である理由
SQL Serverのページの平均寿命を知りたいと思っています。そこで、Performを使用してカウンターを確認します。値はゼロで、決して変更されません。バグがあるのではないかと思ったので、SQL Server DMVクエリを確認しました SELECT [object_name],[counter_name],[cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Manager%' AND [counter_name] = 'Page life expectancy' また、終日ゼロを返します。 これをより興味深いものにするために、平均で99〜100の「バッファーキャッシュヒット率」カウンターを確認しました。 では、「バッファキャッシュヒット率」が100の場合、ページの平均余命はどのようにゼロになるのでしょうか。 何が欠けていますか?常にゼロの場合、バッファキャッシュに何も残っていないことを意味します。バッファキャッシュヒット率が100の場合、これは正しくないように見えますか? 前もって感謝します

1
SQL Server 2000から2008へのトランザクションレプリケーション
トランザクションレプリケーションを使用してSQL Server 2008 R2データベースに複製しようとしている2つのSQL Server 2000サーバーにレガシーデータベースがあります。 2008サーバーは同じLAN内にないため、インターネット経由で複製しています。次のMohammedU(およびその他)の説明に従って、各サーバーが多少なりとも(レプリケーションに必要な)名前で他のサーバーに接続できるようにエイリアスを作成しました。http://social.msdn.microsoft.com/forums/en-US/ sqlreplication / thread / 9a8cf6b1-a449-4748-b3c2-1c13e2bfcc5b / 唯一の違いは、SS2000マシンにエイリアスを作成するために、Configuration Managerではなくクライアントネットワークユーティリティを使用したことです。これは正常に動作するようです。 両方のディストリビューターになるように、1つのSS2000サーバー(Distributorと呼びます)をセットアップしました。ディストリビューターでパブリケーションを正常に作成し、SS 2008サーバーへのプッシュサブスクリプションを使用してそれらをレプリケートしました。 これで、2番目のSS2000サーバーにパブリケーションを設定しました。これをパブリッシャーと呼びます。同じ方法でプッシュサブスクリプションを作成しました。これらのサブスクリプションは機能していません。 ディストリビューターのレプリケーションモニターで、パブリッシャーのパブリケーションのディストリビューションエージェントに次のエラーメッセージが表示されます。 Error message: The process could not connect to Subscriber 'SUBSCRIBER' Error details: Login failed for user 'SUBSCRIBER\Guest.' (Source: SUBSCRIBER (Data source); Error number: 18456) サブスクライバーでプルサブスクリプションを作成してみました。ウィザードによると、それらは正常に作成され、対応するディストリビューションエージェントはディストリビューターのレプリケーションモニターに正しく表示されましたが、レプリケーションは行われませんでした。エージェントは、スナップショットが利用可能であっても利用できなかったというメッセージを表示し続けました。 誰か助けてもらえますか?


1
再帰的なCTEパフォーマンス
再帰的なCTEパフォーマンスのヘルプが必要です。CTE以下では、階層データを再帰的にプルしようとしているため、実行速度が非常に遅くなっています。テーブルは大きく、すべてのルートIDに最大3つの再帰的なアイテムIDがあります。約200000以上のルートIDが存在する可能性があります。アンカーのすべてのrootidは再帰的にitemidになるため、再帰的なCTEは巨大なデータセットでは遅いことを知っています。 スキーマ: Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime) 上記の表には100万行を超える行があります。 CTEクエリ: ; With rootcte as ( select itemid from RootItem where rootid is null union all select r.itemid as RootId , i.itemid from RootItem i join rootcte r on i.rootid = r.itemid ) テーブルスキーマを変更してheirarchyidを使用することはできません。whileループも試しましたが、それも遅いです。 このクエリを最適化できる他の方法はありますか? …

1
SQL Browserサービスが無効になるのはなぜですか?
私たちの製品をインストールするソフトウェアインストールパッケージ(InstallShield / InstallScriptを使用して作成された)に断続的な問題があります。インストールの処理中に、SQLブラウザーサービスを再起動します。ほとんどの場合、これは正常に機能します。しかし、時々-そして私はこれを予測どおりに再現する方法を考え出していない-サービスが再起動に失敗し、「サービス」マネージャーでサービスのステータスが「無効」に設定されていることがわかりました。 サービスが無効になる原因は何か、それを防ぐ方法はありますか?

3
孤立したユーザー「guest」を修正しますか?
特別なguestユーザーが孤立している(ログインにリンクされていない)場合、何ができますか? 私のデータベースの1つ(SQL Server 2005)では、次のコマンドを実行すると、ゲストユーザーが孤立したユーザーとしてリストされます。 exec sp_change_users_login 'report' 結果: UserName UserSID guest 0x3C2E66759FFBC14F84127D6795C27FD3 その手順を使用してゲストユーザーを修正しようとすると、次のようになります。 exec sp_change_users_login 'update_one', 'guest', 'guest' この手順を終了しています。'guest'は、この手順でのログイン名パラメーターの禁止値です。 ユーザーを削除しようとすると、次のようになります。 ユーザー「guest」は削除できません。無効にすることしかできません。 select * from sys.database_principals where name = 'guest' 結果: name guest principal_id 2 type S type_desc SQL_USER default_schema_name guest create_date 11/13/98 2:58 AM modify_date 10/16/01 4:31 PM owning_principal_id NULL …


2
可用性グループはトランザクションレプリケーションを置き換えることができますか?
SQL Server 2012の新機能と、それが現在の状況にどのように役立つかを検討してきました。 現在、SQL Server 2008 R2を使用しており、トランザクションレプリケーションを介して2つのOLTPサーバーのデータベースを1つのレポートサーバーに複製します。次に、これらの複製されたDBをレポートに使用します。 SQL Server 2012と可用性グループでこれを置き換えることができるかどうかに興味があります。トランザクションレプリケーションの代わりに、新しい可用性グループを使用して、2つのOLTPサーバーのデータベースをレポートサーバーにミラーリングします。読み取り専用レプリカにアクセスします。 これがうまく機能するか、それともまったく機能しないかはわかりません。 レプリケーション(VSDBCMD.exeの使用)で問題が発生するため、レプリケーションを回避します。大規模なDBでのレプリケーションの再初期化の遅延を回避したいのですが。 誰か良い例や経験がありますか?以前のバージョンでの通常のミラーリングのように、複数のサーバーから単一のサーバーに読み取り可能なレプリカでミラーリングすることは可能ですか? これはもともとここで尋ねられました:https : //stackoverflow.com/questions/10415225/mirroring-and-availability-groups-in-sql2012申し訳ありませんが、まだ質問を移行することはできません。

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