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

SQL Server 2005(メジャービルドバージョン9.00.xxxx)。sql-serverにもタグを付けてください。

4
SQL Server 2005/8クエリ最適化のヒント
私は、より良いSQL Serverクエリを作成することについてチームを教育することを検討しており、パフォーマンスを向上させるための最良のヒントは何であるかと考えていました。 たとえば、count(*)がcount(1)よりもパフォーマンスが悪いと主張するDBAがいました(彼女が正しいかどうか、または最新のクエリオプティマイザーに対してまだ有効かどうかはわかりません)。 どのような単純なことをチームに伝えて、常に使用または回避を試みるべきですか?私は理想的には、(a)合理的な違いを生む可能性があり、(b)明言するために1-2行であるものを探しています。

1
RESOURCE_SEMAPHOREおよびRESOURCE_SEMAPHORE_QUERY_COMPILEの待機タイプを解決する方法
以下の構成のサーバーでホストされている、サイズ300 GBのデータベースの1つからデータをヒット/フェッチする、実行速度の遅いSQLサーバークエリの根本原因を突き止めようとしています。 Windows Server 2003 R2、SP2、Enterprise Edition、16 GB RAM、12 CPU's 32ビット SQL Server 2005、SP4、Enterprise Edition、32ビット。 64ビットへのアップグレードについては既に1か月以上かかるとの情報を提供しています。 しかし、現在の問題では、メモリのプレッシャーを解決できるか、最終的にRAMを増やすという結論に達することができる場合、データを収集しようとしています。 完了したアクション:このデータベースでは、インデックスの再作成と統計の更新が適切です。 以下に示すように、過去5日間、ロード時間中に実行されたセマフォのwaittypeに気付きました。 以下のクエリの後のいくつかの情報:バッファのサイズ= 137272 SELECT SUM(virtual_memory_committed_kb) FROM sys.dm_os_memory_clerks WHERE type='MEMORYCLERK_SQLBUFFERPOOL' セマフォメモリ=以下のクエリごとに644024 SELECT SUM(total_memory_kb) FROM sys.dm_exec_query_resource_semaphores 以下はdm_exec_query_resource_semaphores、sys.dm_exec_query_memory_grantsDMV から収集された詳細情報です。 したがって、上記の情報が収集され、SP_Blitzデータごとにリソースセマフォが問題のようです。 リソースセマフォIDに割り当てられたメモリ 'target_memory_kb'は、使用可能な16 GB RAMと比較して低すぎますか。 注* 8時間の分析ごとに 'target_memory_kb'を実行すると、使用可能な16 GBと比較して常に1 GB未満になりますか? ここで問題になる可能性のあるものと解決方法は、提案してください ありがとう

