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

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


2
SQL Serverデータツールとパーティション関数
私はスライディングウィンドウの読み込みシナリオを作成していますが、パーティション関数は時間とともに境界を変更します。 SQL Serverデータツール(SSDT)データベースプロジェクトに、いくつかの初期境界をハードコーディングしたパーティション関数を作成しました。 ただし、時間が経つとパーティション関数の境界が変化すると、将来のSSDTデータベースの公開では、境界が元の境界に戻ります。 おそらくパーティション機能の公開を無効にすることで、このシナリオを適切に処理する方法はありますか? 私は変更しようとしたビルドアクションデフォルトから、SSDTに分配関数のプロパティをBuildする、Noneが、その後のプロジェクトが原因によっては、オブジェクトで不足している参照にビルドに失敗します。
16 sql-server 

1
RECOMPILEクエリヒントを使用する場合のクエリ間の実行時間の著しい違い
同じSQL Server 2005インスタンスで2つのほぼ同一のクエリを実行しています。 最初のSELECTクエリは、LINQによって生成された元のクエリです(私は知っています、私は知っています...私はアプリケーション開発者ではなく、DBAです:)。 2番目のものは最初のものとまったく同じOPTION (RECOMPILE)で、最後にaが追加されています。 他に変更はありません。 最初のものは、実行のたびに55秒かかります。 2番目は2秒かかります。 両方の結果セットは同じです。 このヒントがパフォーマンスの劇的な向上をもたらすのはなぜですか? Books OnlineのエントリにRECOMPILEは、あまり詳細な説明はありません。 クエリの実行後にクエリに対して生成されたプランを破棄するようにSQL Serverデータベースエンジンに指示し、同じクエリが次に実行されるときにクエリオプティマイザにクエリプランを再コンパイルさせます。RECOMPILEを指定しないと、データベースエンジンはクエリプランをキャッシュし、それらを再利用します。クエリプランをコンパイルするとき、RECOMPILEクエリヒントは、クエリ内のローカル変数の現在の値を使用し、クエリがストアドプロシージャ内にある場合、現在の値をパラメータに渡します。 RECOMPILEは、ストアドプロシージャ全体ではなく、ストアドプロシージャ内のクエリのサブセットのみを再コンパイルする必要がある場合に、WITH RECOMPILE句を使用するストアドプロシージャを作成するための便利な代替手段です。詳細については、「ストアドプロシージャの再コンパイル」を参照してください。RECOMPILEは、プランガイドを作成するときにも役立ちます。詳細については、「プランガイドを使用したデプロイ済みアプリケーションでのクエリの最適化」を参照してください。 クエリには多くのローカル変数があるため、OPTION (RECOMPILE)クエリヒントを使用すると、SQL Serverは(真剣に)最適化できると推測されます。 私が見ているところはどこでも、それOPTION (RECOMPILE)は避けるべきだと言っている。この説明は、一般に、このヒントを使用すると、SQL Serverはこの実行計画を再利用できないため、毎回再コンパイルする時間を無駄にする必要があるというものです。(しかし)パフォーマンスが非常に優れていることを考えると、今回はこのクエリヒントを使用するのは良いことだと思います。 使用すべきですか?そうでない場合、このヒントとアプリケーションを変更せずに、SQL Serverにより良い実行計画を使用させることができますか?

1
テーブルが最後に更新された時刻を見つける
クエリ: SELECT name AS TableName, create_date AS CreatedDate, modify_date as ModifyDate FROM sys.tables order by ModifyDate; ...テーブルが最後に作成および変更された時間を(DDLの観点から)教えてくれます。しかし、実際のデータが最後にテーブルに挿入または削除された時間を知りたいのです。SQL Serverでこれを取得することは可能ですか?

