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

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

2
一定数の行を返した後にクエリが一時停止する
最大41レコード(たとえば)ですばやく(数秒)実行されるビューがありますTOP 41が、44以上のレコードでは数分かかり、TOP 42またはで実行すると中間結果が表示されTOP 43ます。具体的には、数秒で最初の39件のレコードを返し、残りのレコードを返す前に約3分間停止します。このパターンは、TOP 44またはをクエリする場合も同じTOP 100です。 このビューは元々ベースビューから派生したもので、ベースに1つだけフィルターを追加します。以下のコードの最後のフィルターです。子ビューをベースからチェーンする場合でも、ベースからのコードをインラインで子ビューに書き込む場合でも、違いはないようです。ベースビューは、数秒で100レコードを返します。子ビューをベースの50倍ではなく、ベースと同じくらい速く実行できるようにしたいと考えています。誰かがこのような行動を見たことがありますか?原因または解決策について推測はありますか? この動作は、関連するクエリをテストしたところ、過去数時間一貫していますが、速度が低下し始める前に返される行数はわずかに増減しました。これは新しいものではありません。合計実行時間は許容範囲内(<2分)だったので、今それを調べていますが、少なくとも数か月間、関連するログファイルでこの一時停止が見られました。 ブロッキング クエリがブロックされたことはありません。また、データベースに他のアクティビティがない場合でも問題が発生します(sp_WhoIsActiveによって検証済み)。ベースビューにはNOLOCK、価値のあるもの全体が含まれます。 クエリ 以下は、簡略化のためにベースビューがインライン表示された、子ビューの縮小バージョンです。それはまだ約40レコードで実行時のジャンプを示しています。 SELECT TOP 100 PERCENT Map.SalesforceAccountID AS Id, CAST(C.CustomerID AS NVARCHAR(255)) AS Name, CASE WHEN C.StreetAddress = 'Unknown' THEN '' ELSE C.StreetAddress END AS BillingStreet, CASE WHEN C.City = 'Unknown' THEN '' ELSE SUBSTRING(C.City, 1, 40) END AS BillingCity, …


2
スナップショットアイソレーションを使用すると、SQL Serverデータベースの書き込みが遅くなりますか?
システムで多くのデッドロックが発生しています。 それらを修正するためにスナップショットアイソレーションを使用したいのですが、私のDBAはそれについて予約しています。 彼の懸念の1つは、スナップショット分離が書き込み速度を低下させることです。これは、キャッシュに書き込んでからTempDb(行バージョン)に書き込む必要があり、呼び出し元に戻ることができるためです。 「通常の」書き込みは、キャッシュに書き込むだけで実行できます。 これは行のバージョン管理のしくみですか?それともそれよりも複雑ですか?それはどういうわけかこれらを並行して行いますか? それともスナップショットアイソレーションでは書き込みが遅くなりますか?

