データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

3
SQL Serverクエリがメモリで実行されているかディスクに移動しているかを判断する方法はありますか?
今日、アプリケーションで一連のストアドプロシージャに出くわしました。これらは、長時間実行されるプロセス内で繰り返し呼び出されます。各プロシージャ内で、複数の異なるselectステートメントを見つけました。一部はループ内です。当然のことながら、現在使用されているこれらのルーチンの実行には数分かかりますが、直観では数秒で完了すると予想されます。 これらの手順が書かれたとき、パフォーマンスが考慮されなかったことはかなり明白であるように見えます。「良いアイデアではない」もののインスタンスが複数あります。 データのインポート時の各行の処理には1行あたり300ミリ秒かかるため、比較的小さなインポートの処理には数分かかります。 ただし、手順に含まれるテーブルの大部分は非常に小さいものです。これらのテーブルのすべてがメモリに完全に常駐している場合、おそらくこのいずれかを書き換えても得られるものはそれほど多くないと考えています。 私は決定しようとしている....この明らかに非効率的なコードのために、それはどれほどの本当の影響を与えているのか?修正する価値はありますか? 質問は次のとおり です。-完全にメモリに固定されているテーブルを特定する方法はありますか? -ネストされたストアドプロシージャを監視して特に高価な部分を見つけるために、トレースをオンにする方法はありますか? 注:これはSQL Server 2008 R2にあります

4
SQL Serverエージェントを使用して、データベース以外のタスクもスケジュールしています-これは悪い考えですか?
私はDBA(および多くの場合、事実上のsysadmin)であるため、SQL Serverは、定期的に作業する必要があるほとんどすべてのサーバーにインストールされます。最近、ネイティブWindowsタスクスケジューラではなく、ほとんどすべての場合にジョブスケジューラとしてSQLエージェントを使用していることに気付きました。 私の観点から見ると、SQLエージェントには、ネイティブのWindowsタスクスケジューラーよりも多くの利点があります。 リモート(私のワークステーションから)タスクの開始/停止/監視 共有スケジュール(各タスク自体ではなく) 複数のステップと制御フロー さまざまな種類のタスク 失敗/完了のアラート 異なるユーザーとして動作するように構成できます (中程度)エラーコードではなく、説明的なエラーメッセージ しかし、これは悪い習慣であるという感覚から逃れることはできません-SQLエージェントはデータベース関連のタスクのためだけに予約する必要があり、その使いやすさを嫌いながらも、WindowsレベルのタスクスケジューラでOSレベルのタスクを実行したままにする必要があります。 この方法でSQLエージェントに依存しても大丈夫ですか?そうでない場合、探している機能の一部を取得するために、サードパーティのWindowsタスクスケジューラを検討する必要がありますか?

5
SQL ServerのROW_NUMBERでページングは​​どのように機能しますか?
Employee100万件のレコードを持つテーブルがあります。Webアプリケーションでデータをページングするための次のSQLがあります。正常に動作しています。しかし、私が問題と思うのは、派生テーブルtblEmployeeがEmployeeテーブル内のすべてのレコードを選択することMyRowNumberです(値を作成するため )。 これにより、Employeeテーブル内のすべてのレコードが選択されると思います。 それは本当にうまくいくのでしょうか?または、SQL Serverは元のEmployeeテーブルから5つのレコードのみを選択するように最適化されていますか? DECLARE @Index INT; DECLARE @PageSize INT; SET @Index = 3; SET @PageSize = 5; SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,* FROM Employee) tblEmployee WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize

1
SQL Server 2008は実行計画の作成日を保存しますか?
最近、使用するアプリケーションをアップグレードしました。これには、データベースのスキーマの変更が含まれていました。これらの変更により、キャッシュされた実行計画が強制的に破棄される可能性がありました。SQL Serverが多数の新しいプランを作成することを余儀なくされた場合、これによりユーザーエクスペリエンスが低下する可能性がありました。これが事実かどうかを知りたい。 それで、私の質問は、SQL Server 2008はキャッシュされた実行プランの作成日を保存するのですか?管理ビューにsys.dm_exec_cached_plansは日付フィールドがないため、そうではないと思われます。

