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

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

4
SQL Serverの最大メモリがRAMの使用を制限しない
これについてのご意見をお願いします。SQL Server 2008r2 Entがあります。エド。16コアおよび64GB RAMを備えた64ビット。20111014の時点で完全に修正されたSQLサーバーのインスタンスが1つあります。 最大RAMは60000MBに設定されています。オンラインで数日後のタスクマネージャーによると、フリーラムの量は0です。 最大RAMを53GB未満に変更すると、数日後に安定し、空きRAMが確保されます。 タスクマネージャーに従ってRAMを割り当てるのは、SQLプロセスです。問題が実際に何であるかをどのように判断しますか?言うまでもなく、私は既に多くのテストを行ったが、これを私の好みにまだ解決していない。また、使用可能なRAMが0になったときに、通常のメモリ不足が発生することはありません。 更新1: このページ/dba//a/7062/2744の RAMに関する別のQ / Aに触発されました。これら2つを使用して、RAMの用途を確認しました。 SELECT TOP ( 10 ) [type] AS [Memory Clerk Type] , SUM(single_pages_kb) AS [SPA Mem, Kb] FROM sys.dm_os_memory_clerks GROUP BY [type] ORDER BY SUM(single_pages_kb) DESC OPTION ( RECOMPILE ) ; SELECT DB_NAME(database_id) AS [Database Name] , COUNT(*) …

3
テーブルのデータスペースが生データの4倍のサイズを占めるのはなぜですか?
490 M行と55 GBの表スペースがある表があるため、1行あたり約167バイトです。テーブルには3つの列があります:a VARCHAR(100)、a DATETIME2(0)、およびa SMALLINT。VARCHARフィールド内のテキストの平均の長さは約21.5なので、生データは行ごとに約32バイトである必要があります。22+ 2はVARCHAR、6はDATETIME2、および2は16ビット整数です。 上記のスペースはデータのみであり、インデックスではないことに注意してください。[プロパティ]で報告される値を使用しています| ストレージ| 全般| データスペース。 もちろん、ある程度のオーバーヘッドが必要ですが、特に大きなテーブルの場合、1行あたり135バイトはかなり多いようです。これはなぜでしょうか?他の誰かが同様の乗数を見ましたか?必要な追加スペースの量に影響する要因は何ですか? 比較のために、2つのINTフィールドと1 M行のテーブルを作成してみました。必要なデータ領域は16.4 MBでした。8バイトの生データと比較して、行あたり17バイトです。INTとVARCHAR(100)実際のテーブルと同じテキストが入力された別のテストテーブルは、行ごとに39バイト(44 K行)を使用します。 したがって、実動テーブルにはかなり多くのオーバーヘッドがあります。これは大きいからですか?インデックスサイズはだいたいN * log(N)になると思いますが、実際のデータに必要なスペースが非線形である理由はわかりません。 ポインタを事前に感謝します! 編集: リストされているすべてのフィールドはNOT NULLです。実際のテーブルには、VARCHARフィールドとDATETIME2フィールドの順にクラスターPKがあります。2つのテストの場合、最初のテストINTは(クラスター化された)PKでした。 重要な場合:テーブルはpingの結果の記録です。フィールドは、URL、ping日付/時刻、およびミリ秒単位の待機時間です。データは常に追加され、更新されることはありませんが、データは定期的に削除され、URLごとに1時間あたり数個のレコードに削減されます。 編集: 非常に興味深い答えがここにいることを示唆している、多くの読み取りと書き込みとインデックスのために、再構築は有益ではないかもしれません。私の場合、消費されるスペースは懸念事項ですが、書き込みパフォーマンスがより重要な場合は、ゆるいインデックスを使用した方が良いかもしれません。

3
'n'日間のWebサーバーログをSQL Serverに保存する方法は?
より高速なレポートとパフォーマンス分析のために、WebサーバーのログをSql Serverに挿入します。これにより、ほぼリアルタイムでトラフィックパターン、問題、速度低下を確認できます。 ロードバランサーからの要求/応答イベントとデータベースへの一括挿入をリッスンするデーモンがあります。 ただし、1日あたり約1 GBのログを取得するため、約1週間程度(少なくともこの生の形式で)保持するだけで済みます。 このデータを保存する最良の方法と古いエントリを削除する最良の方法は何ですか? 毎日のデータを独自のテーブルに保存することについて説明しました。たとえば、その日のLog_2011_04_07すべてのエントリを取得し、最も古いテーブルを削除します。クエリを簡単にするために、すべての日テーブルにまたがるビューを作成できます。実行可能ですか?

