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

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

4
EF Code Firstは、すべての文字列にnvarchar(max)を使用します。これによりクエリのパフォーマンスが低下しますか?
Entity Framework Code Firstを使用していくつかのデータベースを作成しています。アプリは正常に動作しており、一般的にCode Firstでできることにはかなり満足しています。私は必然的にプログラマーであり、DBAは2番目です。私はデータベースで何をしたいのかをC#でさらに説明するためにDataAttributesについて読んでいます。私の質問は、これらのnvarchar(max)文字列をテーブルに入れることでどのようなペナルティを食べるのかということです(下の例を参照)。 この特定のテーブルにはいくつかの列があります。C#では、次のように定義されています。 [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int ID { get; set; } public string Name { get; set; } public string Message { get; set; } public string Source { get; set; } public DateTime Generated { get; set; } public DateTime Written { get; set; } …

3
合理的なバッファプールサイズを評価する決定論的な方法は何ですか?
私はmax server memory (mb)設定が適切かどうかを理解するための健全な方法を考え出そうとしています(どちらか低いか高いか、そのままの状態を維持する必要があります)。max server memory (mb)オペレーティングシステムなどのためのスペースを確保するために、常に十分に低くする必要があることを認識しています 私が見ている環境には数百のサーバーがあります。RAMは各サーバーに割り当てられたGBごとにコストがかかるため、バッファープールの現在のサイズが適切かどうかを判断するために使用できる信頼できる式が必要です。環境全体が仮想化され、VMに割り当てられた「物理」RAMは簡単に上下に変更できます。 現在見ている特定のSQL Serverインスタンスには、1,100,052秒のPLEがあります。これは、12.7日(サーバーが稼働している時間)に相当します。サーバーの最大サーバーメモリ設定は2560MB(2.5GB)で、そのうち1380MB(1.3GB)のみが実際にコミットされます。 Jonathan Keheyias(投稿)によるものとPaul Randal(投稿)によるもの、および他のいくつかを含むいくつかの項目を読みました。ジョナサンは、4GBのバッファプールあたり 300未満のPLEの監視が低すぎると主張しています。上記のSQL Serverインスタンス300 * (2.5 / 4) = 187では、ターゲットPLEが300未満の非常に低いターゲットPLEになります。このインスタンスは290GBのSQL Serverデータ(ログファイルを含まない)を持ち、統合テストにのみ使用されます。過去12日間がこのサーバーの典型的な使用法を代表していると仮定すると、max server memory (mb)設定を下げることができると思います。 スケールのもう一方の端には、294のPLEを持つ別の統合テストサーバーがあり、そのサーバーのmax server memory (mb)設定は1 GBのみです。このサーバーには、ログを含まないSQL Serverデータが224MBしかなく、一部のBizFlowデータベースが実行されています。このサーバーは、より高いmax server memory (mb)設定の恩恵を受ける可能性があります。 あまりにも多くのメモリが割り当てられている可能性のあるターゲットの良い出発点は、次のものを見ることです。 SELECT RamMB = physical_memory_in_bytes / 1048576 , BufferPoolCommittedMB = bpool_committed * 8192E0 / 1048576 , …

2
ログインには既に別のユーザー名でアカウントがあります
このSQLを実行すると: USE ASPState GO IF NOT EXISTS(SELECT * FROM sys.sysusers WHERE NAME = 'R2Server\AAOUser') CREATE USER [R2Server\AAOUser] FOR LOGIN [R2Server\AAOUser]; GO 次のエラーが表示されます。 ログインにはすでに別のユーザー名でアカウントがあります。 ログインアカウントのこの異なるユーザー名を知るにはどうすればよいですか?

19
SQL Server Management Studioが新しいウィンドウをゆっくり開く
SQL ServerとManagement Studioの両方を2008から2012にアップグレードした後、新しいクエリウィンドウとダイアログボックスを開くとManagement Studio 2012が非常に遅くなります。 テーブルを右クリックしても遅くなります。通常、ウィンドウ内で何かを始める前に、少なくとも5秒の遅延があります。同じウィンドウを連続して2回開いても、これは毎回発生します。なぜこれが起こり、どうすれば修正できますか? 他のアプリケーションは、データベースへの接続を非常に高速に確立します。 私が試したものは助けにはなりませんでした: hostsファイルを変更する必要があるGoogleでのヒット SSMS「ユーザー定義設定」のリセット ビデオドライバの更新、ハードウェアアクセラレーションの無効化、DirectXの無効化 生体認証サービスを無効にします(インストールしていません)。 私のコンピューターは十分に高速でなければならず、16GBのRAMもあります。私のハードウェアは間違いなく問題ではないはずです。SSMSが何かを待っているようです-これが起こっている間、私は他のプログラムをスムーズに操作できます。 SQL Server 2012 CU1更新プログラムをインストールする機会はありません。修正プログラムのインストールでエラーが発生するリスクがあるようで、現時点ではリスクを負うことができません。