4
Postgres 9.2にアップグレードするときに古いポストマスターをシャットダウンできません
Postgres 9.2.2(9.1.4から)にアップグレードしています。次を使用してDBをアップグレードしようとすると: pg_upgrade -b /usr/local/Cellar/postgresql/9.1.4/bin -B /usr/local/Cellar/postgresql/9.2.2/bin -d /usr/local/var/postgres91 -D /usr/local/var/postgres 次のエラーメッセージが表示されます。 Performing Consistency Checks ----------------------------- Checking current, bin, and data directories ok There seems to be a postmaster servicing the old cluster. Please shutdown that postmaster and try again. Failure, exiting サーバーを停止しようとしていますが、アップグレードコマンドが機能しません。古いポストマスターをシャットダウンする方法は?

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
「log_queries_not_using_indexes」を有効にすると「long_query_time」が無効になりますか?
Mysqlでlog_queries_not_using_indexes、slow_query_logおよびを有効にするとlong_query_time、クエリ時間が5秒よりはるかに短い場合でも、生成されたスロークエリログファイルに多くのクエリが含まれることに気付きましたlong_query_time。 一度と思われlog_queries_not_using_indexes有効になっている、MySQLは関係なく「long_query_time」は何であるか、インデックスを使用していないではないすべてのクエリをログに記録します。 これを克服する方法はありますか?つまり、long_query_timeインデックスを使用しているかどうかに関係なく、時間がかかるすべてのクエリを記録する方法はありますか?


1
SQL Server Profilerでトレース中に、プロシージャ呼び出しで着信パラメーター値を記録することは可能ですか?
SQL Server Profiler(私はSQL Server 2012を使用しています)を使用して、変数名を持つSQLだけでなく、パラメーター値を示す便利なトレースを生成しようとしています。ストアドプロシージャは、大量のインベントリデータを調べて非常に価値のある結果を生成します。既存の動作を文書化しようとしているので、ユニットテスト、正確な定義、およびリファクタリングを行って、適切なものにリファクタリングできます。 ストアドプロシージャがカーソルを作成し、whileループを実行するループ内で、54パラメーターサブプロシージャの実行を実行するストアドプロシージャがあります。これは簡略化されたビューです。 CREATE PROCEDURE [dbo].[OuterProcedure] ( @ProductCode varchar(8), -- 41 more parameters omitted ) AS SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SET NOCOUNT ON DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations. -- OMIT ABOUT 10 temporary table declarations. DECLARE aCursor CURSOR FAST_FORWARD FOR SELECT …

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に流出します。実行中にシステムが十分なワークスペースメモリを使用できる場合でも、実行中にクエリが許可されたワークスペースメモリを超えると、ディスクにスピルする必要があります。私の理解は正しいですか?

2
新しいまたは異なるテーブルスペースへのスキーマのインポート
データの作成元とは異なる単一の新しいテーブルスペースまたは異なるテーブルスペースを使用して、スキーマをOracle 11gR2にインポートする便利な方法はありますか? 例として、OLDDBからBLOG_DATAをエクスポートしました。すべてのユーザーデータはUSERSテーブルスペースに保存されています。 NEWDBで、BLOG_DATAスキーマをインポートしますが、このユーザー専用に作成されたBLOG_DATAテーブルスペースにユーザーオブジェクトを保存します。 BLOG_DATAユーザーを作成し、BLOG_DATAテーブルスペースを作成し、そのユーザーのデフォルトのテーブルスペースとして設定し、適切な無制限のクォータを追加しました。 CREATE TABLESPACE blog_data DATAFILE SIZE 1G; CREATE USER blog_data IDENTIFIED BY secretpassword DEFAULT TABLESPACE blog_data QUOTA UNLIMITED ON blog_data; GRANT connect,resource TO blog_data スキーマは次のようなものでOLDDBからエクスポートされました exp blog_data/secretpassword@OLDDB file=blog_data.dmp 以下のフィルの優れた答えを読んだ後、私は不思議に思いました: データにはデフォルトの表領域(ユーザーがクォータを持っている唯一の表領域)以外に移動する場所がないため、これによりimpはすべてのユーザーオブジェクトをそのデフォルトの表領域に配置するように強制されますか? imp blog_data/secretpassword@NEWDB file=blog_data.dmp これにより、newdbのblog_dataテーブルスペースにblog_dataスキーマ全体が配置されますか?これが機能しない理由や、特定のオブジェクトなどで問題が発生する理由はありますか? 更新: 簡単なテストを行ったところ、これが事実であることがわかりました。Impオブジェクトを元のテーブルスペースに配置できない場合(テーブルスペースが存在しないなど)、そのユーザーのデフォルトのテーブルスペースにオブジェクトを配置します。詳細な説明:http : //www.dolicapax.org/?p=57 それでも、Philが示唆しているようにData Pumpを使用することは、好ましい選択肢であると思われます。

