SET READ_COMMITTED_SNAPSHOT ONにかかる時間はどれくらいですか?
-
04-07-2019 - |
質問
実行にかかる時間
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
実行したばかりで、10分かかりました。
適用されているかどうかを確認するにはどうすればよいですか
解決
sys.databases
ビューを使用して、READ_COMMITTED_SNAPSHOT設定のステータスを確認できます。 is_read_committed_snapshot_on
列の値を確認します。既に質問と回答があります。
期間については、Books Onlineは、これが行われたときにデータベースへの他の接続はできないと述べていますが、シングルユーザーモードは必要ありません。そのため、他のアクティブな接続によってブロックされる可能性があります。 sp_who
(または sp_who2
)を実行して、そのデータベースに接続されている他のものを確認します。
他のヒント
これを試してください:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
OK(私は最初の質問者です)なので、この間ずっと、私はくそったれを有効にしてさえいませんでした。
究極のコードを実行してスナップショットモードを有効にします有効になっていることを確認してください。
SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb'
ALTER DATABASE shipperdb SET allow_snapshot_isolation ON
ALTER DATABASE shipperdb SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE shipperdb SET read_committed_snapshot ON
ALTER DATABASE shipperdb SET MULTI_USER
SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb'
これは、接続がアクティブな場合でも機能します(おそらく、接続が追い出されても問題ないでしょう)。
前と後の状態を確認できます。これはほぼすぐに実行されます。
重要:
上記のオプションREAD_COMMITTED_SNAPSHOTは、.NETのIsolationLevel.ReadCommittedに対応しています
上記のオプションALLOW_SNAPSHOT_ISOLATIONは、.NETのIsolationLevel.Snapshotに対応しています
.NETのヒント:
Isolationlevel.ReadCommitted
のような外観は、データベースで有効になっていない場合でもコードで許可されます。警告はスローされません。だから、私がやったように3年間続くと思う前に、自分自身に賛成して、それがオンになっていることを確認してください!!!
C#を使用している場合は、おそらく Snapshot
ではなく ReadCommitted
IsolationLevelが必要です-このトランザクションで書き込みを行っている場合を除きます。
READ COMMITTED SNAPSHOT
は、楽観的な読み取りと悲観的な書き込みを行います。対照的に、 SNAPSHOT
は楽観的読み取りと楽観的書き込みを行います。 (ここから)
bool snapshotEnabled = true;
using (var t = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
}))
{
using (var shipDB = new ShipperDBDataContext())
{
}
}
さらに、トランザクションを「プロモートできない」というエラーが表示される場合があります。 .NET Framework 2.0でのSystem.Transactionsの紹介。
外部データベース(または2番目のデータベース)への接続のような特別なことをしている場合を除き、新しいDataContextを作成するだけの簡単なことが原因です。初期化時に独自のデータコンテキストを「スピンアップ」するキャッシュがあり、これはトランザクションを完全な分散トランザクションにエスカレートしようとしていました。
解決策は簡単でした:
using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
{
using (var shipDB = new ShipperDBDataContext())
{
// initialize cache
}
}
@CodingHorrorによる Deadlocked
の記事も参照してください
このコードを試してください:
if(charindex('Microsoft SQL Server 2005',@@version) > 0)
begin
declare @sql varchar(8000)
select @sql = '
ALTER DATABASE ' + DB_NAME() + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE ;
ALTER DATABASE ' + DB_NAME() + ' SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE ' + DB_NAME() + ' SET MULTI_USER;'
Exec(@sql)
end
コマンドを試しました:
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
開発ボックスに対して、しかしそれは10分以上かかったので、私はそれを殺しました。
それからこれを見つけました:
https://willwarren.com/2015/10 / 12 / sql-server-read-committed-snapshot /
そして彼のコードブロックを使用しました(実行に約1:26かかりました):
USE master
GO
/**
* Cut off live connections
* This will roll back any open transactions after 30 seconds and
* restricts access to the DB to logins with sysadmin, dbcreator or
* db_owner roles
*/
ALTER DATABASE MyDB SET RESTRICTED_USER WITH ROLLBACK AFTER 30 SECONDS
GO
-- Enable RCSI for MyDB
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
-- Allow connections to be established once again
ALTER DATABASE MyDB SET MULTI_USER
GO
-- Check the status afterwards to make sure it worked
SELECT is_read_committed_snapshot_on
FROM sys.databases
WHERE [name] = 'MyDB '
現在のデータベースを変更する前にmasterデータベースを使用してください。
USE Master
GO
ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
DBをシングルユーザーに変更したとき、1秒もかかりませんでした
他のSQLサービスを停止して、SQLサーバーサービスのみが実行されるようにします。
鉱山は5分間走りましたが、何も起きていないことが明らかだったのでキャンセルしました。まったく新しいサーバーなので、他のユーザーは接続していません。 SQL Reporting Servicesをシャットオフし、再度実行しました。完了するまでに1秒もかかりませんでした。