3
SELECTステートメントのOPTION FASTは何をしますか?
ステートメントOPTION (FAST XXX)内でクエリヒントが何をするかを掘り下げましたが、SELECTまだ混乱しています。MSDNによると: クエリが最初のnumber_rowsの高速取得のために最適化されることを指定します。これは非負の整数です。最初のnumber_rowsが返された後、クエリは実行を継続し、完全な結果セットを生成します。 私にとってそれはあまり意味がありませんが、基本的にクエリは最初のXXX行を本当に速く取得でき、残りは通常の速度で取得できますか? これについて考えさせられたMicrosoft Dynamicsクエリは次のとおりです。 select pjproj.project,pjproj.project_desc,pjproj.customer,pjproj.cpnyid from pjproj WITH (NOLOCK) where project like '%' order by project OPTION(FAST 500) 誰でもこのクエリヒントが何をしているのかを正確に説明できますか?それはそれを使用しないよりも有利です?

6
ディスク領域の割り当てと使用領域を報告するクエリ
1つのアプリケーションで合計6つのデータベースを使用しており、6つの自動拡張データベースすべて(SANストレージ経由)で共有できるのは4TBのみです。 SQL Server Management Studioの[タスク]> [圧縮]> [データベース]オプションで[現在割り当てられているスペース]および[使用可能な空きスペース]属性を示す単一のデータベースのクエリ(レポート)を作成します。 次に、これらの数値をTBに変換し、各データベースを合計して、残されたスペースの大まかな見積もりを取得します。T-SQLクエリを介してこれらのフィールドにアクセスできますか?その場合、クエリはどのようになりますか?

3
BLOBを別のSQL Serverテーブルに保存することが推奨されるのはなぜですか?
この非常に支持されたSOの回答では、別のテーブルとの1:1関係しかない場合でも、画像を別々のテーブルに配置することを推奨しています。 写真をSQL Serverテーブルに配置する場合、写真を保存するために別のテーブルを使用することを強くお勧めします。従業員の写真を従業員のテーブルに保存せずに、別のテーブルに保管してください。このように、従業員のテーブルは、クエリの一部として従業員の写真も常に選択する必要がないと仮定すると、無駄がなく、平均的で非常に効率的です。 どうして?SQL Serverはテーブルに専用のBLOBデータ構造へのポインターのみを格納しているのではないかという印象を受けましたが、なぜ別の間接層を手動で作成する必要があるのですか?それは本当にパフォーマンスを大幅に改善しますか?はいの場合、なぜですか?
28 sql-server  blob 

2
正の場合、すべてのアイテムを合計します。負の場合、それぞれを返します
SUM()すべての正の値のすべての正の値への方法を見つけnumてSUM()、すべての正の数と各負の数の個別の行を返す必要があります。以下にサンプルDDLを示します。 Create Table #Be ( id int , salesid int , num decimal(16,4) ) Insert Into #BE Values (1, 1, 12.32), (2, 1, -13.00), (3, 1, 14.00) , (4, 2, 12.12), (5, 2, 14.00), (6, 2, 21.23) , (7, 3, -12.32), (8,3, -43.23), (9, 3, -2.32) そして、これは私の希望する出力です(各salesidの正の数値SUM()と負の数値は個別の行を返します): salesid num 1 …

1
クラスター化された列ストアからのこの削除には、熱心なスプール演算子が役立ちますか?
クラスター化された列ストアインデックスからのデータの削除をテストしています。 実行計画に大きな熱心なスプールオペレーターがいることに気付きました。 これは、次の特性で完了します。 6,000万行が削除されました 1.9 GiB TempDBを使用 実行時間14分 シリアルプラン 1スプールで再バインド スキャンの推定コスト:364.821 見積もりツールをだまして過小評価するようにすると、TempDBの使用を回避するより高速なプランが得られます。 推定スキャンコスト:56.901 (これは推定プランですが、コメントの数値は正しいものです。) 興味深いことに、次を実行してデルタストアをフラッシュすると、スプールは再び消えます。 ALTER INDEX IX_Clustered ON Fact.RecordedMetricsDetail REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON); スプールは、デルタストアにページのしきい値を超えるしきい値がある場合にのみ導入されるようです。 デルタストアのサイズを確認するには、次のクエリを実行して、テーブルの行内ページを確認します。 SELECT SUM([in_row_used_page_count]) AS in_row_used_pages, SUM(in_row_data_page_count) AS in_row_data_pages FROM sys.[dm_db_partition_stats] as pstats JOIN sys.partitions AS p ON pstats.partition_id = p.partition_id WHERE p.[object_id] = OBJECT_ID('Fact.RecordedMetricsDetail'); …

