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

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

2
このパーティションビューで無関係なテーブルをオプティマイザに強制的に削除させることはできますか?
私は大きなテーブルのさまざまなアーキテクチャをテストしていますが、私が見た提案の1つは、大きなテーブルを一連の小さな「パーティション」テーブルに分割するパーティションビューを使用することです。 1、2、3、4 このアプローチをテストする中で、あまり意味をなさない何かを発見しました。ファクトビューの「パーティション列」でフィルタリングすると、オプティマイザーは関連するテーブルのみを検索します。さらに、ディメンションテーブルのその列でフィルタリングすると、オプティマイザーは不要なテーブルを削除します。 ただし、ディメンションの他の側面でフィルタリングすると、オプティマイザーは各ベーステーブルのPK / CIを検索します。 問題のクエリは次のとおりです。 select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where o.ObservationDateKey >= 20000101 and o.ObservationDateKey <= 20051231 group by od.[Year]; select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where od.DateKey …

2
ネットワーク上でダウンタイムの少ない巨大なSQL Serverデータベースを移行する最良の方法
問題定義 データベースサーバーを他のデータセンターに転送する必要があります。Microsoft SQL Server 2012 Enterprise(64ビット)で実行され、約2TBと1TBの2つのデータベースが含まれています。 ダウンタイムがほとんどないか、まったくないことが理想的です。 仕事量 これらのデータベースは.NET Webサイトに使用され、常に更新されています。 ただし、週末に利用できなくても問題ありません。現在使用中のDBは、新しいDBに切り替えるまで使用中の唯一のDBのままです。 この切り替えは、理想的には、DBが更新されていないことを確認しながら、新しいDBサーバーを指すようにDNSエントリを変更するだけで行われます。 また、1つのサーバーから別のサーバーへの切り替え(ダウンタイム)が低く抑えられている限り、この操作にかかる時間は実際には重要ではありません。 考慮されるアプローチ バックアップと復元 これは過去に行われたことがありますが、内部ネットワークを介して行われたにもかかわらず、インターネットよりも効率的にダウンタイムが長くなりました ログ配布 私の知る限り、このアプローチは、マスター/スレーブを構成し、マスターDBの正確なコピーを読み取り専用のスレーブに転送することにより、ダウンタイムを最小限に抑えます。上記のように、スレーブへのアクセスは不要であり、データ破損なしでマスターDBのレプリカを保持する方法が必要です。 また、リソース使用率の面でも非常に効率的であるようで、マスターのパフォーマンスにはほとんど影響しません。 私はこのアプローチについて間違っているかもしれませんので、私を修正してください。 データベースミラーリング 私はそのアプローチをあまり認識していませんが、有効なオプションのようです。リアルタイムで同期する必要はなく、マスターのパフォーマンスは非常に重要であるため、このアプローチを選択する場合は非同期が最適です。 別のオプション? このサーバーはベアメタルハードウェア上で直接実行されるため、残念ながら低レベルのソリューションはオプションではありません。たぶんこれを達成するためのより良い方法がありますか? 制約 説明したように、これらのデータベースは維持するのが難しいほど大きなものですが、それは別の問題です。 SQL Serverのバージョンは同じです(Microsoft SQL Server 2012 Enterprise 64ビット)。 2つのデータセンター間のネットワーク経由で転送する必要があるため、おそらくインターネット経由で転送する必要があります。最初の同期のために、あるサイトから別のサイトにディスクを送信することは、残念ながらオプションではありません。転送に何らかのセキュリティを持たせることが理想的ですが、この状況を最大限に活用します。 これにより、このタスクに対する私たちのニーズの非常に良い概要が得られるはずです。

1
サブクエリテーブルに関連付けられたOUTPUTで挿入
データベースの構造を変更しています。テーブルFinancialInstitutionのいくつかの列の内容は、テーブルPersonに転送する必要があります。FinancialInstitutionは、外部キーを持つPersonにリンクされています。各金融機関には、対応する個人のIDが必要です。そのため、Personに挿入された新しい行ごとに、この新しい行のID(IDENTITY)をFinancialInstitutionの対応する行にコピーする必要があります。 これを実行する明白な方法は、反復T-SQLコードです。しかし、セットベースの操作でのみ可能かどうかを知りたいと思っています。 そのようなリクエストの内部レベルは次のようなものになると想像しました。 INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1) OUTPUT inserted.Id, FinancialInstitution.Id SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email FROM FinancialInstitution; 残念ながら、OUTPUTはそのように相関できないようです...

