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

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

3
高選択性フィールドと低選択性フィールドを持つ複合インデックス順のフィールド順
30億行を超えるSQL Serverテーブルがあります。クエリの1つに非常に長い時間がかかるため、最適化を検討しています。クエリは次のようになります。 SELECT [Enroll_Date] ,Count(*) AS [Record #] ,Count(Distinct UserID) AS [User #] FROM UserTable GROUP BY [Enroll_Date] [Enroll_Date]は選択可能な値が50未満の選択性の低い列ですが、UserID列は2億を超える個別の値を持つ選択性の高い列です。私の研究に基づいて、私はこれらの2つの列に非クラスター化複合インデックスを作成する必要があると考えています。理論的には、高選択性の列が最初の列である必要があります。しかし、私の場合、group by句で低選択性カラムを使用しているため、うまくいくかどうかはわかりません。 このテーブルにはクラスター化インデックスがありません。

1
インデックスSEEKは、OPTION(RECOMPILE)でない限り使用されませんか?
(質問はSOから移動しました) クラスタ化インデックス付きのテーブル(ダミーデータ)に2つの列が含まれています。 次に、これら2つのクエリを実行します。 declare @productid int =1 , @priceid int = 1 SELECT productid, t.priceID FROM Transactions AS t WHERE (productID = @productid OR @productid IS NULL) AND (priceid = @priceid OR @priceid IS NULL) SELECT productid, t.priceID FROM Transactions AS t WHERE (productID = @productid) AND (priceid = @priceid) …

1
インデックスシークが正しい行数を推定でき、ソート演算子が推定できないのはなぜですか?
次のような述語の関数を使用するクエリがあります。 commentType = 'EL' AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0) 40000行のcommentTypeにフィルター処理されたインデックスがあり、クエリを実行すると、インデックスシークの推定行数は非常に正確(約11K)ですが、次のステップ(ソート演算子)では、統計を完全に無視し、フィルターされたインデックスの行の総数を推定するだけです。 なんでこんなことが起こっているの?私はsargabilityの基本を知っており、正気を期すために、dateaddを実際の日付(2014-01-01)と実際の日付で置き換えてテストしました...ソートは行数を正しく推測し始めました... なぜこれが起こっているのですか、どうすれば修正できますか?決まった日を渡すことはできません...

1
大量のデータを含む既存のテーブルにインデックスを追加するとどうなりますか?
約1500万件のレコードを含むテーブルがあります。次に、テーブルにインデックスを追加する必要があります。 インデックスを追加すると、テーブルのすべてのエントリが更新されるまでに時間がかかります。 インデックスを追加するとダウンタイムが発生するかどうか、私はかなり混乱しています。 はいの場合、どのようにしてダウンタイムを克服できますか?

1
本当に忙しいテーブルにインデックスを作成する
insert\select毎回たくさんのテーブルがあります(毎秒100台のマシンが挿入/更新しているような)。 1秒でもロックできないテーブルにインデックスを作成する最良の方法は何ですか? インデックスを作成すると、リクエストがロックされて、実行できなくなります。 100万行以上の大きなテーブルです。