2
集計にインデックス付きビューを使用する-あまりにも良いですか?
かなり大きなレコード数(1000万から2000万行)のデータウェアハウスがあり、特定の日付の間にレコードを数えるクエリや、特定のフラグを持つレコードを数えるクエリを実行することがよくあります。 SELECT f.IsFoo, COUNT(*) AS WidgetCount FROM Widgets AS w JOIN Flags AS f ON f.FlagId = w.FlagId WHERE w.Date >= @startDate GROUP BY f.IsFoo パフォーマンスはそれほど悪くありませんが、比較的遅くなる可能性があります(コールドキャッシュで10秒程度)。 最近、私GROUP BYはインデックス付きビューで使用できることを発見し、次のようなものを試しました CREATE VIEW TestView WITH SCHEMABINDING AS SELECT Date, FlagId, COUNT_BIG(*) AS WidgetCount FROM Widgets GROUP BY Date, FlagId; GO CREATE UNIQUE CLUSTERED …

1
sys.stats_columnsは間違っていますか?
Foo列ID1, ID2と複合主キーが定義されたテーブルがあるとしますID2, ID1。(私は現在、この方法で定義された複数のテーブルを持つSystem Center製品を使用しています。プライマリキー列は、テーブル定義に表示されるのとは逆の順序でリストされています。) CREATE TABLE dbo.Foo( ID1 int NOT NULL, ID2 int NOT NULL, CONSTRAINT [PK_Foo] PRIMARY KEY CLUSTERED (ID2, ID1) ); GO -- Add a row and update stats so that histogram isn't empty INSERT INTO Foo (ID1, ID2) VALUES (1,2); UPDATE STATISTICS dbo.Foo; のkey_ordinal列はsys.index_columns、複合主キーで宣言されたのと同じ順序でインデックス列を示します。 SELECT t.name, i.name, …

2
ブロックされたプロセスレポートの空のブロックプロセス
拡張イベントを使用してブロックされたプロセスのレポートを収集していますが、何らかの理由で一部のレポートでblocking-processノードが空です。これは完全なxmlです。 <blocked-process-report monitorLoop="383674"> <blocked-process> <process id="processa7bd5b868" taskpriority="0" logused="106108620" waitresource="KEY: 6:72057613454278656 (8a2f7bc2cd41)" waittime="25343" ownerId="1051989016" transactionname="user_transaction" lasttranstarted="2017-03-20T09:30:38.657" XDES="0x21f382d9c8" lockMode="X" schedulerid="7" kpid="15316" status="suspended" spid="252" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-03-20T09:39:15.853" lastbatchcompleted="2017-03-20T09:39:15.850" lastattention="1900-01-01T00:00:00.850" clientapp="Microsoft Dynamics AX" hostname="***" hostpid="1348" loginname="***" isolationlevel="read committed (2)" xactid="1051989016" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> <executionStack> <frame line="1" stmtstart="40" sqlhandle="0x02000000f7def225b0edaecd8744b453ce09bdcff9b291f50000000000000000000000000000000000000000" /> <frame line="1" …

2
UNPIVOTを使用する場合、SQL Serverでデータ型の長さが同じである必要があるのはなぜですか?
UNPIVOT正規化されていないデータに関数を適用する場合、SQL Serverではデータ型と長さが同じである必要があります。データ型が同じでなければならない理由を理解していますが、なぜUNPIVOTは同じ長さを必要とするのですか? ピボットを解除する必要がある次のサンプルデータがあるとします。 CREATE TABLE People ( PersonId int, Firstname varchar(50), Lastname varchar(25) ) INSERT INTO People VALUES (1, 'Jim', 'Smith'); INSERT INTO People VALUES (2, 'Jane', 'Jones'); INSERT INTO People VALUES (3, 'Bob', 'Unicorn'); 次のような列FirstnameとLastname列をアンピボットしようとすると: select PersonId, ColumnName, Value from People unpivot ( Value FOR ColumnName in (FirstName, LastName) …

8
空のテーブルのデータベースを照会する方法
一部の「開発者」のために、システムで作業していたため、空のテーブルに問題がありました。クラウドへの転送中にいくつかのテーブルがコピーされましたが、それらのテーブルのデータはコピーされていませんでした。 空のユーザーテーブルを見つけるために、システムテーブルに対してクエリを実行したいと思います。MS SQL 2008 R2を使用しています。 助けてくれてありがとう。

3
実動テーブルへの列の追加
SQL Server 2008 R2の大規模な運用テーブルに列を追加する最良の方法は何ですか?オンラインのMicrosoftの本によると: ALTER TABLEで指定された変更はすぐに実装されます。変更がテーブル内の行の変更を必要とする場合、ALTER TABLEは行を更新します。ALTER TABLEは、テーブルのスキーマ変更ロックを取得して、最後に非常に短いSCH-Mロックを必要とするオンラインインデックス操作を除き、変更中に他の接続がテーブルのメタデータを参照しないようにします。 (http://msdn.microsoft.com/en-us/library/ms190273.aspx) 数百万行の大きなテーブルでは、これには時間がかかる場合があります。停止することが唯一の選択肢ですか?このような状況に対処する最善の方法は何ですか?

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