4
TSQLでテーブル作成スクリプトを生成する方法はありますか?
T-SQLのみで既存のテーブルから作成スクリプトを生成する方法はありますか(T-SQLはSMOにアクセスできないため、SMOを使用しません)。テーブル名を受け取り、指定されたテーブルの作成スクリプトを含む文字列を返すストアドプロシージャがあるとしますか? これにアプローチする別の方法があるかもしれないので、今私が直面している状況を説明させてください。数十のデータベースを持つインスタンスがあります。これらのデータベースはすべて同じスキーマ、すべて同じテーブル、インデックスなどを持っています。これらは、サードパーティのソフトウェアインストールの一部として作成されました。アドホックな方法でデータを集約できるように、それらを操作する方法が必要です。dba.seの素敵な人々がここですでに私を助けてくれました別のデータベースにトリガーを作成する方法は? 現在、すべてのデータベースのテーブルから選択を行う方法を見つける必要があります。という名前のテーブルにすべてのデータベース名を記録し、Databaseesそれらすべてに対してselectステートメントを実行する次のスクリプトを作成しました。 IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp select * into #tmp from Database1.dbo.Table1 where 1=0 DECLARE @statement nvarchar(max) = N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1' DECLARE @LastDatabaseID INT SET @LastDatabaseID = 0 DECLARE @DatabaseNameToHandle varchar(60) DECLARE @DatabaseIDToHandle int SELECT TOP …

1
SQL Server 2012 Expressがサーバーで9.5GBのRAMを使用するのはなぜですか?
SQL Server 2012 Expressをプライマリデータストアとして埋め込む予定のアプリケーションを構築しています。開発マシン(3GB RAMのWin7-32​​)でテストするときsqlservr.exe、公開されたハードウェアのスケーリング制限から予想されるように、1GBを超えるRAMを使用するプロセスを観察しませんでした、SQL ServerのExpressエディションの。 次に、アプリケーションをサーバーグレードのマシン(16 GB RAMを搭載したWin Server 2008R2 64ビット)に移動して、そこでパフォーマンスを評価しましたが、 sqlservr.exeプロセスが約9.5 GBのRAMに急速に拡大し、そこに留まったことがわかりました。 数回再起動して、効果があるかどうかを確認しましたが、毎回、プロセスは急速に〜9.5GBに戻りました。これで、SQL Server ExpressでRAMを使用できるようになりましたが、これが予想される動作であるかどうかを知りたいので、不適切なRAM使用量に基づくパフォーマンスレベルに依存することはありません。 参考までに、サーバーマシン上のSQL ServerのバージョンSELECT @@VERSIONは次のとおりです。 Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 13:38:57 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 9.5GBの数値は、タスクマネージャーの「プライベートワーキングセット」の数値から取得されました。DBCC …

3
特権のある子供と1対多の関係を築く方法は?
各親について、1人または0人の子供が「お気に入り」としてマークされる1対多の関係が必要です。ただし、すべての親が子供を持つわけではありません。(このサイトでは、両親を質問、子供を回答、お気に入りを受け入れられた回答と考えてください。)たとえば、 TableA Id INT PRIMARY KEY TableB Id INT PRIMARY KEY Parent INT NOT NULL FOREIGN KEY REFERENCES TableA.Id 私の見方では、TableAに次の列を追加できます。 FavoriteChild INT NULL FOREIGN KEY REFERENCES TableB.Id または、TableBの次の列: IsFavorite BIT NOT NULL 最初のアプローチの問題は、null許容の外部キーを導入することです。これは、正規化された形式ではないことを理解しています。2番目のアプローチの問題は、多くても1人の子供がお気に入りであることを確認するために、より多くの作業を行う必要があるということです。 どのアプローチを使用するかを決定するには、どのような基準を使用する必要がありますか?または、私が検討していない他のアプローチはありますか? SQL Server 2012を使用しています。

2
SQL Serverストアドプロシージャのリビジョンの履歴を保持する方法
注:完全なバージョン管理については質問していません。 SQL Serverのストアドプロシージャの履歴を自動的に保持する方法はありますか。 Googleドキュメントがドキュメントのバージョンの履歴を自動的に保持し、ウィキペディアが記事のバージョンの履歴を自動的に保持する方法と同様です。 ストアドプロシージャを更新するユーザーが、ストアドプロシージャのリポジトリも維持する必要はありません。これは大変な作業であり、人々はそれをしません。 うまくいけば、これがSQL Serverでオンにできることです... (そして、ストアドプロシージャとは、実際には関数、トリガーなどを意味します。基本的にはプログラマビリティのすべてです。) /programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions first cos に投稿しました。

1
繰り返しのない組み合わせのSQLクエリ
関数で(または関数として)使用でき、n値のすべての組み合わせを取得できるクエリが必要です。そして、長さkのすべての組み合わせ(k = 1..n)が必要です。 拡張されたサンプル入力と結果により、入力は2ではなく3つの値になります-ただし、入力値の数は1からnまで変化する場合があります。 例:入力:複数行の1列の値を持つテーブル Value (nvarchar(500)) ------ Ann John Mark 出力#1:1つの列に値が連結されたテーブル Ann John Mark Ann,John John,Mark Ann,Mark Ann,John,Mark

