日々学習〜人の役に立てるITエンジニアを目指して〜

ITエンジニアが日々学んだ事を書き記します

SQLServer

インデックスの再構築と再構成

インデックスを追加するときに断片化が大きいとインデックスの再構築、再構成で断片化を減らせる。 再構成と再構築の違いは大きいところだと、 再構築がひとつのトランザクションでインデックスを完全に再作成するのに対して、再構成は処理単位ごと (処理単…

データベースの圧縮バックアップ

お客様のテスト環境のデータベースサーバーの容量が少なくなってきたので、データベースのバックアップファイルが保存できなくなってしまった。 SQLServerではデータベースをバックアップする際、圧縮してバックアップをとれる。 圧縮することによって60GBあ…

SQLServerのプロファイラの値

SQLServerのバージョンアップの検証で、プロファイラの値をバージョンアップ前と後で比較を行った。 DURATIONという処理時間の値がバージョンアップ後の方が大きくなった。 サーバーのスペックは上がっているのだが… 原因分からずなので引き続き調査が必要。

テーブルの変更ができない

テーブルの定義を変更しようとすると警告メッセージが表示され、変更が保存出来ない現象があった。 調べてみると、SQLServerのオプションの設定で変えられることが分かった。 2012より前のバージョンではそんなことなかったと思うのだが。 参考URL https://s…

SQLServerで発行されたクエリをログに出力

原因不明の更新処理が行われていたため、 調査が必要になった。 そこで発行したクエリをログに出力できないかを調べたところ、 トレースフラグの設定で出力できることが分かった。 デフォルトではログには出力されないので、設定することが必要。 参考URL SQ…

print文でSQL文が長すぎて切れた時の対応

ストアド内にprint文で長いSQL文を出力した場合に切れてしまう現象がある。8000バイトを超えると切れるそう。https://msdn.microsoft.com/ja-jp/library/ms176047(v=sql.120).aspx4000文字ごとに分割してselect文で表示させるようにした。select '@strSQL_SU…

テーブルの作成日を見る

データベースのテーブルの作成日を見たい場合はショートカットキーのF7で 一覧が表示される。 SQLServer2005まではデフォルトで表示されていた記憶があるが、 SQLServer2008以降だと表示されていないため調べた。

データベースの分離レベルを調べる

システムのレスポンスが急激に遅くなる現象があり、 トランザクションの分離レベルが影響しているのではないかと思い調べた。 調べる方法は クエリでDBCC USEROPTIONを実行 実行結果の「iso level」に分離レベルの規定値が出力される 規定値は「read committ…

テーブルのフィールド名を変更する

テーブルのフィールド名を変更する際はsp_renameを使用すると便利 sp_rename 'TableA.FieldA', 'FieldB', 'COLUMN'

インデックスの作成

約1000万レコードのテーブルに対してselectしている処理で、タイムアウトが発生するため、インデックスを作成した。 作成する際はSQLの条件に使用しているフィールドをインデックスの対象にする。 3分以上かかっていた処理が10秒程度に改善された。 処理が…

SQLServer2000のバックアップファイルをSQLServer2014に復元する方法

システムのバージョンアップで SQLServer2000のバックアップファイルをSQLServer2014に復元する必要があったので、その手順。 直接SQLServer2014に復元はできないのでSQLServer2008に復元する。 復元後、復元したデータベースのプロパティ→オプション→互換性…

デッドロックのログの調査方法

トレース フラグ 1204(DBCC TRACEON (1204,-1))を有効にするとデッドロックが発生した場合にログが吐き出されるようになるが、それを解析するとなるとなかなか難しい。 こちらを参考にした。 http://msdn.microsoft.com/ja-jp/library/aa937573(SQL.80).aspx…

デッドロック時にエラーを出力する方法

原因不明のデッドロックが発生するため、原因を探るための情報としてデッドロック時にログを吐き出す方法を調べた。 以下のコマンドを実行するとデッドロック時に ログが吐き出されるようになる。 DBCC TRACEON(1204, -1) エラーログは以下の場所に吐き出さ…

テーブルのキーの追加方法

キーの重複エラーが発生し、キーの追加を行った (本来は重複が発生しないように設計するべきだったが、考慮が足りず・・・) キーの追加をする際は、既存のキーを削除してから行う[注意点]キーを設定するフィールドのNull許可をしない設定を行う →これをやら…

テーブルの断片化を調べる方法

テーブルの更新時に想定しない更新が行われたため、 テーブルの断片化が原因ではないかと思い、調査方法を調べた。 テーブルの断片化を調べる方法 use (データベース名)SELECT DB_NAME(s.database_id), OBJECT_NAME(s.object_id), s.index_type_desc, i.name…

システム日付を取得する(YYYYMMDD形式)

SQLServerでシステム日付を取得するにはGetDate()を使用する それだけだとフォーマットが"2014-06-18 19:13:23.177"となるため、 YYYYMMDD形式に変換させる CONVERT(VARCHAR,GetDate(),112) HHMMSS形式に変換させる (':'が付くのでreplaceで除く) SELECT rep…

Bulk Insertで列をスキップさせる

Bulk InsertでCSVを取込む処理で CSVの列が追加されたが、取込は行わないようにする 対応を行った。 参考にしたURL http://www.ilovex.co.jp/blog/system/softwaredevelopment/post-24.html

インデックスについて

稼動しているシステムのあるテーブルのデータ量が多くなり、 データ取得に時間がかかっていたので、 インデックスを追加して改善を行いました。 分かりやすいページだったのでメモしておきます。 http://www.atmarkit.co.jp/ait/articles/0501/18/news097.ht…

テーブルの行を編集する設定

SQLServerのオブジェクトエクスプローラからテーブルを開く際、"上位○○○行の編集"となっていて、全ての行を編集する事が出来ない。 初期設定がそのようになっているため、変更したい場合は ツール→オプション→SQLServerオブジェクトエクスプローラの 上位<n…

プロファイラで負荷がかかっているストアドを調査する

データ抽出処理で異常に時間がかかるときなどは、 プロファイラで確認すると原因がさぐれる。 プロファイラ上のCPU,Reads,Writes,Durationの各項目の 数値が高い場合は、そのストアドに原因があるかもしれない。 参考URL Microsoft TechNet ライブラリより h…

インデックスの再構築

大量のデータの削除、追加を繰り返し行うと、データの断片化が起きる。 稼動中のシステムでデータ読み込み時に予期せぬエラーが発生したが、 断片化が理由だった。 インデックスの再構築を行うことで解決できた。 オブジェクトエクスプローラでテーブル→イン…

クエリの結果をエクセルに貼りつけるときに列ヘッダーも貼りつける

クエリの結果を選択し、右クリックでヘッダーつきでコピーをすれば行えるが、設定することで自動でヘッダーが貼り付くようになる。 ツール→オプション→クエリ結果→SQLServer→結果をグリッドに表示→結果のコピーまたは保存時に列ヘッダーを含めるのチェックボ…

ストアド内でprintを使用するときの注意点

ストアド内でprint文で変数の値を出力させたいとき、 変数の中身のバイト数によっては切り詰められてしまいます。 以下マイクロソフトMSDNより引用 (http://msdn.microsoft.com/ja-jp/library/ms176047.aspx) メッセージ文字列は、Unicode 以外の文字列の場…

キー項目の再設定

--追加するキー項目のNULLを不許可にする ALTER TABLE [dbo].[TableA] ALTER COLUMN [FieldA] [varchar] (8) NOT NULL Go --キーを一旦クリアする ALTER TABLE [dbo].[ TableA ] DROP CONSTRAINT [PK_ TableA _1] Go --キー項目を再作成する ALTER TABLE [db…

テーブルの列を削除する

ALTER TABLE テーブル名 DROP DF_TABLE_DEFAULT →デフォルト値設定 ALTER TABLE テーブル名 DROP COLUMN フィールド名 ※列を削除する際、デフォルト値の設定がされている時はその設定を削除しないと列を削除できない

列の属性を変更する

ALTER TABLE 表名 ALTER COLUMN 列名 列定義 例)ALTER TABLE T_02_1 ALTER COLUMN POST_CODE CHAR(7)

オートナンバーを初期化する方法

DBCC CHECKIDENT (テーブル名, RESEED, 0) ※他の方法として・・・Truncate Tableを行えばオートナンバーは初期化される

キャッシュクリア

データ読み込みのレスポンステストなどで 一度読み込むとキャッシュに残るので 正確なレスポンスが測れない。 その時はキャッシュのクリアを行う。 [記述方法] DBCC DROPCLEANBUFFERS

ログファイルの削除と圧縮

データベースの容量が大きくなった場合に、 ログファイルの削除と圧縮を行うと容量を減らせる。 本番環境ではログファイルを使用する事もあり、 削除などは簡単には行えないので、 テスト環境の場合に行う。 backup log DB名 with no_log dbcc shrinkfile(XX…

SQLServer2005をインストールした際の注意点

SQLServer2005をインストールしたが、 いろいろと上手くいかなかったので 注意点をまとめました。 ・クライアントのインストール時は「このコンピュータに全てインストールを選択す る」を行う。行わないとManegementStudioがインストールされない ・Window…