2
OracleからSQL Serverにデータを移動する最も簡単な方法は何ですか?
当社の製品の1つは、データベースバックエンドとしてOracleとSQL Serverの両方をサポートしています。OracleバックエンドからMicrosoft SQL Serverに切り替えることを希望するお客様がいますが、これは私たちにとって典型的な移行ではありません。 すべてのデータをOracleスキーマ全体からSQL Serverデータベースに取得する最も簡単な方法は何ですか? スキーマにはプレーンな古いテーブルのみが含まれ、空想的なものは何もありません。手作業で移行しても問題ないストアドプロシージャが1つまたは2つある場合があります。 OracleのSQLDeveloperを使用してテーブルデータをCREATEand INSERTステートメントとしてエクスポートできますが、これらはSQL Serverで使用される構文と一致せず、構文エラーを手動で修正する必要がありません。

2
MS SQL Serverの暗号化とバックアップについて
そこで、 SQL Serverバックアップファイルの安全性についてチャットで質問しました。 攻撃者が暗号化されていない.bakファイルにアクセスできる場合、データにアクセスできると言われます。 このシナリオを見てみましょう: OPEN SYMMETRIC KEY MySymetricKey DECRYPTION BY CERTIFICATE MyCertificate 注意-ここにはパスワードはありません。 次に、テーブルを暗号化します: UPDATE tbl1 SET namePAss = ENCRYPTBYKEY(KEY_GUID('MySymetricKey'),name) GO ハッカーが私のbakファイルを手に入れたとしましょう。(自分のコンピューターとSQLサーバーで)データを表示するために彼がしなければならないことは: SELECT convert( NVARCHAR(max), decryptbykey(namePAss)) FROM tbl1 彼はまだデータにアクセスできますか?

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
デザインパターン-多くの親テーブルの1つ
特定のテーブルが多数の異なる親テーブルの1つにFKできるデータベースの状況に頻繁に出くわします。この問題に対する2つの解決策を見てきましたが、どちらも個人的に満足できるものではありません。私はあなたがそこに見た他のどのようなパターンに興味がありますか?それを行うためのより良い方法はありますか? 不自然な例 システムが持っているとしましょうAlerts。アラートは、顧客、ニュース、製品などのさまざまなオブジェクトに対して受信できます。特定のアラートは、1つだけのアイテムに対応できます。何らかの理由で、顧客、記事、製品は動きが速い(ローカライズされている)ため、アラートの作成時に必要なテキスト/データをアラートに取り込むことはできません。このセットアップを考えると、2つのソリューションを見てきました。 注:以下のDDLはSQL Server用ですが、私の質問はどのDBMSにも当てはまります。 解決策1-複数のNullable FKey このソリューションでは、1対多のテーブルにリンクするテーブルに複数のFK列があります(簡潔にするため、以下のDDLにはFKの作成は示されていません)。 良い -このソリューションでは、外部キーを持っていると便利です。FKのヌル最適性により、この便利で正確なデータを比較的簡単に追加できます。BADクエリは、関連付けられたデータを取得するためにN LEFT JOINSまたはN UNIONステートメントを必要とするため、優れていません。SQL Serverでは、特にLEFT JOINSにより、インデックス付きビューの作成ができなくなります。 CREATE TABLE Product ( ProductID int identity(1,1) not null, CreateUTC datetime2(7) not null, Name varchar(100) not null CONSTRAINT PK_Product Primary Key CLUSTERED (ProductID) ) CREATE TABLE Customer ( CustomerID int identity(1,1) not null, CreateUTC datetime2(7) …

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