2
SQL Agent PowerShellコンテキストリファレンス
私の新しい仕事では、各サーバーに複数の名前付きインスタンスがあります。例えば Server1 \ Dev Server1 \ DevIntegrated Server1 \ QA OSを呼び出すSQL PowerShellスクリプトがあり、呼び出しますFoo.exeが、コマンドラインパラメーター(接続文字列)を渡す必要があります。SQLエージェントジョブは各インスタンスに存在し、PowerShellタイプのステップで、現在のコンテキストが何であるかを知る必要があります。つまり、この実行はDevIntegratedで始まりました。 すべてのスクリプトを最初から始めたいとは思いません... $thisInstance = "Dev" ...特に、今後数か月で環境(新しいサーバーと名前付きインスタンス)に移行するときに編集する必要があるためです。 SQLPSを起動すると、Get-Locationまたは実行の結果をスライスしてダイシングすることにより、インスタンスを特定できます。 (Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName SQLエージェントがPowerShellタイプのジョブを開始すると、C:\ windows \ system32で開始さGet-Locationれ、SQLSERVERコンテキストではないため、ルートは機能しません。そのコンテキストに変更できますが、SQL Serverの「ルート」にいるので、どのインスタンスにいるべきかわかりません。Invoke-Sqlcmdルートを使用しても同じ理由で機能しません(技術的には、デフォルトのインスタンスではありません) 私の知る限り、ジョブログに記録できる基本的な「もの」をすべて列挙しましたが、何も表示されないようです SQLSERVER:\SQL\Server1\DevIntegrated Get-ChildItem Get-Host Get-Location Get-Process Get-PSDrive Get-PSProvider Get-Service Get-TraceSource Get-Variable Get-Process私はそれと、インスタンスをヒットしてspidを一致させることによって物事を一緒にしようとするいくつかのブードゥー教を使用することができるようですが、それは地獄からの血まみれのハックのように聞こえます。私が見逃している基本的なものがあるはずです、誰かが光を当てることができますか? 調査されたPowerShellの代替 他のジョブタイプを使用して調査したところ、満足のいく解像度が得られませんでした。調査の結果、SQL Agentの下にリストされているPowerShellはSQLPSであり、Agentを右クリックしてインスタンスを起動すると、自動的に正しい場所にドロップされました。前述のように違いを知ったのは、ジョブコードに対話型コードを貼り付けたときだけです。 OSのジョブタイプは、どのインスタンスがコマンドシェルにドロップしたかを判別する方法を見つけることができなかったという点で、同じ状態になりました。もちろん、sqlcmdで値を取得できますが@@servername、sqlcmdを開始する接続がわかっていれば、データベースを照会する必要はありません;) TSQLは有効にすればおそらく動作する可能性xp_cmdshellがありますが、オンになっているかどうかはわかりません。それでも、私は動的SQLに夢中になり、PowerShellが提供する表現力とパワーの多くを失います。 少し不格好ですが、最初のステップで変数を定義し、それを後続のステップに渡すことを考えましたが、この記事で複数のジョブステップの処理(BOL) ジョブステップは自己完結型でなければなりません。つまり、ジョブは、ジョブステップ間でブール値、データ、または数値を渡すことはできません。ただし、永続テーブルまたはグローバル一時テーブルを使用して、1つのTransact-SQLジョブステップから別のステップに値を渡すことができます。ファイルを使用して、あるジョブステップから別のジョブステップに実行可能プログラムを実行するジョブステップから値を渡すことができます。 よく知られたファイル/環境変数/レジストリ設定のような一般的なトリックを使用することはできませんFoo.exe。 …

3
孤立したユーザーを見つける
SQL Server 2005には、サーバーレベル(サーバーレベルで削除されたが、削除される前にデータベースから関連付け解除されなかったアカウント)に存在しないユーザーまたはリンクされていないアカウントを見つける方法があります(アカウントはサーバーレベルで削除されたが、データベースレベルではなく削除された可能性があるが、データベースレベルはクリーンアップされなかった)。 私は非常に乱雑なサーバーを持っているので、これらを見つけるために実行するクエリがあれば素晴らしいでしょう。

1
SQL Server 2005からSQL Server 2012へのアップグレード
次のテスト環境をセットアップしています。 仮想マシン(Hyper-V) Windows Server 2008 R2 SP1(x64ビット) Windows SQL Server 2005 Developer Edition SP4(x64ビット)(デフォルトのインスタンス名) マージレプリケーションが設定された1つのデータベース...それぞれ2つのサブスクライバを持つ3つのパブリケーション。 SQL Server 2012 Developer Edition(sp1)へのアップグレード手順をテストしています... 64ビットSQL Server 2012開発用のisoをダウンロードしました。(sp1)MSDN(フルライセンスコピー)からアップグレードパスを開始しました。さまざまな基準のチェックを開始する最終段階の1つで、以下に概説する奇妙な問題に遭遇します。 Rule "Upgrade architecture mismatch" failed. The CPU architectures of upgrading feature(s) are different. To upgrade these features, Setup architecture must be the same as the features being …

2
ETL:200のテーブルから抽出-SSISデータフローまたはカスタムT-SQL?
私の分析に基づいて、データウェアハウスの完全な次元モデルでは、200を超えるソーステーブルから抽出する必要があります。これらのテーブルの一部は増分ロードの一部として抽出され、他のテーブルは全ロードになります。 注目に値するのは、すべて同じスキーマを持つ約225のソースデータベースです。 私が見てきたことから、OLE DBソースとOLE DB宛先を使用してSSISで単純なデータフローを構築するには、設計時に列とデータ型を決定する必要があります。つまり、最終的には抽出だけのために200以上のデータフローが発生することになります。 保守性の観点から、これは大きな問題として私を襲います。抽出コードに何らかの抜本的な変更を加える必要がある場合、200の異なるデータフローを変更する必要があります。 代替オプションとして、メタデータテーブルのセットから抽出するソースデータベース、テーブル名、および列を読み取る小さなスクリプトを作成しました。コードは複数のループで実行され、動的SQLを使用して、リンクサーバーとOPENQUERYを介してソーステーブルから抽出します。 私のテストに基づいて、これはまだOLEDBのソースと宛先でSSISデータフローを使用するほど高速ではありません。だから私は私がどんな種類の選択肢を持っているのかと思っています。これまでの考えは次のとおりです。 EZAPIを使用して、シンプルなデータフローでSSISパッケージをプログラムで生成します。抽出するテーブルと列は、前述の同じメタデータテーブルから取得されます。 サードパーティソフトウェア(動的データフローコンポーネント)を購入する これにアプローチする最良の方法は何ですか?.NETプログラミングに関しては、私は初心者なので、基本だけで立ち上がるのに必要な時間も心配です。

