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

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

5
Postgresは分割テーブルのインデックスを継承します
状態ごとに53のサブテーブルに分割した約6000万行のテーブルがあります。これらのテーブルは、次のように大きなテーブルを「継承」します。 CREATE TABLE b2b_ak (LIKE b2b including indexes, CHECK ( state = 'AK') ) INHERITS (b2b8) TABLESPACE B2B; 私の質問はこれです:copyステートメントが完了するまでb2b8でインデックスを作成しない場合、サブテーブルはインデックスを継承しますか?言い換えれば、私はこれをやりたいです: Create b2b8 Create b2b8_ak inherits b2b8 COPY b2b8 FROM bigcsvfile.csv CREATE INDEX CONCURRENTLY そして、すべてがサブテーブルにすべてのインデックスを作成したことがわかります。

3
非クラスター化インデックスはクラスター化インデックスよりも高速ですか?
両方のテーブルは同じ構造で、各テーブルに19972行あります。インデックス作成を練習するために、同じ構造の両方のテーブルを作成して作成しました clustered index on persontb(BusinessEntityID) そして nonclustered index on Persontb_NC(BusinessEntityId) およびテーブル構造 BusinessEntityID int FirstName varchar(100) LastName varchar(100) -- Nonclusted key on businessentityid takes 38% SELECT BusinessEntityId from Persontb_NC WHERE businessentityid BETWEEN 400 AND 4000 -- CLustered key businessentityid takes 62% SELECT BusinessEntityId from persontb WHERE businessentityid BETWEEN 400 AND 4000 …

1
インデックスの影響の見積もりSQLiteデータベースサイズ
多数のインデックス付き列を含むSQLite DBの(ディスク上の)データベースサイズを推定しようとしています。これらの列は(SQLite)タイプの整数と文字列です。これらの列を使用して行ごとのサイズを見積もるのは十分簡単ですが、インデックスのために行ごとの余分なパディングをどのように説明するかわかりません。これに対する最善のアプローチは何ですか?
9 index  sqlite  size 

1
SQL Serverのパフォーマンスを向上させるために、2つ以上のテーブルのJOIN結果にインデックスを付ける方法
私はインデックス作成に慣れていないため、インデックス作成の基本を学びました。対応するテーブルのインデックス部分内にある主キー制約のデフォルトのクラスター化インデックスを見つけることができますが、外部キー制約を作成した後は見つかりません。 これで、パフォーマンスを向上させるためにインデクシングを実装する必要があるという要件があります。JOINの結果のパフォーマンスを向上させるために、外部キーのインデックス付けについて読みました。 外部キー列を追加の非クラスター化インデックスに追加する必要がありますか、それとも外部キーにデフォルトのインデックスがありますか? SQLテーブルの構造が次のようで、t1_col3を使用してWHERE句を含むJOINクエリを実行している場合、どのようにして効率的にインデックスを実装できますか table1 table2 ------ ------ t1_col1(pk) t2_col1(pk) t1_col2 t2_col2 t1_col3 t2_col3 t1_col4 t2_col4 t2_col1(FK)

2
列が欠落しているにもかかわらず使用されているカバリングインデックス
MariaDB 10 / InnoDBを使用して、次のクエリがあります。 SELECT id, sender_id, receiver_id, thread_id, date_created, content FROM user_message WHERE thread_id = 12345 AND placeholder = FALSE ORDER BY date_created DESC LIMIT 20 このクエリは、指定された条件に従ってメッセージをフェッチし、作成日順に並べ替えます。 をカバーするインデックスがあり(thread_id, date_created)ます。 EXPLAINを実行すると、正しいインデックスが使用され、クエリがインデックスにないステートメントの途中で列を使用しているにもかかわらず、「Using where」という出力が表示されます。「placeholder = x」には任意の値を使用でき、結果は同じです。 別の列を使用するように並べ替えを変更すると、EXPLAINは「whereの使用。filesortの使用」を正しく示します。 ひっかきの瞬間があります。誰かがこれに光を当ててくださいませんか?追加の列のためにカバリングインデックスを完全に使用できなかったため、追加のfilesortが必要になることを期待します。