2
動的SQLを使用して指定されたデータベースにビューを作成しますか?
別のデータベースにビューをドロップして作成するための動的SQLを作成しています。 だから私は書いた: set @CreateViewStatement = ' USE ['+ @DB +']; CREATE VIEW [dbo].[MyTable] AS SELECT ........something exec (@CreateViewStatement) それは私にエラーを与えます: 「CREATE VIEW」は、クエリバッチの最初のステートメントである必要があります。 USE DATABASEステートメントを削除すると正常に機能しますが、データベースは指定されなくなります。 この問題を解決するにはどうすればよいですか?

5
いずれかの列がNULLかどうかをテストします
私は、大きなテーブルの任意の列に少なくとも1つの空白(NULL /空)値があるエントリのリストがあるかどうかをテストするためにできる簡単なクエリを見つけようとしています。 私のようなものが必要です SELECT * FROM table AS t WHERE ANY(t.* IS NULL) やりたくない SELECT * FROM table AS t WHERE t.c1 = NULL OR t.c2 = NULL OR t.c3 = NULL これは巨大なクエリになります。

2
日付範囲を取得する最も効率的な方法
このようなテーブル構造で日付範囲を取得する最も効率的な方法は何ですか? create table SomeDateTable ( id int identity(1, 1) not null, StartDate datetime not null, EndDate datetime not null ) go との両方の範囲が必要だStartDateとしEndDateます。換言すれば、場合StartDateの間に落ちる@StartDateBeginと@StartDateEnd、とEndDateの間に落ちる@EndDateBeginと@EndDateEnd、その後、何かをします。 これについておそらくいくつかの方法があることは知っていますが、最も推奨されるのは何ですか?

4
SQL Server 2005/2008 UTF-8照合/文字セット
私はセットに直接オプション(複数可)を見つけることができませんUTF-8rellated Collations/Charsetsと同じで、他のSQLエンジンに設定することも可能ですが、SQL Serverの2005/2008はそこだけでラテン語とSQL照合順序は、SQL Serverの2005/2008に。 これらの照合/文字セットをSQL Serverエンジン(両方のバージョン)2005/2008 Win2008 OSで強制/インストールするオプションはありますか

1
シャーディングを教えている本に誰かが良い推薦をしますか?
誰でもdbシャーディングを教える本の良い推薦書を持っていますか(せいぜいゼロから) シャーディングについて話している40の異なるWebサイトを読みました。 私はオンラインサイト/ブログがお粗末だと言っているのではありません、彼らは良い力です。しかし、私はメインの食事が必要なだけでなく、あちこちで有用な情報が必要です。基本的に、シャーディングを実装する方法についてのアイディアはあると思いますが、それは非常に複雑な概念であるため、研究できるものはもっとたくさんあります。
16 mysql  sql-server 

7
これらのテーブル設計のうち、パフォーマンスに優れているのはどれですか?
アカウントで収集するための1日のコストを追跡する何かを作成するように求められ、これをサポートするデータベーステーブルスキーマを見つけようとしています。 これが私が知っていることです 会社は250万以上のアカウントを持っています これらのうち、彼らは現在、1か月あたり平均20万人働いています(現在は低い人員配置レベルで変化します) 追跡したい13の異なるコストタイプがあり、将来さらに追加する可能性があると警告しています。 コストを毎日追跡したい コストは在庫全体に分割されません。それらは、1か月あたり働くアカウント数(200,000)に分割されるか、ユーザーがアカウント識別子を入力してアカウントのグループにコストを適用するか、単にコストを適用するアカウントを指定できます。 最初に考えたのは、正規化されたデータベースです。 アカウントID 日付 CostTypeId 量 これに関する私の問題は、数学をすることです。このテーブルはすぐに巨大になります。13のすべてのコストタイプが今月のすべての作業済みアカウントに適用されると仮定すると200k * 13 * N days in month、これは1か月あたり約7500〜8000万レコード、または1年あたり約10億レコードになります。 私の2番目の考えは、それを少し非正規化することでした アカウントID 日付 総費用 CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13 この方法はより非正規化されており、1か月あたり最大600万レコード(200k * N days in month)、または1年あたり約7,200 万レコードを作成できます。最初の方法よりもはるかに少ないですが、将来会社が新しいコストタイプを決定した場合は、別のデータベース列を追加する必要があります。 2つの方法のうち、どちらがお好みですか?どうして?これをより良く処理できると考えられる別の選択肢はありますか? 私は、要約レポートと詳細レポートの両方のパフォーマンスのレポートに最も興味があります。アカウントに費用を配分するジョブは、誰もいないときに夜間に実行されます。二次的な懸念は、データベースのサイズです。既存のデータベースはすでに約300 GBであり、ディスク上のスペースは約500 GBであると思います。 データベースはSQL Server …

