タグ付けされた質問 「index」

ディスクスペースを犠牲にしてクエリの速度を向上させ、挿入/更新を遅くすることができるデータベース構造。ソートされた1つ以上の列のコピーを格納しますが、データを異なる方法で構造化して、より高速なアクセスを可能にします。

2
既存のインデックスに新しいインデックスのすべての列が含まれているのに、なぜこの新しいインデックスを作成するとパフォーマンスが大幅に向上したのですか?
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 LogテーブルとLogItemテーブルがあります。私は両方からいくつかのデータを取得するクエリを書いています。数千がLogsあり、それぞれLogが最大125まで持つことができますLogItems 問題のクエリは複雑なのでスキップしています(誰かが重要だと思うなら、おそらく投稿できるでしょう)が、SSMS推定クエリプランを実行すると、新しい非クラスタ化インデックスによってパフォーマンスが最大100%向上することがわかりました。 Existing Index: Non-clustered Key Colums (LogItem): ParentLogID, DateModified, Name, DatabaseModified Query Plan Recommendation CREATE NONCLUSTERED INDEX [LogReportIndex] ON [dbo].[LogItem] ([ParentLogID],[DatabaseModified]) 楽しみのために、この新しいインデックスを作成してクエリを実行しましたが、驚いたことに、クエリが実行されるまでに10秒以上かかるのに1秒かかりました。 既存のインデックスがこの新しいクエリをカバーすると想定したので、私のクエリは、新しいクエリで使用される列のみに新しいインデックスを作成するとパフォーマンスが向上するのはなぜですか?where句で使用される列の一意の組み合わせごとにインデックスを作成する必要がありますか? 注:これは、SQL Serverが結果をキャッシュしているためだとは思いません。インデックスを作成する前に約25〜30回クエリを実行しました。以下。
19 sql-server  index 

2
1つの列に特定の値がある場合にのみ適用されるカスタムの一意の列制約
次のようにカスタムの一意の列制約を持つことは可能ですか?2つのcol subsetとtype、両方の文字列があると仮定します(データ型はおそらく重要ではありませんが)。 Ifはtype「真」である、私はの組み合わせをしたいtypeとsubset一意です。それ以外の場合、制約はありません。DebianでPostgreSQL 8.4を使用しています。


6
ALTER INDEX ALL REBUILDは、各インデックスを個別に再構築するよりも単純な復旧モデルでより多くのトランザクションログ領域を使用しますか?
トランザクションログの領域が不足したため、SQL Server 2012での「ALTER INDEX ALL REBUILD」操作は失敗しました。インデックスは再編成または再構築されたことがないため、ほぼすべてのインデックスで断片化が80%を超えています。 DBは単純な復旧モデルを使用します。「ALL」形式のコマンドによって実行される各インデックス操作に続いて、次のインデックス再構築の前にトランザクションログデータがフラッシュされると想定しました。それは実際にどのように機能するのですか、またはインデックスの再構築は単一のトランザクションの一部であるかのように記録されますか? 言い換えると、各再構築を個別に実行するスクリプトを記述することにより、トランザクションログの増加を減らすことができますか?考慮すべき他の要因はありますか?
18 sql-server  index 

4
メモリ最適化テーブル-メンテナンスが本当に難しいのでしょうか?
私は、MS SQL 2012から2014へのアップグレードの利点を調査しています。SQL2014の大きなセールスポイントの1つは、クエリを超高速にするメモリ最適化テーブルです。 メモリ最適化テーブルには、次のようないくつかの制限があることがわかりました。 いいえ(max)サイズのフィールドありません 行ごとに最大1 KB timestampフィールドなし 計算列はありません UNIQUE制約なし これらはすべて迷惑と見なされますが、パフォーマンス上のメリットを得るために本当に回避したい場合は、計画を立てることができます。 実際のキッカーは、ALTER TABLEステートメントを実行できないという事実であり、インデックスのリストにフィールドを追加するたびに、このリマロールを実行する必要がINCLUDEあります。さらに、ライブDBのMOテーブルにスキーマを変更するには、ユーザーをシステムから締め出す必要があるようです。 マイクロソフトがこの機能にこれほど多くの開発資金を投資したとは信じられないほど、これはまったくとんでもないことであり、維持するのは非常に実用的ではありません。これは、私がスティックの間違った終わりを得たに違いないという結論に私を導きます。メモリを最適化したテーブルについて誤解していたため、実際よりも保守がはるかに困難であると思われました。 それで、私は何を誤解しましたか?MOテーブルを使用しましたか?それらを使用および保守するのに実用的な何らかの種類の秘密のスイッチまたはプロセスがありますか?