2
ストアドプロシージャ内のこのクエリでSQLインジェクションが発生しないのはなぜですか?
次のストアドプロシージャを作成しました。 ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100)) AS SELECT ActorDOB, ActorName FROM tblActor WHERE ActorName LIKE '%' + @nameString + '%' AND ActorGender = @actorgender 今、私はこのようなことをしてみました。私はこれを間違っているかもしれませんが、そのような手順がSQLインジェクションを防ぐことができることを確認したいです: EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor' 以下の画像は、上記のSQLがSSMSで実行され、エラーではなく結果が正しく表示されることを示しています。 ところで、クエリの実行が完了した後、セミコロンの後にその部分を追加しました。その後、再度実行しましたが、テーブルtblActorが存在するかどうかを確認したところ、まだそこにありました。私は何か間違っていますか?または、これは本当に注射防止ですか?私がここで尋ねようとしているのは、このような安全なストアドプロシージャですか?ありがとうございました。

2
リーフページと非リーフページの違いは何ですか?
私はいくつかのインデックス使用レポートを実行していますが、LeafとNon-leafの定義を取得しようとしています。リーフと非リーフの両方の挿入、更新、削除、ページ結合、ページ割り当てがあるようです。私は本当にそれが何を意味するのか、または一方が他方よりも優れているかどうかを知りません。 誰かがそれぞれの簡単な定義を提供し、リーフまたは非リーフが重要である理由を説明できれば、それはありがたいです!

1
「どこ」でアクセントを無視する
データベースには、caron / hatschekを使用した複数のエントリがあります。現在、ユーザーは、なしでエントリを検索するときに、caron / hatschekを含むエントリを検索したいと考えています。これを簡単な例で示します。 データベースにエントリがあります(名前の連絡先) Millière この名前はその人が住んでいる国で正しいです 私たちの国では、caron / hatschekの文字はないため、ユーザーはを検索しMilliereます。è明らかに一致しないため、結果は表示されませんe。 私は、これはとして実現することができるか見当がつかないé、è、êその多くは、より利用可能です(これは手紙のための唯一の例ですe...)。 (文字列をすべてcaron / hatschekで基本文字列に置き換えるだけでよいので、他の方法ははるかに簡単です。明らかに、ユーザーは、障害のある名前ではなく、データベースの名前の正しいバージョンを望んでいます。)


1
NULL以外の値またはNULLの列をチェックするSQLクエリを記述する最適な方法
デフォルト値としてNULLを持つパラメーターを持つSPがあり、次のようなクエリを実行したい: SELECT ... FROM ... WHERE a.Blah = @Blah AND (a.VersionId = @VersionId OR (@VersionId IS NULL AND a.VersionId IS NULL)); WHERE非NULL値とのNULL値の両方のための上記のチェック@VersionId。 代わりにIFステートメントを使用し、クエリをNULL以外を検索するクエリとNULLを検索するクエリに複製する方がパフォーマンスの点で優れているでしょうか?: IF @VersionId IS NULL BEGIN SELECT ... FROM ... WHERE a.Blah = @Blah AND a.VersionId IS NULL; ELSE BEGIN SELECT ... FROM ... WHERE a.Blah = @Blah …


2
異なるプロセスの同じ一時テーブルのロックからのデッドロック
私は不可能だと思った何かを示すように見えるデッドロックを発見しました。デッドロックには2つのプロセスが関係します。 1. process8cf948 SPID 63 一時テーブル#PB_Cost_Excp_Process_Invoices_WorkでALTER TABLEを実行します。 オブジェクトID 455743580でテーブル#PB_Cost_Excp_Process_Invoices_WorkのIXロックを所有 2. process4cb3708 SPID 72 一時テーブル#PB_Cost_Excp_Process_Invoices_WorkでUPDATEを実行します。これは、テーブルの独自のコピーであると想定されています。 同じオブジェクトID 455743580で#PB_Cost_Excp_Process_Invoices_WorkのSch-Mロックを所有しています! これは不可能だと思われます。何か不足していますか?#Temporaryテーブルは、これら2つのSPID間で本当に再利用されましたか? これは、累積的な更新1(バージョン10.50.4260)が適用されたSQL Server 2008 R2 Service Pack 2にあります。 変更されていない完全なデッドロックトレースは以下のとおりです。2つのプロセスが、同じテーブル名#PB_Cost_Excp_Process_Invoices_Work_SNIP_0000000D8519を使用して同じオブジェクトIDで動作していることに注意してください。 12/14/2012 13:46:03,spid23s,Unknown,waiter id=process8cf948 mode=X requestType=wait 12/14/2012 13:46:03,spid23s,Unknown,waiter-list 12/14/2012 13:46:03,spid23s,Unknown,owner id=process4cb3708 mode=Sch-M 12/14/2012 13:46:03,spid23s,Unknown,owner-list 12/14/2012 13:46:03,spid23s,Unknown,objectlock lockPartition=0 objid=455743580 subresource=FULL dbid=2 objectname=tempdb.dbo.#PB_Cost_Excp_Process_Invoices_Work_________________________________________________________________________________0000000D8519 id=lock371705d00 mode=Sch-M associatedObjectId=455743580 12/14/2012 13:46:03,spid23s,Unknown,waiter …