2
ARITHABORT ONに変更するリスク
私はベンダーとコアアプリケーションを提供する取り決めで作業しており、コアアプリケーションを変更しない限り、独自の拡張機能を構築できます。SQL Server 2005データベースに接続するColdFusionに組み込まれています。 私が作成したレポートの一部は、コアテーブルから計算された関数を使用するビューに依存しており、テーブルが大きくなるとレポートが非常に遅くなります。レポートを高速化するために、インデックス付きビューを使用します。しかし、テスト環境でインデックス付きビューを作成した後、コアアプリケーションはコアテーブルに挿入できなくなりました(インデックス付きビューを使用ARITHABORTするONときに必要なエラーメッセージが返されました)。 そのため、インデックス付きビューを使用SET ARITHABORT ONするには、コアテーブルを挿入/更新するたびにコアアプリケーションが必要になるようです。テスト環境でこれを実行しました: ALTER DATABASE MyDatabase SET ARITHABORT ON; そして、それはうまくいくようです。しかし、私のベンダーは、アプリケーションには何千ものクエリがあるため、この設定がこれらのクエリのいずれかを破壊するリスクがある可能性があり、将来の予期しないデータベースの問題がある場合、デフォルト設定を復元すると主張します。 壊れる実際のクエリはありSET ARITHABORT ONますか?保管した方が良い状況はありますOFFか? TL; DR新しいインデックス付きビューを機能さARITHABORT ONせるには、データベース全体を設定する必要がありますが、ベンダーは自分の責任でそれを行うと警告しています。実際にリスクはありますか?

1
大容量メモリ環境でのSQL Server TempDBの動作
この質問を読んで、私が少し前に持っていた質問を思い出しました。 512 GBのRAMを搭載したSQL Serverがあり、メインデータベースは450 GBです。TempDBには非常に多くのアクションがあります(わかりました、「かなり多くのアクション」だと思います-そうでないかもしれません!)。RamDisk Plus Serverのデモ版をインストールし、50GBのRAMドライブを作成し、TempDBを指定しましたが、パフォーマンスの改善はまったく見られませんでした。 TempDBへの書き込みは常にディスクへの実際の物理的な書き込みになりますか、それともWindowsファイルシステムキャッシュのような遅延書き込みのためにSQL ServerによってTempDBの書き込みがキャッシュされますか? このシナリオではラムディスクは無意味ですか? SQL Server 6.5がTempDB-In-Ramをサポートしていたことは知っていますが、それはずっと前に廃止されたようです!

1
ミラーリング-サーバーのネットワークアドレスに到達できません
SQL Server 2008 R2がインストールされています。3つのインスタンスが含まれています。 デフォルト(MSSQLServer) 最初のインスタンス 2番目のインスタンス これらはすべて、ネットワークサービスとしてログオンです。 デフォルトのインスタンスはプリンシパルサーバーです。最初のインスタンスはミラーリングです。2番目のインスタンスは監視サーバーです。 最初に、プリンシパルデータベースのフルバックアップとトランザクションログバックアップを取得しました。同じデータベース名を保持して最初のインスタンスに復元し、リカバリ状態はリカバリなしです 最後に、ミラーリングを開始しましたが、次に示す2つのエラーメッセージが表示されます。

3
1つの列でDISTINCTを選択し、他の列を返しますか?
3つのルックアップテーブルを使用して必要なすべての情報を取得するクエリがあります。私が持っている必要がありますDISTINCTが、私もそれに関連するデータの残りを必要とする、1列の値を。 私のSQLコード: SELECT acss_lookup.ID AS acss_lookupID, acss_lookup.product_lookupID AS acssproduct_lookupID, acss_lookup.region_lookupID AS acssregion_lookupID, acss_lookup.document_lookupID AS acssdocument_lookupID, product.ID AS product_ID, product.parent_productID AS productparent_product_ID, product.label AS product_label, product.displayheading AS product_displayheading, product.displayorder AS product_displayorder, product.display AS product_display, product.ignorenewupdate AS product_ignorenewupdate, product.directlink AS product_directlink, product.directlinkURL AS product_directlinkURL, product.shortdescription AS product_shortdescription, product.logo AS product_logo, product.thumbnail AS …

