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

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

2
SQL Serverがすべてのメモリを使用していない
SQL Server 2014で、最大メモリを6GBに設定しています(物理メモリは8GB)。 ターゲットサーバのメモリは、時には6ギガバイトで、その後、バックに落ちるの合計サーバーメモリ(約5.3ギガバイト、6ギガバイトに達することはありません)。私が使用committed_kbをしてsys.dm_os_sys_info SQL Serverが使用するメモリをチェックします。 sys.dm_os_buffer_descriptorsを監視すると、ページがキャッシュから削除されていることがわかりますが、残りのメモリは700MBです。メモリが必要ない場合、ページがキャッシュから削除されるという事実をどのように説明しますか?SQL Serverは、メモリが必要な場合にのみページを削除すると思います。 割り当て解除された一時テーブルは、このサーバーでは問題になりません。私のPLEは3632です。プロシージャキャッシュは2182 MBです。 メモリが残っていない場合にのみページがドロップされると思いますが、700MBの空き容量があるか、これを誤解していますか? 誰かがこの動作を説明してみてください。 SQL Serverもディスクから読み取っているので、必要なすべてのページがメモリにあるとは限らないと思います。 さらに調査を行ったところ、ディスクからメモリに大量のページを読み取り、読み取り中にタスクマネージャに何かがあったことに気づきました。 使用中のメモリは7.0GB-> 7.2GB-> 7.0GB-> 7.2GB-> ... Sqlservr.exeは5.3GB-> 5.5GB-> 5.3GB-> 5.5GB-> ... これは、Windowsがsqlservr.exeを6GBに拡張できないようです。 Shankyから提供されたクエリを実行しました。 select (physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB, (locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB, (Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile process_physical_memory_low, process_virtual_memory_low from sys. dm_os_process_memory これにより、次の結果が得られました。 Physical_Memory_usedby_Sqlserver_MB: 5247 Locked_pages_used_Sqlserver_MB: 0 Total_Memory_in_MB: 5625 process_physical_memory_low: 0 process_virtual_memory_low: …

1
インメモリテーブルのパフォーマンスがディスクベースのテーブルよりも悪い
SQL Server 2014に次のようなテーブルがあります。 CREATE TABLE dbo.MyTable ( [id1] [bigint] NOT NULL, [id2] [bigint] NOT NULL, [col1] [int] NOT NULL default(0), [col2] [int] NOT NULL default(0) ) (id1、id2)はPKです。基本的に、id1は結果のセット(id2、col1、col2)をグループ化する識別子であり、pkはid2です。 私のボトルネックである既存のディスクベースのテーブルを取り除くために、メモリ内のテーブルを使用しようとしています。 テーブル内のデータが書き込まれます->読み取り->一度削除されます。 各id1値には、数千(数十/数十万)のid2があります。 データは、非常に短時間、たとえば20秒の間、テーブルに保存されます。 このテーブルで実行されるクエリは次のとおりです。 -- INSERT (can vary from 10s to 10,000s of records): INSERT INTO MyTable SELECT @fixedValue, id2, col1, col2 …

6
空白(スペース、タブ、改行)を削除する
私は、SQL Serverの2014年だと私は空白が簡単で、スペース、タブまたは改行(両方の可能性があり、列のコンテンツの開始と終了からクリーン空白に必要\nと\r\n)。例えば ' this content ' should become 'this content' ' \r\n \t\t\t this \r\n content \t \r\n ' should become 'this \r\n content' 等々。 私は最初のケースだけを達成することができました UPDATE table t SET t.column = LTRIM(RTRIM(t.column)) しかし、それ以外の場合は機能しません。

1
suser_name()がADアカウント名の変更を反映しないのはなぜですか?
ユーザー名の1つが合法的に変更されたため、Active Directoryのユーザー名をdomain \ oldnameからdomain \ newnameに変更しました。ただし、suser_sname()がストアドプロシージャでこのユーザーによって呼び出されると、新しい名前ではなく古い名前が返されます。 グーグルによって私はKB 946358に誘導されました。これは、おそらくsuser_name()がLsaLookupSidsを呼び出しているために、それらの名前がサーバーにキャッシュされ、更新されていないことを示唆しています。ただし、その記事の回避策にはサーバーの再起動が含まれており、それでも問題を理解したいと思います。 私のコンテキストを彼らのものに変更すると、正しい名前が戻ってきます: EXECUTE AS LOGIN = 'domain\newname' GO SELECT suser_name() --returns 'domain\newname' ...これもLsaLookupSidsを呼び出すため、正しくない名前が返されると想定していました。ここで働いているメカニズムを本当に理解していないようです。 重要かもしれないいくつかの観察: このユーザーはサーバーに明示的にログインしていません。しかし、彼らはそうするADグループのメンバーです。変更された名前(domain \ newname)がの結果セットに表示されexec xp_logininfo 'domain\ADGroupName', 'members'ます。domain \ oldnameにはありません。 ユーザーが、Access 2003 MDBのパススルークエリから呼び出されたストアドプロシージャ内からsuser_name()を呼び出しています。 過去に多くのユーザーのアカウント名を変更しましたが、この問題は先週しか確認されていません(先週、2つの変更が行われ、どちらも問題が発生しているようです)。 サーバーは、Windows 2008 R2 DatacenterエディションでSql Server 2008 SP3 x64を実行しています。 どうしたの?DBAとして、私は何をすべきか、またはこれを解決するためにどこを見ればよいでしょうか?

3
列の特殊文字をスペースで置き換える
特殊文字をスペースに置き換えるクエリを作成しようとしています。以下のコードは、行を識別するのに役立ちます。(英数字、カンマ、スペースは有効です): SELECT columnA FROM tableA WHERE columnA like '%[^a-Z0-9, ]%' 置換関数をselectステートメントに統合して、結果セット内の英数字、コンマ、スペース以外のすべての文字を ''(スペース)で置き換えるにはどうすればよいですか。これは機能しません: SELECT replace(columnA,'%[^a-Z0-9, ]%',' ') FROM tableA WHERE columnA like '%[^a-Z0-9, ]%'

1
アップグレード後、SQL Server AlwaysOnデータベースが同期しないモードまたはリカバリモードでスタックする。エラー:データベース '…'バージョン782を開けません
SQL Server 2014 SP1(12.0.4422.0)からSQL Server 2016 CTP 3.2(13.0.900.73)へのアップグレードをテストしているときに、推奨される更新プロセスに従い、フェールオーバー後にデータベースが古いプライマリで起動しないという問題に遭遇しました更新されたセカンダリに。私たちの設定はプライマリレプリカと単一のセカンダリレプリカであり、私が完了した手順は次のとおりです。 同期コミットセカンダリレプリカの自動フェイルオーバーを削除する セカンダリサーバーインスタンスを新しいバージョンにアップグレードする セカンダリレプリカに手動でフェイルオーバーする 新しいプライマリレプリカでデータベースがオンラインであることを確認する 以前のプライマリレプリカを新しいバージョンにアップグレードする セカンダリのアップグレードとそれをプライマリにするフェイルオーバーは、期待どおりに機能しました。しかし、以前のプライマリレプリカをアップグレードした後、その上のデータベースがSSMSで「同期していない/回復中」としてリストされていることに気付きました。また、それらにアクセスしようとすると、エラーメッセージが生成されます。 データベース...にアクセスできません。(ObjectExplorer) 私が見たSQL Serverログを介してチェック データベース '...'バージョン782を開けません。データベースを最新バージョンにアップグレードしてください。 master..sysdatabasesテーブルをクエリすると、テーブルが確かに古いバージョンであり、アップグレード中に更新されていないことがわかりました。 残念ながら、ログには更新されなかった理由が示されておらず、可用性グループダッシュボードには、一部の可用性データベースのデータ同期状態が正常ではなく、理由がないことを示す一般的な警告しかありませんでした。 TSQLを使用してデータベースをデタッチするか、オフラインに設定して更新を「キック」しましたが、それらはSQL AGの一部であるため、これらのコマンドは機能しません。 SQL AGの一部であるデータベースを最新バージョンにアップグレードするにはどうすればよいですか?



3
バックアップを実行するときのヘッダーのみの復元の使用は何ですか?
次のクエリでバックアップを監視すると: SELECT command, percent_complete, 'elapsed' = total_elapsed_time / 60000.0, 'remaining' = estimated_completion_time / 60000.0 FROM sys.dm_exec_requests WHERE command like 'BACKUP%' or command like 'RESTORE%' バックアップの前に、SQL Serverがヘッダーを復元してからバックアップを実行することに気づきました。 何に使うのか、なんとか実行時間を短縮できるのかと思っていました。実際のバックアップよりも時間がかかるようです。

2
sp_executesqlをデフォルトで設定/使用できますか?
SQL Serverに対して非常に動的なSQLクエリを使用するアプリケーションを探しています。非常に奇妙で複雑な方法で作成されたクエリを見て、それは別の話ですが、私が自分で物事を見つけることができない(あまりにも愚かすぎる)ことの正当な理由を与えるように言います...わかりませんクエリがでラップされているコードsp_executesql。 しかし、トレースすると、多数のクエリがでラップされて表示されsp_executesqlます。アプリケーションソリューション全体には、コマンドもまったく含まれていませんsp_executesql。 だから、デフォルトでsp_executesqlを使用してクエリをラップするようソフトウェアに強制する、まだ知らない種類の構成があるのか​​どうか疑問に思いました。 何がこの動作を引き起こす可能性がありますか?


1
何を試してもSQLCMDが機能しない
私が何をしようとも、SQLCMDを機能させることができません。サイズが200mb +で、SQLサーバーアプリケーションから実行できないスクリプトを実行しようとしているので、SQLCMDを介して実行する必要がありますが、スクリプトをログインまたは実行しようとすると、スクリプトはすぐに閉じます。 私はmsdnによってsqlcmdユーティリティを追跡しました。 信頼できるコマンドSQLCMD -EI getを使用してそれを実行しようとしました: Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Named Pipes Provider: Could not open a connection to SQL Server [2]. . Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Login timeout expired. Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : A …

4
FIRST()およびLAST()のSQL Server 2012バージョンは何ですか?
value列のあるテーブルがあります。次に示すように、最後の行から最初の行を差し引いて計算します。 id value 1 10 2 45 3 65 4 95 . . . . . . 500 200 入手したい 200 - 10 = 190 SQL Server 2012で以下のコマンドを使用しようとしましたがLAST、機能FIRSTしません。 SELECT LAST(Value) - FIRST(Value) FROM Counter; SQL Serverでのこのコマンドの構文は何ですか?

1
sys.dm_exec_sessionsの「reads」列は実際には何を示していますか?
これは非常に基本的な質問のように思えるかもしれませんが、実際にそうである必要があります。ただし、科学的手法のファンとして、私は仮説を立て、それをテストして自分が正しいかどうかを確認するのが好きです。この場合、私はの出力sys.dm_exec_sessions、より具体的には、単一列の「読み取り」をよりよく理解しようとしています。 SQL Server Books Onlineでは、これを次のように明確に指定しています。 このセッション中に、このセッションのリクエストによって実行された読み取りの数。null可能ではありません。 これは、セッションの開始以降、このセッションによって発行された要求を満たすためにディスクから読み取られたページの数を示していると考えられます。これは私がテストしようと思った仮説です。 logical_reads同じテーブルの列は次のように定義されます。 セッションで実行された論理読み取りの数。null可能ではありません。 SQL Serverの使用経験から、この列はディスクとメモリの両方から読み取られたページ数を反映していると思います。つまり、ページがどこにあるかに関係なく、セッションでこれまでに読み取られたページの総数です。同様の情報を提供する2つの別々の列を持つことの差別化要因、つまり価値命題は、特定のセッションでディスクから読み取られたページ()とバッファキャッシュから読み取られたページ()の比率を理解できるように思われるでしょう。readslogical_reads 私のテストリグでは、新しいデータベースを作成し、既知のページ数のデータを含む単一のテーブルを作成してから、新しいセッションでそのテーブルを読み取りました。次にsys.dm_exec_sessions、readsとのlogical_readsコラムがセッションについて何を言っているかを確認しました。この時点で私は結果に困惑しています。おそらくここにいる誰かが私にこれについていくつかの光を当てることができます。 テストリグ: USE master; IF EXISTS (SELECT 1 FROM sys.databases d WHERE d.name = 'TestReads') BEGIN ALTER DATABASE TestReads SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE TestReads; END GO CREATE DATABASE TestReads; GO ALTER DATABASE TestReads SET RECOVERY SIMPLE; …

3
空のテーブルをクエリするアプリケーション
私の会社では、かなり大きなパフォーマンスの問題があるアプリケーションを使用しています。データベース自体には多くの問題がありますが、私が取り組んでいるところですが、問題の多くは純粋にアプリケーションに関連しています。 私の調査では、空のテーブルをクエリする何百万ものクエリがSQL Serverデータベースにヒットしていることがわかりました。約300の空のテーブルがあり、それらのテーブルの一部は1分あたり最大100〜200回クエリされます。テーブルは私たちのビジネス領域とは何の関係もなく、基本的に元のアプリケーションの一部であり、ベンダーが私たちのためにソフトウェアソリューションを作成するように契約したときにベンダーが削除しませんでした。 アプリケーションエラーログがこの問題に関連するエラーであふれていると思われるという事実は別として、ベンダーは、アプリケーションまたはデータベースサーバーのいずれにもパフォーマンスまたは安定性の影響がないことを保証します。エラーログは、診断を行うために2分を超える価値のあるエラーが表示されない程度にフラッディングされます。 これらのクエリの実際のコストは、CPUサイクルなどの点で明らかに低くなります。しかし、SQL Serverとアプリケーションにどのような影響があるかを誰かが示唆できますか?リクエストの送信、確認、処理、返送、アプリケーションによる受信確認の実際のメカニズム自体がパフォーマンスに影響を与えると思います。 アプリにはSQL Server 2008 R2、Oracle Weblogic 11gを使用しています。 @ Frisbee-短い話ですが、アプリのデータベースの空のテーブルにヒットするクエリテキストを含むテーブルを作成し、空であることがわかっているすべてのテーブル名についてクエリを実行し、非常に長いリストを取得しました。トップヒットは30日間の稼働時間で270万回の実行でした。アプリは一般的に午前8時から午後6時まで使用されているため、これらの数値は運用時間に集中しています。複数のテーブル、複数のクエリ、おそらく結合を介した関連性の高いものとそうでないもの。トップヒット(当時は270万)は、結合のないwhere句を使用した単一の空のテーブルからの単純な選択でした。空のテーブルへの結合を伴うより大きなクエリにはリンクテーブルの更新が含まれる可能性があると予想しますが、それを確認してこの質問をできるだけ早く更新します。 更新:1043から4622614(2.5か月以上)の実行数のクエリが1000個あります。キャッシュされたプランがいつから始まったかを調べるために、さらに掘り下げる必要があります。これは、クエリの範囲を把握するためのものです。ほとんどは、20を超える結合でかなり複雑です。 @ srutzky-はい、計画がいつコンパイルされたかに関連する日付列があると思いますので、それを確認してみましょう。SQL ServerがVMwareクラスター上にある場合、スレッドの制限が要因になるのでしょうか。ありがたいことに、すぐに専用のDell PE 730xDになります。 @Frisbee-返信が遅くなってすみません。あなたが示唆したように、SQLQueryStress(実際には240,000回の反復)を使用して、空のテーブルからselect *を24スレッドで10,000回実行し、10,000バッチリクエスト/秒をすぐにヒットしました。その後、24スレッドで1000倍に削減し、4,000バッチリクエスト/秒未満でヒットしました。また、12スレッドのみで10,000回の反復を試行し(合計120000回の反復)、これにより、持続的な6,505バッチ/秒が生成されました。CPUへの影響は実際に顕著で、各テスト実行中の合計CPU使用量の約5〜10%です。ネットワーク待機はごくわずかでした(私のワークステーション上のクライアントで3ミリ秒など)が、CPUへの影響は確かにありました。それは、CPU使用率と、不要なデータベースファイルIOに要約されます。1秒あたりの合計実行回数は3000弱で計算され、これは本番環境ではありませんが、このような数十のクエリの1つだけをテストしています。したがって、毎分300〜4000回の割合で空のテーブルにヒットする何百ものクエリの正味の影響は、CPU時間に関しては無視できません。すべてのテストは、デュアルフラッシュアレイと256GB RAM、12個の最新コアを備えたアイドル状態のPE 730xDに対して行われました。 @ srutzky-良い考え。SQLQueryStressはデフォルトで接続プールを使用しているようですが、とにかく調べてみたところ、接続プールのボックスがオンになっていることがわかりました。フォローして更新 @ srutzky-アプリケーションで接続プーリングが有効になっていないようです-有効になっている場合は機能していません。プロファイラートレースを実行したところ、接続に監査ログインイベント用のEventSubClass "1-Nonpooled"があることがわかりました。 RE:接続プーリング-weblogicsをチェックしたところ、有効な接続プーリングが見つかりました。プーリングのトレースをさらに実行し、プーリングの兆候が正しく/まったく発生していないことを発見しました: 次に、データが設定されたテーブルに対して結合を使用せずに単一のクエリを実行すると、次のようになります。例外は、「SQL Serverへの接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからなかったか、アクセスできませんでした。インスタンス名が正しく、SQL Serverがリモート接続を許可するように構成されていることを確認してください。 (プロバイダー:名前付きパイププロバイダー、エラー:40-SQL Serverへの接続を開けませんでした) "バッチリクエストカウンターに注意してください。例外が生成されている間にサーバーにpingを実行すると、ping応答が成功します。 更新-2つの連続するテスト実行、同じワークロード(select * fromEmptyTable)、プーリング有効/無効。CPU使用率がやや多く、多くの障害が発生し、500バッチリクエスト/秒を超えることはありません。テストでは、10,000バッチ/秒でプールがオンの場合の障害はなく、約400バッチ/秒の場合、プールが無効になっているために多くの障害が発生しています。これらの失敗は接続の可用性の欠如に関連しているのだろうか? @ srutzky- sys.dm_exec_connectionsからCount(*)を選択します。 プーリングが有効:負荷テストが停止した後でも37が一貫して 無効化されたプーリング: SQLQueryStressで例外が発生しているかどうかに応じて11-37。つまり、これらの谷がBatches / secグラフに表示されると、SQLQueryStressで例外が発生し 、接続数が11に減少し、その後37に徐々に戻ります。バッチがピークに達し、例外が発生していないとき。とても面白いです デフォルトの0に設定されている両方のテスト/ライブインスタンスの最大接続数。 アプリケーションログを確認しても接続の問題は見つかりませんが、エラーの数とサイズが多いため、利用できるログ記録は数分しかありません。つまり、スタックトレースエラーがたくさんあります。アプリサポートの同僚は、接続に関連してかなりの数のHTTPエラーが発生するとアドバイスしています。これは、何らかの理由でアプリケーションが正しく接続をプールしておらず、その結果、サーバーが繰り返し接続を使い果たしているように思われます。アプリのログを詳しく調べます。これがSQL …

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