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

SQL Server 2008(メジャービルドバージョン10.00.xxxx)。また、sql-serverでタグ付けしてください。

1
ODBCデータソースSQL Server接続-ユーザーのログインに失敗しました
データベースをSQL 2005からSQL 2008のサーバーに移動しました。 現在、ODBCデータソースを作成しようとしています。 「ユーザーが入力したログインIDとパスワードを使用したSQL Server認証」を使用し、ログインとパスワードを入力しました。ログインは、SQL Server Management Studioの[セキュリティ]-> [ログイン]に表示されます。 ログインには、古いサーバーの同じログインの正確なプロパティも含まれています。ユーザー名とパスワードを入力した後、次にヒットすると、次のようになります: Connection failed: SQLState: '28000' SQL Server Error: 18456 [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'myUser'. これを読んだ後:http : //support.microsoft.com/kb/555332サーバープロパティが「Windows認証モード」のみに設定されていることに気付きましたが、「SQL ServerおよびWindows認証モード」に変更した後でも、接続の問題。Windowsアカウントで接続できます。

1
ワークスペースメモリの内部
クリスチャンボルトン、ブレントオザールなどによるSQL Server 2008の内部とトラブルシューティング(イリノイのローカルライブラリから借用)に関する本を読んでいます。私の理解を確認または修正できます。 クエリメモリの付与を必要とするすべてのクエリまたは操作には、ワークスペースメモリが必要です。並べ替え、ハッシュ一致結合、並列処理(これについては不明)、一括挿入(不明)、インデックスの再構築などを使用した一般的なクエリでは、クエリワークスペースメモリが必要です。 ワークスペースメモリはSQL Serverバッファプールの一部であり(バッファプールの一部として割り当てられます)、最大ワークスペースメモリはバッファプールに割り当てられたメモリの75%です。既定では、1つのクエリでワークスペースメモリの25%を超える値を取得することはできません(SQL 2008 / SQL 2012では、リソースガバナーの既定のワークロードグループによって既定で制御されます)。 私の理解の確認を求めて 1)48 GB RAMと最大サーバーメモリが40 GBに設定されたシステムを考えると、これは最大ワークスペースメモリが30 GBに制限され、1つのクエリで10 GBを超えるワークスペースメモリ(クエリメモリ)を取得できないことを意味します。したがって、大量のハッシュ結合を実行している10億行で動作する不適切なクエリがあり、10 GBを超えるメモリ(ワークスペースメモリ)が必要な場合、このメモリ許可キューを介しても、すぐにディスクに流出しても問題ありませんか? 2)大量の並べ替え操作を行うクエリに5 MBのワークスペースメモリが割り当てられ、クエリのクエリ実行中に、クエリオプティマイザが悪い統計またはインデックスの欠落により実際に30 MBのワークスペースメモリを必要とする場合すぐにtempdbに流出します。実行中にシステムが十分なワークスペースメモリを使用できる場合でも、実行中にクエリが許可されたワークスペースメモリを超えると、ディスクにスピルする必要があります。私の理解は正しいですか?

3
SQL Serverの情報スキーマへのアクセスを拒否する
sys.tables/ へのアクセスを無効にする最良の方法を探していますInformation SchemaSQL Serverのユーザー/グループのます。 見つけた は2008年からこのスレッド 次のようにアクセスを拒否する方法を示します[sys].[something]。 DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole GO DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole GO DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole GO DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole GO しかし、アクセスを無効にする方法はありませんInformation Schema: DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole これは機能しないようです。 information_schemaへのアクセスを無効にするにはどうすればよいですか? そして、すべてへのアクセスを無効にする簡単な方法がありますsys/information_schema? 更新: 実際には、次のステートメントの両方を実行することはできません。 DENY SELECT …