4
マージステートメント自体のデッドロック
次の手順があります(SQL Server 2008 R2): create procedure usp_SaveCompanyUserData @companyId bigint, @userId bigint, @dataTable tt_CoUserdata readonly as begin set nocount, xact_abort on; merge CompanyUser with (holdlock) as r using ( select @companyId as CompanyId, @userId as UserId, MyKey, MyValue from @dataTable) as newData on r.CompanyId = newData.CompanyId and r.UserId = newData.UserId and …

2
ミラーリングセッションがタイムアウトしてフェールオーバーする原因は何ですか?
累積更新プログラム3を適用したSQL Server 2005 SP4を実行する2つの運用SQLサーバーがあります。両方のサーバーは同一の物理マシンで実行されます。4 x 12コアCPUと512GB(yes GB)のRAMを備えたDELL PowerEdge R815、すべてのSQLデータベースとログ用の10GB iSCSI SAN接続ドライブ。OSはMicrosoft Windows Server 2008 R2 Enterpriseエディションで、すべてのSPおよびWindowsが更新されています。OSドライブは、3 x 72GB 2.5 "15k SASドライブのRAID 5アレイです。SA​​Nは、48 x 10K SAS 3.5"ドライブを備えたDell EqualLogic 6510で、RAID 50で構成され、2つのSQL ServerのさまざまなLUNにスライスされ、共有されますExchangeマシンと複数のVMWareサーバーを使用します。 20を超えるデータベースがあり、そのうち11がミラーリングされ、ミラーリング監視サーバーを使用しています。ミラーリング監視サーバーは、ミラーリング監視サービスを提供する以外に使用されないSQL Serverインスタンスを実行する低出力のマシンです。最大のミラーリングされたデータベースは450GBで、約100〜300 iopsを生成します。データベースミラーリングモニターは、現在の送信速度を毎秒約100 kb〜10 mb、ミラーコミットオーバーヘッド(通常)0ミリ秒を報告します。ミラーサーバーは、プリンシパルについていくことに問題はありません。 ミラーリングフェールオーバーが常に発生しています。単一のデータベースがフェールオーバーすることもあれば、ほぼすべてのデータベースが同時にフェールオーバーすることもあります。たとえば、昨夜、11のデータベースのうち10がフェイルオーバーし、手動でフェイルオーバーするまで残りのデータベースはアクセス可能なままでした。 問題を特定するためにいくつかのトラブルシューティング手順を実行しましたが、これまでのところ問題を解決できませんでした。 1)マシンには、最初にプライマリネットワーク接続として使用したBroadcom BCM5709C NetXtreme II 4ポートギガビットネットワークアダプターが付属していました。以来、問題としてNICを排除するために、両方のマシンにIntel(R)PRO / 1000 PTデュアルポートサーバーアダプターをインストールしました。 2)すべてのデータベースには、ミラーリングに関係するデータベースのログバックアップとともに、夜間の自動フルバックアップがあります。ログファイルの使用状況は監視されており、使用率が15%を超えることはめったにありません。メインデータベースのログファイルは125GBで、サイズが511MBから1GBまでの159個の仮想ログファイルで構成されています。TempDBは独自のLUN上にあり、24 x 2GBファイルで構成されています。 3)ミラーリング監視サーバーのSQL Serverのログには、次のエラー以外は表示されません。「TCP://SQL02.DOMAIN.INET:5022」へのミラーリング接続は、応答なしで30秒後にデータベース「Data」に対してタイムアウトになりました。サービスとネットワーク接続を確認してください。 …

2
メインクエリのエイリアスと同じサブクエリのエイリアス
エイリアスがそのサブクエリのエイリアスのいくつかと同じであるSQLクエリがあります。 例えば: select * from ROOM r where ... ( select * from ROAD r where ... ) サブクエリのエイリアスはメインのエイリアスを隠すように見えるため、これはうまく機能します。 それはすべての場合にそのように機能しますか? 未定義の結果を取得することはありますか? それが問題ない場合、メインクエリの参照を作成するにはどうすればよいrですか?

3
巨大なテーブルにクラスター化インデックスを作成する簡単な方法
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 そのため、パフォーマンスが大幅に低下していると不満を言っているカスタマーサイトがあります。ひと目見てみると、問題は、Somebody Else(grrrr)がクラスター化インデックスなしで約2,000万件以上のレコードを保持するテーブルを設計したためであることは明らかです。 次に、そのテーブルにクラスター化インデックスを作成しますが、テスト環境ではcreate indexコマンドが1時間実行されており、まだ実行されていません。顧客サイトは24時間年中無休で稼働する作業場であり、インデックスを作成している間は1時間のダウンタイムは許されません。 インデックスを作成するためのブルートフォースの少ない方法で、ジョブをすばやく終了するか、ビジー状態のときにサーバーのパフォーマンスを完全に低下させないスマートな方法で実行しますか? SQL Server Enterprise Editionを使用しています。