1
非常に巨大な(100,000,000+)テーブルのTOP(1)BY GROUP
セットアップ 〜115,382,254行の巨大なテーブルがあります。テーブルは比較的単純で、アプリケーションプロセスの操作を記録します。 CREATE TABLE [data].[OperationData]( [SourceDeciveID] [bigint] NOT NULL, [FileSource] [nvarchar](256) NOT NULL, [Size] [bigint] NULL, [Begin] [datetime2](7) NULL, [End] [datetime2](7) NOT NULL, [Date] AS (isnull(CONVERT([date],[End]),CONVERT([date],'19000101',(112)))) PERSISTED NOT NULL, [DataSetCount] [bigint] NULL, [Result] [int] NULL, [Error] [nvarchar](max) NULL, [Status] [int] NULL, CONSTRAINT [PK_OperationData] PRIMARY KEY CLUSTERED ( [SourceDeviceID] ASC, [FileSource] …

2
ハッシュインデックスが等価検索でBtreeよりも速くならないのはなぜですか?
ハッシュインデックスをサポートするPostgresのすべてのバージョンについて、少なくともバージョン8.3までは、ハッシュインデックスがbtreeインデックスより「類似または遅い」または「良くない」という警告または注意があります。ドキュメントから: バージョン7.2: 注:ハッシュインデックスのユーティリティは限られているため、通常はハッシュインデックスよりもBツリーインデックスの方が適しています。=比較の場合でも、ハッシュインデックスが実際に Bツリーよりも速いという十分な証拠はありません。さらに、ハッシュインデックスにはより粗いロックが必要です。セクション9.7を参照してください。 バージョン7.3(および8.2まで): 注:テストの結果、PostgreSQLのハッシュインデックスはBツリーインデックスと同じかそれより遅いことがわかりました。また、ハッシュインデックスのインデックスサイズとビルド時間ははるかに悪いです。また、同時実行性が高いと、ハッシュインデックスのパフォーマンスが低下します。これらの理由により、ハッシュインデックスの使用はお勧めしません。 バージョン8.3: 注:テストは実行しないように、PostgreSQLのハッシュインデックスを示したは良い B-treeインデックスよりも、およびハッシュインデックスのインデックスサイズと構築時間ははるかに悪いです。さらに、ハッシュインデックス操作は現在WALログに記録されていないため、データベースクラッシュ後にハッシュインデックスをREINDEXで再構築する必要がある場合があります。これらの理由により、ハッシュインデックスの使用は現在推奨されていません。 このバージョン8.0のスレッドでは、ハッシュインデックスが実際にbtreeよりも高速であるケースを発見したことはなかったと主張しています。 バージョン9.2でさえ、このブログの投稿(2016年3月14日)によると、実際のインデックスを作成する以外のパフォーマンス向上はほとんどありませんでした: AndréBarbosaによるPostgresのハッシュインデックス。 私の質問は、それはどのようにして可能ですか? 定義により、ハッシュインデックスはO(1)操作であり、btreeはO(log n)操作です。ではO(1)、正しいブランチを見つけてから正しいレコードを見つけるよりも、ルックアップの速度が遅い(またはそれに似ている)のはどうしてでしょうか。 索引付け理論について、それを可能にすることは決してありません。

3
100 GBテーブルにクラスター化インデックスを作成する方法
約30億行のディスク容量約104 GBを占めるヒープテーブルがあります。このテーブルの[ WeekEndingDate]列にクラスター化インデックスを作成しようとしています。データファイルには約200 GBの空き容量があり、tempdbには約280 GBの空き容量があります。 私は2つの異なる方法を試しました。最初に、次のコマンドを使用してテーブルに直接インデックスを作成しました。 CREATE CLUSTERED INDEX CX_WT_FOLD_HISTORY ON WT_FOLD_HISTORY (WeekEndingDate ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = ON, IGNORE_DUP_KEY = OFF , ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = PAGE) 私は両方のそれを試してみましたSORT_IN_TEMPDB = ONとOFF。使用するONとtempdbがOFFいっぱいになり、データドライブがいっぱいになります。 他の方法は、必要なインデックスで新しい空のテーブルを作成し、ヒープから新しいテーブルにレコードを挿入することでした。データドライブがいっぱいになった後も、これは失敗しました。 何をすべきかに関するその他の提案。私が読んだほとんどのことは、インデックスを作成するときにワークスペースとして使用するには、テーブルの約1.2倍のサイズが必要だと述べています。私はそれよりはるかに多く持っていますが、それでも失敗します。任意の提案をいただければ幸いです。 これが私の元のヒープテーブル構造です。 CREATE TABLE [dbo].[WT_FOLD_HISTORY]( [WeekEndingDate] …

1
SQLite3はjson_extract式でカバリングインデックスを使用していません
式SQLite3を使用して(3.18)でインデックスを作成しようとしていますjson_extract。私の目的は、結果を生成するためにインデックスのみを必要とするクエリを実行することです。これは、json_extract大きなデータセットや値を操作するときにパフォーマンスを低下させる高価な操作であるためです。私は自分のニーズに合うカバリングインデックスが必要だと結論しました。 ステップ1-通常のテーブル構造を使用して理論をテストする CREATE TABLE Player ( Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FirstName TEXT NOT NULL, MiddleName TEXT, LastName TEXT NOT NULL ); CREATE INDEX Player_FirstName ON Player ( FirstName ASC, LastName ASC ); EXPLAIN QUERY PLAN SELECT FirstName, LastName FROM Player WHERE LENGTH(LastName) > 10 ORDER BY FirstName …

1
実行プランで不足しているインデックスが表示されているがクエリが高速
実際の実行プランを見ると、クエリの所要時間が1秒未満であっても、インデックスが不足していることがわかります。 SELECT Account.AccountID, Account.Name FROM account LEFT OUTER JOIN accountfeaturesetting afs ON afs.accountid = account.accountid and afs.featureid = 'Schedules' and afs.settingid = 'EditReasons' WHERE ISNULL(afs.Value, '0') = '0' AND EXISTS (SELECT 1 FROM program WHERE program.AccountID = account.AccountID AND program.Active = 1 AND (program.ScheduleEditReasonFlags <> 0 OR program.ScheduleEditReasonFields <> 0)) …

2
インデックスではない列は、インデックスとともにディスク上でソートされていますか?
インデックスではないカラムは、MySQL、MyISAM、InnoDBで、インデックスと一緒にディスク上でソートされますか? 私が書き始めた誤った考え: それらは索引付けされていないので、おそらくそうではないと思います。それらがソートされた場合、それらはインデックスであることを意味します。 すべてのインデックス列が独自のコンテンツの順序で並べ替えられているため、これは正しくありませんが、対応するインデックスを持つすべての行(または一部の列のみ)の順序付けについて質問しています。 説明すると、これは、インデックスによって並べて並んでいる行の範囲をより速く選択するのに役立ちます。たとえば、select * where id >1000 and id<2000(MySQL構文に誤りがある可能性があり、よくわからない)場合、おそらく1000から2000までのセルが物理ディスク上に残っているため、id列自体をディスクからすばやく読み取ることができます。 。ただし、ID 1000から2000に対応する他の列の内容は、物理ディスク上の別の場所に書き込まれる場合があります。それらもソートされている場合、より速く読み取られます。おそらく、MySQLはそのような操作のパフォーマンスのために、物理ディスク上の列を自動的にソートします。 それらは他のタイプのデータベース(PostgreSQLなど)でソートされていますか? 12月27日:2つの回答から、クラスター化インデックス/主キーがある場合、単純な行自体が物理ディスク上でソートされていない可能性があります(私が思ったように)、クラスター化インデックスでさえもソートされていない、それがbツリーである場合、私はbツリーについて読み、そのノードが、私が理解しているように、ディスク上のランダムな場所に留まっていることを確認しました。

2
出現頻度の高い用語の低速全文検索
テキスト文書から抽出されたデータを含むテーブルがあります。データは、"CONTENT"GINを使用してこのインデックスを作成したという名前の列に保存されます。 CREATE INDEX "File_contentIndex" ON "File" USING gin (setweight(to_tsvector('english'::regconfig , COALESCE("CONTENT", ''::character varying)::text), 'C'::"char")); 次のクエリを使用して、テーブルで全文検索を実行します。 SELECT "ITEMID", ts_rank(setweight(to_tsvector('english', coalesce("CONTENT",'')), 'C') , plainto_tsquery('english', 'searchTerm')) AS "RANK" FROM "File" WHERE setweight(to_tsvector('english', coalesce("CONTENT",'')), 'C') @@ plainto_tsquery('english', 'searchTerm') ORDER BY "RANK" DESC LIMIT 5; ファイルテーブルには250 000行が含まれ、各"CONTENT"エントリは1つのランダムな単語とすべての行で同じテキスト文字列で構成されます。 ここで、ランダムな単語(テーブル全体で1ヒット)を検索すると、クエリは非常に高速に実行されます(<100ミリ秒)。ただし、すべての行にある単語を検索すると、クエリの実行が非常に遅くなります(10分以上)。 EXPLAIN ANALYZEは、1ヒット検索の場合、ビットマップインデックススキャンとそれに続くビットマップヒープスキャンが実行されることを示しています。遅い検索では、代わりにSeq Scanが実行されますが、これは非常に時間がかかっています。 もちろん、すべての行に同じデータを含めることは現実的ではありません。しかし、ユーザーがアップロードしたテキストドキュメントやユーザーが実行する検索を制御できないため、同様のシナリオが発生する可能性があります(DBで非常に出現頻度の高い用語で検索)。このようなシナリオで検索クエリのパフォーマンスを向上させるにはどうすればよいですか? PostgreSQL 9.3.4の実行 クエリプランEXPLAIN …

3
インデックス調整の質問
私はいくつかのインデックスを調整していて、いくつかの問題があなたのアドバイスを望んでいるのを見ています 1つのテーブルに3つのインデックスがあります dbo.Address.IX_Address_ProfileId [1 KEY] ProfileId {int 4} Reads: 0 Writes:10,519 dbo.Address.IX_Address [2 KEYS] ProfileId {int 4}, InstanceId {int 4} Reads: 0 Writes:10,523 dbo.Address.IX_Address_profile_instance_addresstype [3 KEYS] ProfileId {int 4}, InstanceId {int 4}, AddressType {int 4} Reads: 149677 (53,247 seek) Writes:10,523 1-最初の2つのインデックスは本当に必要ですか、それとも削除する必要がありますか? 2- profileid = xxxxである使用条件を実行するクエリと、profileid = xxxxおよびInstanceID = xxxxxxである他の使用条件があります。オプティマイザが1番目または2番目ではなく3番目のインデックスを選択する理由 また、各インデックスでロック待機を取得するクエリを実行しています。これらのカウントを取得している場合、このインデックスを調整するにはどうすればよいですか? …

2
MySQL SELECTステートメントのTIMESTAMPフィールドのWHERE条件の最適化
使用時間を追跡する分析システムのスキーマに取り組んでいます。特定の日付範囲の合計使用時間を確認する必要があります。 簡単な例を挙げると、このタイプのクエリは頻繁に実行されます。 select sum(diff_ms) from writetest_table where time_on > ("2015-07-13 15:11:56"); 通常、このクエリは、データが密集しているテーブルで約7秒かかります。約3,500万行、Amazon RDS(db.m3.xlarge)で実行されているMySQLのMyISAMがあります。 WHERE句を削除すると、クエリの所要時間がわずか4秒になり、2番目の句(time_off> XXX)を追加すると、さらに1.5秒追加され、クエリ時間が8.5秒になります。 私はこれらのタイプのクエリが一般的に行われることを知っているので、それらをより速く、理想的には5秒未満に最適化したいと思います。 私はtime_onにインデックスを追加することから始めましたが、WHERE "="クエリは大幅に高速化しましたが、 ">"クエリには影響がありませんでした。WHERE ">"または "<"クエリを高速化するインデックスを作成する方法はありますか? または、このタイプのクエリのパフォーマンスについて他に提案がある場合は、お知らせください。 注:「diff_ms」フィールドを非正規化ステップとして使用しています(time_off-time_onと同じです)。これにより、集約のパフォーマンスが約30%から40%向上します。 私はこのコマンドでインデックスを作成しています: ALTER TABLE writetest_table ADD INDEX time_on (time_on) USING BTREE; (「time_on>」を使用して)元のクエリで「explain」を実行すると、time_onは「possible_key」であり、select_typeは「SIMPLE」です。「追加」の列は「使用場所」を示し、「タイプ」は「すべて」です。インデックスが追加された後、テーブルは「time_on」が「MUL」キータイプであることを示しています。これは、同じ時間が2回存在する可能性があるため、正しいように見えます。 これがテーブルスキーマです: CREATE TABLE `writetest_table` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `sessionID` int(11) DEFAULT NULL, `time_on` …

2
どちらを信頼しますか?
ベンダーとの長期にわたる問題のトラブルシューティングを行っています。彼らのソフトウェアはフリーズして、週に1〜2回作業を停止する傾向があり、私たちの操作に大きな混乱を引き起こしています。多くのGBのログとDBのバックアップを送信しても、原因を特定できませんでした。最近、彼らは問題が私たちのメンテナンスに関するものであり、おそらくソフトウェアに関するものではないことを示唆し始めています(問題が発生したときに長時間実行されているクエリ、CPU / RAM / IOプレッシャー、またはデッドロックさえないにもかかわらず)。特に彼らは私たちのインデックスが問題であると言っています。 彼らが使用するのにお気に入りのツールはDBCC showcontigですが、これはMSによって廃止されると主張しています。彼らは特にスキャン密度と範囲の断片化にこだわっています。言い訳を取り除くために、<90%のスキャン密度または> 10%の断片化でインデックスを再構築する積極的な夜間メンテナンスを行いました。これにより、スキャン密度トレインからそれらをある程度放棄しましたが、エクステントの断片化に固定されたままです。DBCC showcontigは、数時間前に再構築されたインデックスでも、高度な断片化を示します。以下は、「可能性のある問題」として指摘されたテーブルのdbcc_showcontigおよびsys.dm_db_index_physical_statsの結果です。 DBCC SHOWCONTIG スキャンしたページ................................:1222108 スキャンされた範囲..............................:152964 エクステントスイッチ..............................:180904 平均 エクステントごとのページ..................................:8.0 スキャン密度[ベストカウント:実際のカウント] .......:84.44%[152764:180905] 論理スキャンの断片化..................:3.24% エクステントスキャンの断片化...................:35.97% 平均 ページあたりの空きバイト..................................:692.5 平均 ページ密度(フル).....................:91.44% sys.dm_db_index_physical_stats index_type_desc alloc_unit_type_desc Avg_fragmentation_in_percent page_count CLUSTERED INDEX IN_ROW_DATA 3.236803129 1222070 NONCLUSTERED INDEX IN_ROW_DATA 0.680074642 48230 NONCLUSTERED INDEX IN_ROW_DATA 0.093237195 48264 NONCLUSTERED INDEX IN_ROW_DATA 0.03315856 48253 NONCLUSTERED …

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