4
別のSQLインスタンスにアクセスするストアドプロシージャの実行
この質問が既に尋ねられた別の質問が繰り返される場合、私は謝罪します。私は何時間も検索しましたが、自分の状況に合うものを見つけていません。 望ましい結果 SQL認証を使用するユーザーは、Server1(デフォルトのインスタンス)上のDatabase1に対する実行権限を持っています。ユーザーは、プロセスの一部として、Server1 \ Instance2上のデータベース2にアクセスするストアドプロシージャを実行します。安全でシンプルなものにしたいと思います(どちらも重要です)。 より詳しい情報 私のWindows資格情報は、(同じサーバー上にある)両方のインスタンスにアクセスできます。したがって、ログインの下で問題なくストアドプロシージャを実行できます。ただし、ユーザーに自分のアクセスレベルを付与したくありません。ユーザーがドメインにいないため、SQLログインも使用する必要があります。 ストアドプロシージャに、そのプロシージャだけのアクセスレベルを与えたいと思います。私はシステム管理者なので、その手順に必要なすべてをユーザーに提供します。それが機能するようになったら、おそらく私の目的ではなく、その目的のためだけにアカウントを作成しますが、ストアドプロシージャの動作を制御するので、どちらにしても安全です。 "WITH EXECUTE AS"ステートメントをストアドプロシージャに入れてみましたが、Windowsログイン情報を取得できませんでした。私がそれを入れると、ストアドプロシージャをコンパイルすると次のエラーが発生します: ユーザー 'domain \ jdoe'は、存在しないか、権限がないため、実行できません。 私が言ったように、ユーザーは両方のサーバーのsysadminなので、それ以上何が必要かわかりません。 私は以下を調べました: 信頼できる-データベースを公開しないほうがいい リンクサーバー-追加のアクセス許可を与えたくありません。他のデータベースが自分のデータベースにアクセスすることを信頼していません。また、自分のデータベースが他のすべてのデータベースにアクセスすることを信頼していません。 証明書-これは複雑で難しいようです。これを実行し、維持するための非常に簡単な方法を見つけられない限り、問題の価値があるかどうかはわかりません。 所有権の連鎖-繰り返しますが、怖いです。私の目標がセキュリティ問題を防ぐことであるとき、これはより多くのセキュリティ問題を引き起こすようです。 ミラー化されたユーザー-他のサーバーインスタンスに同じ(明らかに異なるSID)ユーザーを作成し、同じパスワードを与えました。立ち入り禁止。 私は明白な何かを見逃しているように感じますが、それが何かはわかりません。一日中壁に頭をぶつけてきたので、近すぎて見られないだろう。ここで誰かが私に手を差し伸べるか、私を正しい方向に向けてくれれば幸いです。私は多くのMSDN記事を読んだと言います(男の子は嫌いですか?私が知りたいことを教えてくれないようです)。私が本当に欲しいのは、これを行う方法を順を追って説明するシンプルで簡単なチュートリアルです。それ以外に、私が進むべき方向の一般的な表示でさえ役立つでしょう。

1
なぜ人々はビューを通じて更新しないようにアドバイスされています
大学時代は、ビューを介してテーブルを更新しないように頭を悩ませられました。また、私が職場に入ったとき、ビューを通じてデータベースを更新しないように言われました。 これを行うと、パフォーマンスに大きな影響がありますか?または、これは上級開発者/ DBAがジュニア担当者に誤った結合で無意識のうちに大混乱を引き起こす可能性があるために、これを行わないように指示するケースです。 編集 私はMSSQL 2000-2008を使用しています(クライアントの詳細によって異なります)

2
nvarchar(max)がデータベースにデータを格納する方法は、一部のデータが4000文字未満の場合、どのように高速になるでしょうか?
アラビア語と英語の2つの言語をサポートするCMSを開発する必要があります。このCMSは、一種のArticle Publishingサイトになります。設計と分析中に、一部の記事が8000文字を超えることがわかりました。私のテーブルにはいくつかの列があります PageID int, PageTitleEnglish nvarchar(200), PageTitleArabic nvarchar(200), PageDescEnglish nvarchar(500), PageDescArabic nvarchar(500), PageBodyEnglish nvarchar(max) PageBodyArabic nvarchar(max) PageBodyをnvarchar(4000)として保持する場合、iaは4000文字に制限され、アラビア語バージョンを保存する必要がある場合は、16000バイトが必要です(アラビア語はUnicodeであり、ASCIIの3倍のスペースが必要です)。 そのため、PageBodyをnVarchar(max)として定義するオプションのみが残されています。これには、パフォーマンスの観点からの欠点があります。私の実際の質問は、PageBody列の一部のデータが4000文字未満である場合、インライン列のデータよりもMS SQLストアであるか、データベースで個別にあるかです。 私もこれをGoogleで探しましたが、関連する答えや、そのようなシナリオでパフォーマンスを向上させる方法は見つかりませんでした。 このような多言語CMSの設計のベストプラクティスに関する提案は大歓迎です。 サポートする必要があるのはアラビア語と英語の2言語のみです

2
SQL Server 2008 R2ログインを削除できません
数日前にSQL Serverログインを作成しました。今、私は同じものを削除する必要があります。そこで、SQL Server Management Studio => Security => Loginsに移動して、削除するログインを選択しました。それは言う情報メッセージを表示します サーバーログインを削除しても、ログインに関連付けられているデータベースユーザーは削除されません。プロセスを完了するには、各データベースのユーザーを削除します。最初にスキーマの所有権を新しいユーザーに譲渡する必要があるかもしれません。 このメッセージを無視して、削除プロセスを確認すると、次のような致命的なエラーが発生します。 ログイン「iis_login」のドロップに失敗しました。(Microsoft.SqlServer.Smo) Transact-SQLステートメントまたはバッチの実行中に例外が発生しました。(Microsoft.SqlServer.ConnectionInfo) このログインは1個のジョブの所有者です。ログインを削除する前に、これらのジョブを削除または再割り当てする必要があります。(Microsoft SQL Server、エラー:15170) ログインによって所有されているジョブ(上記のメッセージによる)があるときに、ログインを削除するにはどうすればよいですか。 よろしく、Nirvan。