5
非クラスター化インデックスは、いつ別々のファイルグループに保存する必要がありますか?
別のファイルグループとドライブにインデックスを保存すると、ドライブがインデックスとインデックスが参照するデータとの間を行き来する必要がないため、データベースのパフォーマンスが向上すると聞きました。また、これは神話だと聞いたことがあります。 非クラスター化インデックスを別のファイルグループとドライブに保存することをお勧めします。どのようなperfmon / profilerの証拠がその結論に到達するのに私を導くでしょうか?ハードウェアは決定に役割を果たしますか(RAID / SANが単一のドライブで使用されるかどうか)?
16 sql-server  index 

2
SQL Server 2008-パーティション化とクラスター化インデックス
ですから、私のdb設計を完​​全に制御することはできません。そのため、このシナリオの目的のために現在のシステムの多くの側面を変更することはできません。 デザインの側面をどのように再考すべきかについてのコメントはおそらく正しいが、役に立たない:) 私は非常に大きなテーブルがあり、幅が約150フィールド、行が約600mあり、多数のプロセスを駆動します。これはデータウェアハウスの状況にあるため、スケジュールされたロードプロセス以外では更新/挿入が行われないため、インデックスが大量に作成されます。 このテーブルをパーティション分割しようとする決定が下されており、パーティション分割されたテーブルのインデックス作成に関して懸念があります。私はパーティション分割の経験がないので、入力やリンクを歓迎します。私はBOLまたはmsdnで私が特に望んでいるものを見つけることができませんでした。 現在IncidentKey、varchar(50)一意であるとは呼ばないフィールドにクラスターを作成します。1〜100個の同じレコードを持つことができますIK(コメントは不要です)。古いIncidentKeyレコードで新しいデータを取得することが多いため、どちらもシーケンシャルではありません。 IncidentDateパーティションが正しく機能するためには、パーティション化フィールドをクラスター化インデックスキーに含める必要があることを理解しています。そうなると思っていますIncidentKey, IncidentDate。 問題は、「新しい」パーティションのレコードがクラスター化インデックスの「古い」パーティションのレコードの前にある場合、クラスター化インデックスの仕組みはパーティションテーブルの2パートキーでどのように機能するかです。 たとえば、5つのレコードがあります。 IncidentKey Date ABC123 1/1/2010 ABC123 7/1/2010 ABC123 1/1/2011 XYZ999 1/1/2010 XYZ999 7/1/2010 新しいレコードを取得する場合ABC123, 2/1/2011は、クラスター化インデックスのBEFORE にある必要がありXYZ999, 1/1/2010ます。これはどのように作動しますか? 断片化とポインターを想定していますが、デュアルパートキーを持つパーティションテーブルの非パーティションクラスター化インデックスの物理ストレージと構成に関する情報が見つかりません。

