非クラスタ化されていないインデックスを追加すると、テーブルをロックしますか? -- sql フィールド と sql-server フィールド と sql-server-2008-r2 フィールド と indexing フィールド 関連 問題

Will adding a nonclustered index lock my table?












16
vote

問題

日本語

私は~200万レコードを含むテーブルを持っています、そして私はクエリのパフォーマンスを向上させるために新しい非クラスタ化されたインデックスをUniqueIdentifierに追加する必要があります。

は、それが適用されている間にテーブルをロックするか、そうでなければパフォーマンスを著しく低下させることができますか?

索引付けの恩恵/落とし穴については、そこにはたくさんの情報がありますが、の間にが登場するものを見つけることはできません。

私はSQL Server 2008 R2を実行しています(それが重要な場合はWindows Server 2008では)

編集:それはEnterprise Edition

です。
英語

I have a table with ~2 million records in and I need to add a new nonclustered index to a uniqueidentifier to improve query performance.

Will adding a nonclustered index lock the table or otherwise degrade performance significantly while it's being applied?

There's lots of information out there about the benefits/pitfalls of indexing, but I can't find anything that tells me that happens during an indexing operation

I'm running SQL Server 2008 R2 (on Windows Server 2008 if that's important)

EDIT: It's the Enterprise Edition

</div
           
     
     

回答リスト

16
 
vote
vote
ベストアンサー
 

Enterprise Editionでは、オンラインインデックス操作を行う機能を得ることができます。それはこのようなものに見えます:

<事前> <コード> create index MyIDX on MyTable (MyColumn) with (online = on)

プロセス中に(最初と最後のIIRC)の間に操作は一部のロックを取りますが、インデックス作成の期間中にテーブルをロックしません。心配している場合は、実稼働環境で拡張イベントセッションを開始し、どのロックを作成しているか、およびインデックスを作成している間に存在する期間を追跡します。

Update: Documentation はどのロックに関するかなり良い博覧会を持っていますオンラインおよびオフライン操作の両方の場合は開催されます。

 

In Enterprise Edition, you gain the ability to do online index operations. It looks something like this:

create index MyIDX on MyTable (MyColumn) with (online = on) 

Note that the operation does still take some locks during the process (at the beginning and end, IIRC), but doesn't lock the table for the duration of the index creation. If you're concerned, fire up an extended events session in a non-production environment and trace what locks are created and how long they exist for while creating your index.

Update: The documentation has a pretty good exposition about what locks are held when for both online and offline operations.

</div
 
 
27
 
vote

ランニング "高価な版"(企業)には、答えは次のとおりです。

非クラスタ化されていないインデックスを作成するオフラインインデックス操作 テーブルの上の共有(S)ロック。これにより更新を防ぎます 基礎となるテーブルが選択などの読み取り操作を許可します。 ステートメント

基本的には、インデックスが構築されている間にターゲットテーブル「読み取り専用」をレンダリングします。これはあなたのオーバーレイアプリケーションにとって問題にならないかもしれません - あなたのDevチームとユーザーとのチェック!

PS:に適用を適用するかどうか、またはそのようなインデックスが完全に異なる会話であるかの質問です。 SQLコミュニティとそのプロのブロガー&AMPの軍団。中小企業はあなたの友達です。

 

For those of us not running "Expensive Edition" (Enterprise), the answer is thus:

An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. This prevents updates to the underlying table but allows read operations, such as SELECT statements.

So basically it renders the target table "read only" while the index is built. This may or may not be a problem for your overlaying applications -- check with your dev teams and users!

PS: The question of whether or not, or why, to apply such an index, is an entirely different conversation. The SQL community and its legion of professional bloggers & SMEs are your friends.

</div
 
 
0
 
vote

は(多くのものに)(多くのことに)依存しています。index ill intersの範囲を追加し、insertsを縮小して劣化します。 ユニークな識別子は基本的にサイズ固定ランダムフレーズであり、IITの索引が断片化されていることが早くなる可能性があります。