1
テキスト列でtext_pattern_opsにインデックスを付けるのはなぜですか?
今日、Seven WeeksのSeven Databasesでは、オペレーターごとのインデックスを紹介しました。 text_pattern_ops値が小文字でイ​​ンデックス付けされている限り、演算子クラスインデックスを作成することにより、以前のクエリに一致するパターンの文字列にインデックスを付けることができます。 CREATE INDEX moves_title_pattern ON movies ( (lower(title) text_pattern_ops); text_pattern_opsタイトルがテキストタイプであるため、これを使用しました。あなたは、インデックスのvarchar、文字、または名前に必要な場合は、関連するオペレーションを使用しますvarchar_pattern_ops、bpchar_pattern_opsとname_pattern_ops。 この例は本当に紛らわしいと思います。なぜこれが便利なのですか? 列がテキストタイプの場合、他のタイプ(varchar、char、name)は検索値として使用される前にテキストにキャストされませんか? そのインデックスは、デフォルト演算子を使用したインデックスとどのように動作しますか? CREATE INDEX moves_title_pattern ON movies (lower(title));

2
リーフページと非リーフページの違いは何ですか?
私はいくつかのインデックス使用レポートを実行していますが、LeafとNon-leafの定義を取得しようとしています。リーフと非リーフの両方の挿入、更新、削除、ページ結合、ページ割り当てがあるようです。私は本当にそれが何を意味するのか、または一方が他方よりも優れているかどうかを知りません。 誰かがそれぞれの簡単な定義を提供し、リーフまたは非リーフが重要である理由を説明できれば、それはありがたいです!

2
変更されていない列も含めて、すべての列を更新するオーバーヘッドはどれくらいですか[クローズ]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 2年前に閉店しました。 行の更新に関して、多くのORMツールは、特定のエンティティに関連付けられているすべての列を設定するUPDATEステートメントを発行します。 利点は、UPDATEどのエンティティ属性を変更しても同じステートメントであるため、更新ステートメントを簡単にバッチ処理できることです。さらに、サーバー側とクライアント側のステートメントキャッシングも使用できます。 したがって、エンティティをロードし、単一のプロパティのみを設定した場合: Post post = entityManager.find(Post.class, 1L); post.setScore(12); すべての列が変更されます: UPDATE post SET score = 12, title = 'High-Performance Java Persistence' WHERE id = 1 ここで、titleプロパティにもインデックスがあると仮定すると、DBは値がとにかく変わっていないことに気付かないでしょうか? で、この記事で、マルクスWinandは言います: すべての列の更新は、前のセクションで既に確認した同じパターンを示しています。応答時間は、インデックスが追加されるたびに増加します。 データベースは関連するデータページをディスクからメモリにロードし、列の値を変更する必要があるかどうかを判断できるため、なぜこのオーバーヘッドがあるのだろうかと思います。 インデックスの場合でも、変更されていない列のインデックス値は変わらないが、UPDATEに含まれているため、何も再分散しません。 データベースがリーフ値が同じであることを認識するためだけに、冗長で変更されていない列に関連付けられたB +ツリーインデックスもナビゲートする必要があるのでしょうか? もちろん、いくつかのORMツールでは、変更されたプロパティのみを更新できます。 UPDATE post SET score = 12, WHERE id = 1 しかし、このタイプのUPDATEは、さまざまな行のさまざまなプロパティが変更されたときに、バッチ更新またはステートメントキャッシュの恩恵を常に受け​​られるとは限りません。

1
ページ数が1000未満のインデックスを再構築しませんか?
Ola Hallengrensスクリプトを使用して、インデックスをメンテナンスします。その前に、次のクエリを使用して、どのインデックスが最も断片化されているかを確認しました。 SELECT dbschemas.[name] as 'Schema', dbtables.[name] as 'Table', dbindexes.[name] as 'Index', indexstats.avg_fragmentation_in_percent, indexstats.page_count FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id …

5
計算列にフィルター選択されたインデックスを作成できません
私の前の質問で、テーブルに新しい計算列を追加するときにロックエスカレーションを無効にすることは良い考えですか?、計算列を作成しています: ALTER TABLE dbo.tblBGiftVoucherItem ADD isUsGift AS CAST ( ISNULL( CASE WHEN sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%' THEN 1 ELSE 0 END , 0) AS BIT ) PERSISTED; 計算列はPERSISTEDであり、compute_column_definition(Transact-SQL)によると: 執着 データベースエンジンがテーブルに計算値を物理的に格納し、計算列が依存する他の列が更新されたときに値を更新することを指定します。計算列にPERSISTEDのマークを付けると、確定的ではあるが正確ではない計算列にインデックスを作成できます。詳細については、計算列のインデックスを参照してください。パーティションテーブルのパーティション列として使用される計算列には、明示的にPERSISTEDのマークを付ける必要があります。PERSISTEDが指定されている場合、compute_column_expressionは確定的でなければなりません。 しかし、列にインデックスを作成しようとすると、次のエラーが表示されます。 CREATE INDEX FIX_tblBGiftVoucherItem_incl ON dbo.tblBGiftVoucherItem (strItemNo) INCLUDE (strTier3) WHERE isUsGift = 1; …

2
呼び出し側データベースコンテキストで実行する中央ストアドプロシージャ
sys.dm_db_index_physical_statsビューを使用して、カスタマイズされたメンテナンスソリューションに取り組んでいます。現在、ストアドプロシージャから参照されています。これで、そのストアドプロシージャがデータベースの1つで実行されると、必要な処理が実行され、データベースに関するすべてのレコードのリストがプルダウンされます。別のデータベースに配置すると、そのDBのみに関連するすべてのレコードのリストがプルダウンされます。 例(下部のコード): データベース6に対して実行されたクエリは、データベース1〜10の[要求された]情報を示します。 データベース3に対して実行されたクエリは、データベース3のみの[要求された]情報を表示します。 特にデータベース3でこの手順が必要な理由は、同じデータベース内にすべてのメンテナンスオブジェクトを保持したいからです。このジョブをメンテナンスデータベースに配置し、あたかもそのアプリケーションデータベースにあるかのように動作させたいと思います。 コード: ALTER PROCEDURE [dbo].[GetFragStats] @databaseName NVARCHAR(64) = NULL ,@tableName NVARCHAR(64) = NULL ,@indexID INT = NULL ,@partNumber INT = NULL ,@Mode NVARCHAR(64) = 'DETAILED' AS BEGIN SET NOCOUNT ON; DECLARE @databaseID INT, @tableID INT IF @databaseName IS NOT NULL AND @databaseName NOT IN ('tempdb','ReportServerTempDB') BEGIN …


2
複合キーの最初の部分としてDATETIMEを持つ主キーインデックスは使用されません
PRIMARY KEYの最初の部分として、DATETIME(または日付)のインデックス付けに問題があります。 MySQL 5.5を使用します これが私の2つのテーブルです。 -- This is my standard table with dateDim as a dateTime CREATE TABLE `stats` ( `dateDim` datetime NOT NULL, `accountDim` mediumint(8) unsigned NOT NULL, `execCodeDim` smallint(5) unsigned NOT NULL, `operationTypeDim` tinyint(3) unsigned NOT NULL, `junkDim` tinyint(3) unsigned NOT NULL, `ipCountryDim` smallint(5) unsigned NOT NULL, `count` …

3
MyISAMとInnoDBのベスト
InnoDBで、同時実行パフォーマンスの利点を得ながら、RAMの制限のためにクラスター化インデックスの代わりにMyISAMと同じインデックスを使用することは可能ですか?


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