1
異なるテーブルからORDER BYを使用してTOP 1を選択するときにインデックス付きビューを設定する方法
次のシナリオでインデックス付きビューを設定して、2つのクラスター化インデックススキャンなしで次のクエリが実行されるようにしています。このクエリのインデックスビューを作成して使用するときはいつでも、私が付けたインデックスはすべて無視されるようです。 -- +++ THE QUERY THAT I WANT TO IMPROVE PERFORMANCE-WISE +++ SELECT TOP 1 * FROM dbo.TB_test1 t1 INNER JOIN dbo.TB_test2 t2 ON t1.PK_ID1 = t2.FK_ID1 ORDER BY t1.somethingelse1 ,t2.somethingelse2; GO テーブルの設定は次のとおりです。 2つのテーブル 上記のクエリによる内部結合で結合されている 上記のクエリでは、最初の列から、次に2番目のテーブルの列の順になっています。TOP 1のみが選択されています (以下のスクリプトには、問題の再現に役立つ場合に備えて、テストデータを生成する行もいくつかあります) -- +++ TABLE SETUP +++ CREATE TABLE [dbo].[TB_test1] ( [PK_ID1] [INT] IDENTITY(1, …


2
大きなテーブルでのインデックススキャンが遅い
PostgreSQL 9.2を使用すると、比較的大きなテーブル(2億を超える行)でクエリが遅くなるという問題が発生します。クレイジーなことは何もしていません。単に歴史的な価値を加えているだけです。以下は、クエリとクエリプランの出力です。 私のテーブルレイアウト: Table "public.energy_energyentry" Column | Type | Modifiers -----------+--------------------------+----------------------------------------------------------------- id | integer | not null default nextval('energy_energyentry_id_seq'::regclass) prop_id | integer | not null timestamp | timestamp with time zone | not null value | double precision | not null Indexes: "energy_energyentry_pkey" PRIMARY KEY, btree (id) "energy_energyentry_prop_id" btree (prop_id) …

3
1つまたは2つのインデックス?
データベースのテーブルに次のインデックスを作成しました。 CREATE INDEX [idx_index1] on [table1] (col1, col2, col3) サーバーは次の「不足している」インデックスを提案しています: CREATE INDEX [idx_index2] on [table1] (col1, col2) INCLUDE (col3, col4, col5, col6....) 維持する必要のある新しいインデックスを作成するのではなく、提案された列を含めるように既存のインデックス定義を修正するのは私には理にかなっています。col1とcol2を選択するクエリは、index1をindex2と同じくらい効果的に使用できます。私は正しいのですか、それとも何か不足しているのでしょうか?

2
MySQLは別のテーブルに対して結合するときにインデックスを使用しません
2つのテーブルがあります。最初のテーブルには、CMS内のすべての記事/ブログ投稿が含まれています。これらの記事の一部は雑誌にも掲載される場合があります。その場合、それらは雑誌固有の情報を含む別のテーブルと外部キーの関係を持っています。 以下は、これらの2つのテーブルの作成テーブル構文の簡略化されたバージョンで、いくつかの重要でない行が削除されています。 CREATE TABLE `base_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_published` datetime DEFAULT NULL, `title` varchar(255) NOT NULL, `description` text, `content` longtext, `is_published` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `base_article_date_published` (`date_published`), KEY `base_article_is_published` (`is_published`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `mag_article` ( `basearticle_ptr_id` int(11) NOT NULL, …

2
毎日99%のインデックスの断片化を防ぐ方法
1日2回挿入される100.000プレーヤー用のハイスコアテーブルがあり、プレーヤーごとに1つのレコードがあります。1日の終わりに、そのテーブルのインデックスのインデックスの断片化は99%です。設定を微調整してこれを防ぐ方法はありますか? CREATE TABLE HighScore( [id] [int] IDENTITY(1,1) NOT NULL, [user] [int] NULL, [player] [int] NULL, [round] [tinyint] NULL, [group] [int] NULL, [rank] [int] NULL, [delta] [int] NULL, [roundpoints] [int] NULL, [totalpoints] [int] NULL, PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS …

3
含まれる列とフィルターされたインデックス
現在、tb_tranfersという名前のテーブルを使用しています。このテーブルには4,000万行あり、サイズは最大26 GB(11 GBのデータ、15 GBのインデックス)です。 行の10〜15%が一時削除された行です(DeletedDateはnullではありません)。アプリケーションはDeletedDateがnullである行のみを使用します。このテーブルへのすべてのクエリには、その効果に対する句が含まれます。 このテーブルには15のインデックスがあります。欠落しているインデックスDMVには、削除された日付を含む列としてインデックスを作成するための提案が含まれています。 WHERE DeleteDdate IS NULL11個の整理されていないインデックスすべてにフィルター処理されたインデックスを使用することは役に立ちますか?または、DeletedDate列をインクルード列として持つ方が良いでしょうか?

2
データベースは、トランザクションのどの時点でインデックスを更新しますか?
インデックスとトランザクションの両方が関与する挿入のイベントのシーケンスを理解しようとしています。 たとえば、Oracleのドキュメントには次のように記載されています。 データをロードする前に1つ以上のインデックスを作成[または保持]している場合、データベースは各行が挿入されるたびにすべてのインデックスを更新する必要があります。 しかし、トランザクションを作成し、5つの行を挿入してからコミットするとどうなりますか?挿入ごとにインデックスが更新されますか、それともコミットポイントで更新されますか? これらのレコードがコミットされるまで、更新されたインデックスはおそらく使用できないため、ロジックはそれらがコミットポイントでのみ更新されることを教えてくれます。しかし、それは本当ですか? もしそうなら、挿入する行が1mある場合、最高のパフォーマンスを得るには、100kレコードの10トランザクションではなく、すべての行の1つの大きなコミットを実行する必要がありますか?もちろん、これは、999,999行が失敗した場合にロールバックが大きくなるリスクがあることを理解しています。 私の専門用語が少し出ていればお詫びします。私は貿易ではDBAではありません。私は特定のデータベースにはあまり関心がありません。データベース全般についてですが、私が最もよく使用しているのはOracleとPostgresです。私はこのトピックについて検索しましたが、決定的な答えは本当に見つかりません。

2
未使用のインデックスのベストプラクティス
このクエリに基づいて、総読み取り数が少ない(1または2のように0または0に非常に近い)と、大量または中程度のユーザー更新(このクエリで挿入または削除が見つからなかった)が行数が多い場合、理論的にはインデックスを削除する必要があります。 SELECT DISTINCT OBJECT_NAME(s.[object_id]) AS ObjectName , p.rows TableRows , i.name AS [INDEX NAME] , (user_seeks + user_scans + user_lookups) AS TotalReads , user_updates UserUpdates FROM sys.dm_db_index_usage_stats s INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id INNER JOIN sys.partitions p ON p.object_id = i.object_id WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') …

2
MySQLでNULL値を持つ列のインデックスを設計する方法は?
4,000万のエントリを持つデータベースがあり、次のWHERE句を使用してクエリを実行したい ... WHERE `POP1` IS NOT NULL && `VT`='ABC' && (`SOURCE`='HOME') && (`alt` RLIKE '^[AaCcGgTt]$') && (`ref` RLIKE '^[AaCcGgTt]$') && (`AA` RLIKE '^[AaCcGgTt]$') && (`ref` = `AA` || `alt` = `AA`) LIMIT 10 ; POP1NULLにすることもできる浮動列です。POP1 IS NOT NULLエントリの約50%を除外する必要があるため、最初にそれを配置しました。他のすべての用語は、数をごくわずかに減らします。 とりわけ、私は最初の列としてのpop1_vt_sourceインデックスvtが使用されている間、使用されていないように見えるインデックスを設計しました。EXPLAIN-出力: | id | select_type | table | type | possible_keys | …
11 mysql  index 

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