挿入の場合はILITを行レベルで排他的なロックを取得します(その行が「ビルド」で、ページレベルまたはテーブルレベルでのソフトロック以来、それについては100%確実ではないので、ドキュメントを試してください。あなたはアイデアを手に入れました。

ソフトロックは、分離レベル(および選択に適用されたヒント)によっては問題ではありません。 非常に範囲の絶縁レベルを使用する場合(その文字を称えるようなロック)

を使用する場合は問題になる可能性があります。

とにかく私はあなたが本を打つこと、そしていくつかの酸性テストをすることを提案します。それは非常に複雑なトピックで、あなたの特定のシナリオではたくさん依存します。

 

Depends (on a lot of things) as a rule of thumb adding the index ill improve selects and degrade inserts. A uniqueidentifier is basically a size fixed random phrase and thanks to it that indexes ill can get fragmented fast.

For inserts it ill get a exclusive lock at row level (that's ok since that row is being "build") and soft locks at page level or table level (i'm not 100% sure about it, try the documentation but you got the idea).

That soft locks are not a issue depending on your isolation level (and hints applied to the selects). It can be a issue if you use a very restritive isolation level (that locks ill be honored to the letter)

Anyway I suggest you to hit the books and do some acid tests. Its a very complex topic and depends a lot on your particular scenario.

</div
 
 

関連する質問

2520  データベースのインデックス作成はどのように機能しますか? [閉まっている]  ( How does database indexing work ) 
閉鎖。この質問はもっと焦点を絞ったにする必要があります。現在答えを受け付けていません。 この質問を改善したいですか?このPOST...

0  PHPで大規模なデータを、すべての数値、10億のバイトを検索  ( Searching large data all numeric 1 billion bytes in php ) 
私は、私はすぐにデータの10億バイトまでのデータ列を検索することができるか疑問に思いました。データはすべての数値です。それが何かを見つけるまで現在、我々は、250Kのファイルと、各ファイルにstrpos(最速のビルトイン機能を)使用した検索にデータ分割を持って...

11  ID!= IDの予期せぬテーブルスキャン  ( Unexpected table scan for id id ) 
1つのアプリケーションにより、SQL Server 2005データベースに大きな負荷がかかります。 このクエリを実行するアプリケーションを制御しません。 <事前> <コード> select id,col1,col2,col3 from table where...

1  Sphinxが無限の記録を索引付けすることを考える  ( Thinking sphinx indexing non expired records ) 
今日の日付がレコードの「expires_at」フィールド以下であるSphinxのみの索引記録のみを考えるのに最良のアプローチは何でしょうか? 事前にありがとうございました。 ...

26  SQL全文索引付けが#を含む単語の結果を返すのはなぜですか?  ( Why doesnt sql full text indexing return results for words containing ) 
例えば、SQL Server 2005を使用して、次のようなマイクエリは次のようなものです。 <事前> <コード> SELECT * FROM Table WHERE FREETEXT(SearchField, 'c#') 使用時に結果を返す列Searc...

22  合計列をインデックス  ( Index a sum column ) 
合計されている列のインデックスを作成しているのは、インデックスがないより速いですか? ...

4  インデックスとテーブルの統計が古くなっているかどうかを調べる  ( Find out if index and table statistics are out of date ) 
フルスキャン毎週のインデックスを更新します。だから私が走るとき: <事前> <コード> SELECT name AS index_name, STATS_DATE(OBJECT_ID, index_id) AS StatsUpdated FROM sys.in...

2  MySQLデータベースの吊り下げに関する単純なSELECTステートメント  ( Simple select statement on mysql database hanging ) 
私は非常に大きいテーブルに非常に単純なSQL SELECT文を持っています。 (私のデザインではありません、私は同時に再設計の所有者を納得させようとしている間最適化しようとしています) 基本的には、このステートメントは次のようなものです。 <事前> <コード>...

12  このクエリにインデックスが使用されないのはなぜですか?  ( Why isnt index used for this query ) 
私はそれがあることがあると思ったときにインデックスが使用されなかったクエリを持っていたので、私は好奇心からそれを再現しました: test_table を1.000.000行で作成します(<コード> col の10個の異なる値、<コード> COUNT2 )。...

66  データベース列を索引付けする方法  ( How do i index a database column ) 
うまくいけば、私はデータベースサーバーごとに回答を受けることができます。 索引付けの仕組みの概要については、データベースの索引付けがどのように機能しますか? ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有