2
SQL Server EXECUTE ASトラブル
ストアドプロシージャを使用しようとしているときに何かが見つかりませんEXECUTE AS。ストアドプロシージャは、データを読み取りsource_db、集計し、結果をに格納しtarget_dbます。 sp自体はにありtarget_dbます。私は専用のログインを持っているし、両方のユーザーにマッピングsource_dbしてtarget_db、SPの所有者のために(そのユーザーが存在するapp_agent中source_dbやでtarget_dbログイン用app_agent)。 としてログインしてapp_agent実行する場合 EXEC target_db.app_agent_schema.import_data すべてが正常に動作します。しかし、私が変更した場合 ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`) 実行してみてください サーバープリンシパル "app_agent"は、現在のセキュリティコンテキストではデータベース "source_db"にアクセスできません。 SQL Server 2008を使用しています。 誰かが私のエラーを指摘できますか? ありがとう 更新 いくつかの研究を行った後、私はそれを発見しましたALTER DATABASE target_db SET TRUSTWORTHY ON、それが問題解決するが、それは私にとって正しい解決策ではないようです...

4
インデックスの再構築、DBのサイズが10倍に
約15ギガのSQL Serverデータベース(2008 R2 SP1)があります。メンテナンスがしばらくの間実行されていなかったことが判明したため、すべてのインデックスを再構築するメンテナンスプランを作成しましたが、それらは非常に断片化されていました。 ジョブは終了し、断片化はなくなりましたが、データベースは120ギガ以上になりました!すべての再構築を行うために余分なスペースを使用していたことを理解していますが、ジョブが完了すると、そのスペースはすべて空きスペースになると思いますが、空きスペースは3ギグとしてしか表示されないため、117ギグが使用されていますインデックス再構築ジョブが終了しても。 私は非常に混乱しており、いくつかのガイダンスを使用することができます。データベースを適切なサイズに戻す必要がありますが、このためのディスク容量がありません。 前もって感謝します! 投稿された両方のクエリの結果は次のとおりです。 log_reuse_wait_desc NOTHING name TotalSpaceInMB UsedSpaceInMB FreeSpaceInMB LIVE_Data 152 123 28 LIVE_Log 18939 89 18849 LIVE_1_Data 114977 111289 3688 3番目のファイルは.ndfファイルです。これは、未使用スペースに3688だけを表示しますが、約15ギガのデータに111289を使用しています。

1
スロット配列と総ページサイズ
以下に示すように、多くのフォーラムや多くのブログでページが構成されていることを読み続けています。ページサイズ:16 x 512B = 8192Bページヘッダー:= 96B最大行数行:= 8060B これにより、(8192-96-8060)B = 36Bになります。 わかりました、これは論理的で正しいです。私の質問はこれです。なぜ多くの人が、残りの36Bがスロットアレイ用に予約されていると言うのですか 明らかに、スロット配列はページの行ごとに2Bを提供します。そのため、最小2B、最大1472Bになります。 2B:1行* 2B = 2B 1472B:8096B = n * 9B(オーバーヘッドを伴う最小行サイズ...単一のTINYINT列を考えてください)+ n * 2B(行ごとのスロット配列コスト)=> 8096 = 11n => n = 8096/11 = 736 736 * 2B = 1472B。 14Bバージョンタグにより、これで20になります。 USE master ; GO CREATE DATABASE test ; GO USE test …

3
SQL Serverのテーブルに複数のNULL可能FKを設定するのは悪い習慣と見なされますか
SQL Serverのデータベース構造には、注文に関するさまざまな情報を必要とする3種類の製品があります。だから、私は1つ作成しCustomers、テーブルと三つの異なる受注テーブルを:OrdersForProductAs、OrdersForProductBs、OrdersForProductCs。すべての注文表には、1対多の関係がありCustomersます。 Payments支払いの詳細を内部に保持する別のテーブルもあります。しかし、ここでそれをどのように構成するかについて疑問があります。 複数の製品タイプがあり、顧客が複数の製品を同時に注文する可能性があるため、これら3つの注文テーブルをPaymentsテーブルに関連付ける必要があります。 もう1つの問題は、顧客が1種類の製品のみを注文する可能性があることです。したがって、PaymentsテーブルのFK列はである必要がありますnullable。 私の質問は、これらのnullableFKカラムが長期的には頭痛の種になるかどうかです。一般的に、テーブルにNULL入力可能FK列を設定することは悪い習慣と見なされますか?

3
存在しない場合は同時に挿入
ストアドプロシージャへの挿入で並行性の問題が発生しています。手順の関連部分は次のとおりです。 select @_id = Id from table1 where othervalue = @_othervalue IF( @_id IS NULL) BEGIN insert into table1 (othervalue) values (@_othervalue) select @_id = Id from table1 where othervalue = @_othervalue END これらのストアドプロシージャを3つまたは4つ同時に実行すると、複数の挿入が発生することがあります。 私はこれを次のように修正することを計画しています: insert into table1 (othervalue) select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK) where NOT EXISTS …

2
デッドロックエラーがデッドロックSQLを返していません
Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. Webサイトの1つがビジーになると、このエラーがランダムに発生します。どのテーブルのセットが起こっているかは大体わかっていますが、他のプログラムでの経験では、通常、デッドロックが起こっている場所でSQLが返されます。これを可能にするためにオンにする必要があるフラグはありますか? これは今のところ私の主な質問なので、デッドロック自体を別の問題としてデバッグしてみます。 SQL Server 2008 Standard Editionを使用しています。

4
SQL Server 2008 R2でSQL Serverステートメントが断続的に遅くなる
あるお客様では、アプリケーションのパフォーマンスに問題があります。SQL Serverデータベースのデータを消費および更新する.NET 3.5 Webアプリです。現在、本番環境は、フロントエンドとしてのWindows 2008 R2マシンと、バックエンド上のSQL Server 2008 R2クラスターで構成されています。このアプリは、COM +とMSDTCを使用してデータベースに接続します。 ここで何が起こっているのか:エンドユーザーは、アプリケーションの速度が遅いと不満を言うことがあります。一部のページは、予想よりもロードに時間がかかります。何が起こっているのかを理解しようと試みているうちに、パフォーマンスの低下の原因となる可能性のあるデータベース側での奇妙な動作を見つけることができました。予想されることを実行するのにより多くの時間がかかるSQLステートメントが時々あることに気付きました。プロファイラートレース(TSQL_Durationテンプレートを使用)を使用して実行時間の長いクエリを特定し、これらのステートメント(主にアプリケーションのストアドプロシージャの呼び出し)の一部を特定しました。 問題は、これらのストアドプロシージャをSQL Management Studioのデータベースで直接実行すると、時間がかかる(約7/8秒)こともあれば、高速(1秒未満)になることもあります。SQLマシン(4コア、32 GB)が他のアプリケーションで使用されておらず、これらのクエリの実行にこれほど時間がかからないため、これがなぜ起こるのかわかりません。 DBAやSQL Serverの第一人者ではない私は、問題を理解するのに役立つかもしれないものを調べようとしてきました。以下は、問題を解決しようとするためにとったステップと、これまでに発見したことです。 アプリケーションによって呼び出されるすべてのTSQLコードは、ストアドプロシージャで記述されます。 SQL Serverプロファイラーで長時間実行されるクエリの一部を特定しましたが、Management Studioで実行すると、実行に時間がかかる(4〜10秒)か、迅速に実行(1秒未満)します。パラメーターに渡された同じデータを使用して、まったく同じクエリを実行しています。これらのクエリは、主に選択ステートメントを含むストアドプロシージャです。 待機およびキューの統計を調べて、いくつかのリソースで待機しているプロセスがあるかどうかを確認しようとしました。次のクエリを実行しました。 WITH Waits AS (SELECT wait_type, wait_time_ms / 1000.0 AS WaitS, (wait_time_ms - signal_wait_time_ms) / 1000.0 AS ResourceS, signal_wait_time_ms / 1000.0 AS SignalS, waiting_tasks_count AS WaitCount, 100.0 * wait_time_ms …

4
集中DBAデータベースの作成
200以上のサーバーがあり、バックアップ、エラー、スペースジョブをログに記録し、SSRSでレポートを生成する集中DBAデータベースを作成することを考えています。どこから始めればよいかわかりませんが、あなたの助けに感謝します。どうもありがとうございました。


5
データベース(DDLおよびDML)への変更を検出する方法
クライアントのSQLサーバーには多くのデータベースがあります。これらのデータベースは開発中であるため、開発者は設計、リファクタリング、データ変更などを行うことができます。ほとんど変更されないデータベースがいくつかあります。私のクライアントは、それらすべてを安全に(バックアップして)保持し、環境の管理に時間を費やさなければなりません。(会社にはDB管理者の立場はありません。)長い議論の末、クライアントは復元が容易なため、毎日の完全バックアップ戦略を使用することにしました。 状況の概要は次のとおりです。 データベースの数は毎日異なります。 変更されたデータベース(データや構造が変更されたことを意味します)はバックアップされます。 変更されていないデータベースはバックアップされません。 ソリューションはデータベース構造に影響を与えません(要件に制限はありません) この「バックアップエンジン」は自動的に機能します。 主な問題:データベースが変更されたことを検出する方法。問題の最初の部分(DDLの変更)は、DDLトリガーを使用して解決できます。ただし、データの変更(DMLの変更)は問題です。DMLトリガーをすべてのデータベースのすべてのテーブルに適用して、変更(パフォーマンス、拡張オブジェクトの管理など)を追跡することはできません。バックアップエンジンは、すべての変更を追跡して、各データベースをバックアップ準備完了としてマークする必要があります。 変更データキャプチャはソリューションですが、重すぎるようです(SQL Server Enterprise Editionも必要です)。 別の方法は、データベースファイルの変更(サイズまたは最終変更時刻)を追跡することですが、正しく機能しません。データベースは、予約されたすべての空き領域を超えたときにサイズを変更でき、sp_spaceusedは解決策ではありません。 トレースは解決策ですが、パフォーマンスの問題を引き起こし、追加の管理が必要です。 他のデータベース管理オブジェクト(統計など)に影響を与えずに、実際のデータベース使用量を計算するソリューションはありますか?テーブルのサイズを変更しないテーブルのデータへの変更はトリガーされないことを認めました(私は思う)が、それは何もないよりはましです。本当にSQL Server 2008の直接または間接的なソリューションを探しています。 コメント、解決策、考えをお寄せいただきありがとうございます。 追加: ソリューションは次のとおりです(Marianに感謝)。 Select NextLSN = MAX(fn.[Current LSN]) ,Databasename = DB_NAME() from fn_dblog(NULL, NULL) fn LEFT JOIN sys.allocation_units au ON fn.AllocUnitId = au.allocation_unit_id LEFT JOIN sys.partitions p ON p.partition_id = au.container_id LEFT JOIN …


2
SQLエージェントはnext_run_date / next_run_time値をいつどのように更新しますか?
msdbデータベースのsp_add_jobscheduleプロシージャを使用して、SQLエージェントジョブに新しいスケジュールを追加するために、T-SQLのコードに取り組んでいます。新しいスケジュール(通常は特定の日時に1回だけ)を追加し、すぐにsysjobschedulesとsysschedulesの値を見ると、新しいスケジュールが追加され、SQLエージェントのjob_idに関連付けられていることがわかりますジョブ。ただし、next_run_dateおよびnext_run_timeの値には0が含まれています。私が戻ってきて、2、3分後に再びそれらを見ると、彼らはまだそれらに0を示しています。ただし、さらに5分または10分後に戻ってくると、次にスケジュールされた実行に対応する日付と時刻の値が正しく表示されるようになりました。 だから私の質問は: これらの値はどのくらいの頻度で更新されますか? これらの値を更新するプロセスは何ですか? たとえば、1分後のスケジュールを追加する場合、next_run_date / timeがまだ更新されていないため、ジョブが実行されないということですか? 新しいスケジュールを追加するために使用するコードの例: exec msdb.dbo.sp_add_jobschedule @job_id = @jobID , @name = @JobName , @enabled = 1 , @freq_type = 1 , @freq_interval = 0 , @freq_subday_type = 0 , @freq_subday_interval = 0 , @freq_relative_interval = 0 , @freq_recurrence_factor = 0 , @active_start_date = @ScheduleRunDate , …

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