2
サーバーのアップグレードプロジェクトに関するDBAとのミーティング-一般的な懸念事項
私はネットワーク/ Windowsの管理者であり、SQLサーバーのアップグレードプロジェクトの監督を任されています。DBAと会って、アップグレードに関する彼らのニーズ/要望について話し合う必要があります。完全に盲目になりたくないので、まず皆さんにお聞きしたいと思いました。SQL Server 2008からSQL Server 2008 R2に移行しており、可能であればWindows Server 2008 R2に移行する予定です。DBAとして、このようなアップグレードについてどのような懸念がありますか?同時に見たいことはありますか?

3
単一のミラーリングされたデータベースの自動フェイルオーバーをトリガーする簡単な方法はありますか?
自動フェールオーバー構成を備えた安全性の高いsqlserver2008-R2の単一インスタンスに3つのミラーリングされたデータベースがあります。1つのデータベースのみの自動フェイルオーバーをトリガーする方法はありますか? SSMSの[フェールオーバー]ボタンをクリックするだけでなく、データベースが実際に到達できない場所をシミュレートしたいと思います。プライマリのエンドポイントを停止できますが、同じエンドポイントを使用するため、3つのデータベースすべてに到達できなくなります。 1 dbだけを無効にするにはどうすればよいですか?

6
一意のインデックスの最大16列を回避する方法
CREATE INDEXドキュメントによると: 最大16列を単一の複合インデックスキーに組み合わせることができます。 一意の組み合わせを形成する必要がある〜18列のテーブルがあります。このテーブルはパフォーマンスの影響を受けません -値を更新したりレコードを挿入したりすることはほとんどありません。レコードが重複しないようにする必要があるだけです。単純な一意性の制約を課すことができると考えました。 何か案は?より良い方法がある場合は、一意のインデックス/制約を完全に回避することにオープンです。

2
SQLディスクセットアップのアドバイス-TempDB、ログDB、データファイルの配置に関する質問
非常にアクティブなデータベースサーバーがあり、その上でさまざまなアプリケーションが実行されています。最も忙しいのは、1日中ドキュメントスキャンとワークフロー処理を行うLaserficheデータベース(平均2800バッチリクエスト/秒)と、メールをルーティングするブラックベリーサーバーアプリです。他にも約25の小さなアプリケーションデータベースがあります。 私たちは政府機関なので、1つのDBサーバーライセンスの予算しか与えられていません。 最近、ディスク競合の問題に対処するためにSANが提供されました。 現在、TempDBは独自のディスク(RAID 1ミラーペア)で実行されており、トランザクションログとデータファイルをSANに移動しています。トランザクションログは1つの論理的な場所に配置され、データファイルは別の場所に配置されました。物理的には同じアレイですが、RAID 1 + 0構成の合計14個のスピンドル(ディスク)で構成されるアレイです。 かなり頑丈なSAN-そして物事ははるかによく実行されています。キューの長さが半分になりました。 ちょうど今日、私たちは別のオプションも与えられました。現在ファイルサーバーで必要な場合は、4つのディスクアレイを使用することもできます。MDFとLDFを2つの別々のアレイに配置することをお勧めしますが、この状況でこれを行う唯一の方法は、データログまたはトランザクションログをSANからRAID 5として構成された4ディスクアレイに移動することです。現在、別の論理ボリュームにありますが、同じ物理アレイを共有しています。 ヒップからの撮影は、MDFとLDFを14スピンドルRAID 1 + 0アレイに一緒に配置するのが、4スピンドルRAID 5アレイに配置するのと同じくらい良いと思います。しかし、ディスクロジックの専門家であるかどうかは尋ねられません。どちらのオプションも基本的に同一の15k SASディスクを使用しています。つまり、各スピンドルは基本的に同一です。 つまり、本質的には問題です。raid 1 + 0として構成された単一の14スピンドルアレイのMDF / LDFは、データまたはログを独自の4スピンドルraid 5アレイに移動することにより、大幅なマージンで(またはまったく)改善されますか? 考え? 更新された情報: また、ログボリュームの現在の平均キュー長は、ほぼ一貫して0.55前後であることに注意してください。データボリュームの平均キュー長が0.01を超えることはほとんどありません(通常は0.00) sys.dm_io_virtual_file_statsクエリ結果: <table> <tr> <td>database id</td> <td>Volume</td> <td>io_stall_read_ms</td> <td>num_of_reads</td> <td>avg_read_stall_ms</td> <td>io_stall_write_ms</td> <td>num_of_writes</td> <td>avg_write_stall_ms</td> <td>io_stalls</td> <td>total_io</td> <td>avg_io_stall_ms</td> </tr> <tr> <td>25</td> <td>h</td> <td>175086</td> <td>1411</td> <td>124</td> <td>69</td> …