7
別のSQL2008データベースへのテーブルの移動(インデックス、トリガーなどを含む)
1つのSQL2008データベースから別のSQL2008データベースへ、大量(100行以上)の大きなテーブル(数百万行)を移動する必要があります。 もともとインポート/エクスポートウィザードを使用していましたが、すべての宛先テーブルにプライマリキーと外部キー、インデックス、制約、トリガーなどがありませんでした(ID列もプレーンINTに変換されましたが、ウィザード。) これを行う正しい方法は何ですか? これがほんの2、3のテーブルである場合、ソースに戻り、テーブル定義(すべてのインデックスなどを含む)をスクリプトで出力してから、スクリプトのインデックス作成部分を宛先で実行します。しかし、テーブルが非常に多いため、これは実用的ではないようです。 データがそれほど多くない場合は、「スクリプトの作成...」ウィザードを使用して、データを含むソースをスクリプト化できますが、72mの行スクリプトはあまり良い考えではありません。

1
SQL Server 2016の不適切なクエリプランにより、1週間に1回DBがロックされる
1週間に1度、過去5週間、ほぼ同じ時刻(早朝、人々が使用し始めたときのユーザーアクティビティに基づく場合があります)、SQL Server 2016(AWS RDS、ミラーリング)は多くのタイムアウトを開始しますクエリ。 すべてのテーブルの統計を更新すると、常にすぐに修正されます。 初回以降、すべてのテーブルのすべての統計を(毎週ではなく)毎晩更新しましたが、それでも起こりました(更新統計が実行されてから約8時間後ですが、毎日実行されるわけではありません)。 前回、クエリストアを有効にして、どの特定のクエリ/クエリプランであるかを確認できるかどうかを確認しました。私はそれを1つに絞り込むことができたと思います: そのクエリを見つけた後、この頻繁に使用されないクエリから欠落している推奨インデックスを追加しました(ただし、頻繁に使用される多くのテーブルに影響します)。 不適切なクエリプランは、インデックススキャンを実行していました(1万行のみのテーブルで)。同じスキャンを実行するために使用されたミリ秒単位で返された他のクエリプラン。新しいインデックスを作成した後の最新のクエリプランは、シークのみを行います。しかし、そのインデックスがなくても、99%の時間で数ミリ秒以内に戻りましたが、毎週、40秒以上かかりました。 タイムアウトする悪いもの:http : //brentozar.com/pastetheplan/?id=rymaWt56e タイムアウトしない以前の計画:http : //brentozar.com/pastetheplan/?id=HyN7ftcpe 新しいインデックスを使用した最新の計画:http : //brentozar.com/pastetheplan/?id=ryLuGKcag これは、2012年からSQL Server 2016に移行した後に発生し始めました。 DBCC CHECKDBはエラーを返しません。 新しいインデックスは問題を修正し、再び悪い計画を二度と選択しないようにしますか? うまく機能する計画を「強制」する必要がありますか? これが別のクエリ/プランで発生しないことを確認するにはどうすればよいですか? これはより大きな問題の症状ですか? 追加したばかりのインデックス: CREATE NONCLUSTERED INDEX idx_AppointmetnAttendee_AttendeeType ON [dbo].[AppointmentAttendee] ([UserID],[AttendeeType]) CREATE NONCLUSTERED INDEX [idx_appointment_start] ON [dbo].[Appointment] ( [ProjectID] ASC, [Start] ASC ) INCLUDE ( [ID], …

1
インデックス付きビューを介してのみ関連する2つのテーブルのデッドロックを解決する
デッドロックが発生している状況があり、犯人を絞り込んだと思いますが、それを修正するために何ができるかはよくわかりません。 これは、SQL Server 2008 R2を実行している運用環境です。 状況を少し簡略化して表示するには: 以下に定義する3つのテーブルがあります。 TABLE activity ( id, -- PK ... ) TABLE member_activity ( member_id, -- PK col 1 activity_id, -- PK col 2 ... ) TABLE follow ( id, -- PK follower_id, member_id, ... ) member_activityテーブルには主キーのように定義する化合物を持っているmember_id, activity_id私は今まで、そのテーブル途中その上でデータを検索する必要があるため、。 また、非クラスタ化インデックスがありfollowます: CREATE NONCLUSTERED INDEX [IX_follow_member_id_includes] ON follow ( …

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