2
クラスター化インデックスと非クラスター化インデックスのパフォーマンスの違い
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 私が読んでいたClusteredとNon Clustered Indexes。 Clustered Index-データページが含まれています。つまり、完全な行情報がクラスター化インデックス列に表示されます。 Non Clustered Index-クラスター化インデックス列(利用可能な場合)またはファイル識別子+ページ番号+ページ内の合計行の形式の行ロケーター情報のみが含まれます。これは、クエリエンジンが実際のデータを見つけるために追加の手順を実行する必要があることを意味します。 クエリ -私たちは、テーブルが一つだけ持つことができることを知っているとどのように私は実用的な例の助けを借りて、パフォーマンスの違いを確認することができますClustered Indexし、提供sorting時Clustered Index ColumnとNon Clustered Index提供していないsortingと999をサポートすることができますNon Clustered Indexes中SQL Server 2008にして249 SQL Server 2005。

4
結果を最初の2つのランキング行に制限する
SQL Server 2008では、を使用RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)してデータセットを返すために使用していRANKます。ただし、各パーティションには数百のレコードがあるため、ランク1、2、3 ...... 999から値を取得します。しかし、私RANKsはそれぞれ2つまでしかしたくないPARTITION。 例: ID Name Score Subject 1 Joe 100 Math 2 Jim 99 Math 3 Tim 98 Math 4 Joe 99 History 5 Jim 100 History 6 Tim 89 History 7 Joe 80 Geography 8 Tim 100 Geography …

5
インスタンスのパフォーマンスを維持するために定期的な再起動が必要なのはなぜですか?
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 SQL 2005に運用DBサーバーがあります。すべてはしばらく正常に動作しますが、数週間後、顕著なパフォーマンスの低下が見られます。SQL Serverを再起動するだけで、パフォーマンスが通常に戻ります。 背景: 1200以上のデータベース(ほとんどが単一テナント、一部がマルチテナント)を実行しています。マルチテナントのみへの移行について講義する前に、この構造を維持する正当な理由があります...... RAMは16 GBです。再起動後、SQL Serverが15 GBの使用量に戻るのにそれほど長くかかりません。 アクティブDB接続は約80の接続です-プロセスごとにWebサーバーごとに1つの接続プールがあることを考えると、かなり健全であると感じているため、接続リークの問題はありません。 ピーク時以外にいくつかのことを試しました。-DBCC DROPCLEANBUFFERS(チェックポイント付き)を実行して、データキャッシュをクリアします。効果はなく、RAM使用量もクリアされません)。-FREEPROCCACHEおよびFREESYSTEMCACHEを実行して、クエリプランとストアドプロシージャキャッシュをクリアします。無効。 明らかに、SQL Serverを再起動することは、アクティブな運用環境では理想的ではありません。何かが欠けています。他の誰かがこれを通過しますか? 更新:April-28-2012 まだこの問題と戦っています。OSとの競合を排除するために、SQL Serverのメモリを10 GBに下げました。絞り込みに近づいていますが、次のステップからの助けが必要です。 SQL Serverを再起動した後、ページファイルが12.3 GBから12.5 GBの間でホバリングしていることがわかりました。それは数日間そのままです。合計サーバースレッドは850から930の間でハングアウトします-安定しており、終日一貫しています(sqlserverはトラフィックに応じて55から85の間で安定しています)。 次に、「イベント」があります。私はイベントが何であるかわからず、ログでそれを見ることができず、曜日またはそれが起こる時間に一貫したものを見ることはできませんが、突然ページファイルはすべて14.1または14.2のいずれかにジャンプしますGB、およびスレッドは1750〜1785の間にジャンプします。 これが発生したときにパフォーマンスをチェックすると、これらのスレッドのうち900以上がsqlserverです。したがって、sp_who2にアクセスして、これらのスレッドがどこから来ているのかを確認します。使用されている80個程度のdb接続があります。 だから.... SQLサーバー上のこれらの900個のスレッドの残りがどこにあるのか、そして彼らが何をしているのかを見つけることができるアイデアはありますか? 更新:2012年6月1日 まだ問題と戦っています。まだこれを読んでいる人にとっては、スレッドが跳ね上がる問題は解決されています。これは、自動化されたComVaultバックアップソフトウェアが原因でした。現在のデータベースを単にバックアップするのではなく、もはや存在しないデータベースをバックアップしようとするスレッドを作成していました(以前のデータベースのリストを維持していました)。 しかし、問題はまだ残っており、毎週再起動する必要があります。Rackspaceチームと協力して、光を当てられるかどうかを確認します。

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