2
パラメータなしのEXEC()とsp_executesqlの違いは?
新しいsp_executesqlストアドプロシージャについて学習しました。SQL Server内からパラメーター化されたコードを実行する方法があるのが気に入っています。 しかし、パラメータがない場合のsp_executesqlストアドプロシージャの使用と、直接EXECを呼び出すだけの違いは何なのかと思います。また、パフォーマンスに影響がありますか? exec('select * from line_segment') exec sp_executesql N'select * from line_segment' また、2005年と2008年の間に違いはありますか、それとも同じように扱いますか?

3
SSMSのSQLCMDモードと@@ variable展開
(コマンドラインからではなく)SSMSでSQLCMDモードを使用する場合、現在のサーバーとインスタンスを変数に割り当てる方法はありますか?これは、通常のTSQL変数の割り当てとは異なります。 問題の定義 SQLCMDの変数拡張機能を使用して、導入した既存のtsql文字列構築マッシュの代わりに、配置スクリプトの環境固有の値を置き換えたいと思います。現在の環境の1つの例外を除いて、SQLCMDを使用してデプロイを処理することは非常にうまくいきました。 -- -- define 2 sqlcmd variables that will be expanded in scripts -- :setvar dbServer "DEVA2\DEV2" :setvar dbNotServer @@servername SELECT '$(dbServer)' AS hard_coded_value , @@servername AS [servername] , '$(dbNotServer)' AS dbNotServer そして、それは以下の結果を生成します。 hard_coded_value servername dbNotServer DEVA2\DEV2 DEVA2\DEV2 @@servername ミートローフは3分の2は悪くないと言っていますが、私は3分の3の解決策を持っていると思います。スクリプトがテストサーバーに展開されたとき、スクリプトの編集を展開担当者に任せたくありません。 SQLCMDを使用するための唯一の解決策がコマンドラインからスクリプトを完全に呼び出すことである場合、私はそれを受け入れることができますが、SQLCMDを使用するのは環境に優しいので、ここでこれを捨てたいと思います。 望ましい出力 :setvar dbNotServer @@servername SELECT '$(dbNotServer)' AS …

1
誰かがOpendatasource / Openrowsetの魔法を説明できますか?
Excelファイル(またはms-access DB)から情報を取得するとき、私は一般的に次のようなものを使用します。 SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=C:\test.xls;Extended Properties=''EXCEL 12.0;HDR=NO;IMEX=1'' ')...[Sheet1$] 時々それは働きます。時々それはしません。 誰かがこれを設定するためのガイドを知っていますか? tempフォルダーについて、正しいドライバーのダウンロードについて、拡張プロパティについて、ファイルを開いていないことについて知っています。時々、しかし、私はまだ得る- リンクサーバー "(null)"のOLE DBプロバイダー "Microsoft.ACE.OLEDB.12.0"は、メッセージ "不明なエラー"を返しました。 私は昨日この問題に遭遇しました。マシンを再起動しました-動作しませんでした。次に、インスタンスとP00fを再起動しました。魔法のように機能しました。 だからそれが私の質問です-素晴らしい「詳細不明のエラー」を受け取ったとき、これが機能するためにすべての星が並んでいることを確認するために何をチェックする必要がありますか?


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