2
呼び出し側データベースコンテキストで実行する中央ストアドプロシージャ
sys.dm_db_index_physical_statsビューを使用して、カスタマイズされたメンテナンスソリューションに取り組んでいます。現在、ストアドプロシージャから参照されています。これで、そのストアドプロシージャがデータベースの1つで実行されると、必要な処理が実行され、データベースに関するすべてのレコードのリストがプルダウンされます。別のデータベースに配置すると、そのDBのみに関連するすべてのレコードのリストがプルダウンされます。 例(下部のコード): データベース6に対して実行されたクエリは、データベース1〜10の[要求された]情報を示します。 データベース3に対して実行されたクエリは、データベース3のみの[要求された]情報を表示します。 特にデータベース3でこの手順が必要な理由は、同じデータベース内にすべてのメンテナンスオブジェクトを保持したいからです。このジョブをメンテナンスデータベースに配置し、あたかもそのアプリケーションデータベースにあるかのように動作させたいと思います。 コード: ALTER PROCEDURE [dbo].[GetFragStats] @databaseName NVARCHAR(64) = NULL ,@tableName NVARCHAR(64) = NULL ,@indexID INT = NULL ,@partNumber INT = NULL ,@Mode NVARCHAR(64) = 'DETAILED' AS BEGIN SET NOCOUNT ON; DECLARE @databaseID INT, @tableID INT IF @databaseName IS NOT NULL AND @databaseName NOT IN ('tempdb','ReportServerTempDB') BEGIN …

3
使用する他のデータベースの内部ストアドプロシージャ用の中央CLRストアドプロシージャ/関数リポジトリライブラリを設定しますか?
C#CLRで開発したコードを使用して、システム上のすべてのデータベースで使用できるようにしたいので、それぞれを信頼できるものに設定し、CLRをオンにして、それぞれに同じコードの束を保持する必要はありません。 。 管理およびセキュリティの観点からこれを行う最良の方法はありますか?CLR関数は、文字列ブレーカー、電子メール検証、url en / decode、base64などのように非常に基本的です。各データベースのdboスキーマのみが関数にアクセスできるようにしたいと思います。 これを行う簡単な方法はありますか? また、CLR dllが埋め込まれているかどうか、およびデータベースを移動する場合、タグが一緒に移動するか、dllも移動する必要があるかどうかはわかりません。 ありがとう


1
空の文字列: ''または ''が ''と等しいか?
誰が理由を説明できる select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' '); 利回り ----------- ----------- ----------- ----------- ----------- 1 0 0 0 1 これの面白い結果は create table test ( val varchar(10) ); insert into test values( '' ); update test set val = ' …

4
SQL大規模テーブルの設計
SQL Server 2008のテーブル設計に関する一般的な質問があります。現在、600 GBを超えるテーブルがあり、1日に約3 GBで成長しています。このテーブルには適切な指標がありますが、クエリを実行するときやそのサイズのために、大きなハングアップになりつつあります。問題は、年と月でテーブルを複数のテーブルに分割するか(これにより、他の部門が大規模なデータセットを分割する方法に適合します)、またはSQL Serverに組み込まれたパーティションを活用する必要があります。パーティショニングを使用すると、コードの変更が少なくて済むようです。パーティション分割時に読んだものから、まだ1つのテーブルを照会するだけで、サーバーはデータの取得方法を処理します。複数のテーブルルートを使用する場合、複数のテーブルからデータをプルする必要があります。

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