3
GROUP BY句を使用した場合よりも、GROUP BY句を使用した場合の方が、集計クエリが大幅に高速になるのはなぜですか?
GROUP BY句を使用しない場合よりも、句を使用した場合に集計クエリの方がはるかに高速に実行される理由を知りたいのです。 たとえば、このクエリの実行には約10秒かかります SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 これは1秒もかかりませんが SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 GROUP BY CreatedDate CreatedDateこの場合は1つしかないため、グループ化されたクエリは、グループ化されていないクエリと同じ結果を返します。 2つのクエリの実行プランが異なることに気付きました-2番目のクエリは並列処理を使用しますが、最初のクエリは使用しません。 GROUP BY句がない場合、SQLサーバーが集計クエリを異なる方法で評価するのは正常ですか?また、GROUP BY句を使用せずに最初のクエリのパフォーマンスを改善するためにできることはありますか? 編集 OPTION(querytraceon 8649)並列処理のコストオーバーヘッドを0に設定するために使用できることを学びました。これにより、クエリで並列処理が使用され、ランタイムが2秒に短縮されます。 SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 OPTION(querytraceon 8649) クエリはユーザーの選択時に値を入力することを目的としているため、実行時間を短くしたいので、グループ化されたクエリのように瞬時に実行するのが理想的です。今はクエリをラップしていますが、それが理想的なソリューションではないことはわかっています。 SELECT Min(CreatedDate) FROM ( SELECT Min(CreatedDate) as CreatedDate …

2
一時テーブルとテーブル変数のINSERTパフォーマンスの違い
SQL Server 2005には次の問題があります。いくつかの行をテーブル変数に挿入しようとすると、一時テーブルを使用した同じ挿入に比べて時間がかかります。 これは、テーブル変数に挿入するコードです DECLARE @Data TABLE(...) INSERT INTO @DATA( ... ) SELECT .. FROM ... これは、一時テーブルに挿入するコードです CREATE #Data TABLE(...) INSERT INTO #DATA( ... ) SELECT .. FROM ... DROP TABLE #Data 一時テーブルにはキーもインデックスもありません。選択部分は2つのクエリで同じであり、選択によって返される結果の数は〜10000行です。選択を単独で実行するのに必要な時間は約10秒です。 一時テーブルバージョンの実行には最大10秒かかり、5分後にテーブル変数バージョンを停止する必要がありました。 クエリは一時テーブルへのアクセスを許可しないテーブル値関数の一部であるため、テーブル変数を使用する必要があります。 テーブル変数バージョンの実行計画 一時テーブルバージョンの実行計画

4
過去12時間の1時間ごとに1つのレコードを生成する簡単な方法を知っていますか?
過去12時間のイベント数を1時間ごとにグループ化したレポートがあります。簡単に聞こえますが、私が苦労しているのは、ギャップをカバーするレコードを含める方法です。 以下にテーブルの例を示します。 Event ( EventTime datetime, EventType int ) データは次のようになります。 '2012-03-08 08:00:04', 1 '2012-03-08 09:10:00', 2 '2012-03-08 09:11:04', 2 '2012-03-08 09:10:09', 1 '2012-03-08 10:00:17', 4 '2012-03-08 11:00:04', 1 その時間中にイベントがあるかどうかに関係なく、過去12時間ごとに1つのレコードを持つ結果セットを作成する必要があります。 現在の時刻が「2012-03-08 11:00:00」であると仮定すると、レポートには次のように表示されます: Hour EventCount ---- ---------- 23 0 0 0 1 0 2 0 3 0 4 0 5 0 6 …


4
テーブルのインデックスが未使用であると判断する
無関係なインデックスを見つけるためにこのスクリプトを実行しています select o.name as TableName, i.name as IndexName, p.reserved_page_count * 8.0 / 1024 as SpaceInMB, s.* from sys.dm_db_index_usage_stats s inner join sys.objects o on s.object_id = o.object_id inner join sys.indexes i on i.index_id = s.index_id and i.object_id = o.object_id inner join sys.dm_db_partition_stats p on i.index_id = p.index_id and o.object_id = …

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