1

5 つの null 許容外部キーを持つテーブルがあるとします。すべての行で、これらのうちの 1 つだけが値を持ちます。

現在、このテーブルはかなり大きくなり、2.2m レコードの行に沿ったどこかに含まれています。

ほとんどの場合、テーブルの「部分」のクエリを実行して、特定の null 許容外部キーが値を持つレコードに関心があるだけです。当然のことながら、以下のクエリを使用して、必要なサブセットを取得するだけでも時間がかかります。1 つの特定のサブセットの 170 万レコードを取得するのに 28 秒かかります。

SELECT * FROM テーブル WHERE 列が NULL でない

どうすればこれを高速化できるか、特にデータ モデルを変更せずに高速化できるかどうかに非常に興味があります。

4

4 に答える 4

1

ベース テーブルを変更できない場合は、非正規化された 5 つの列を origin と value の 2 つの列に変換する VIEW を作成します。したがって、これがあるとします:

Table notNormal (
primaryKey,
someValue,
foreignNotNormal01,
foreignNotNormal02,
foreignNotNormal03,
foreignNotNormal04,
foreignNotNormal05
)

私はこれを作成します:

CREATE MATERIALIZED VIEW fixedThis AS
SELECT primaryKey, someValue, 'FKCOL01' AS foreignNotNormalOrigin, foreignNotNormal01 AS foreignNotNormalColValue
WHERE foreignNotNormal01 IS NOT NULL
UNION
 ...
 ...
SELECT primaryKey, someValue, 'FKCOL01' AS foreignNotNormalOrigin, foreignNotNormal05 AS foreignNotNormalColValue
WHERE foreignNotNormal05 IS NOT NULL

次に、fixedThis に対する私の SELECTS は、外部キー列の値が何であれ、結果のみを表示しています。

単純な高速化が必要な場合はインデックスを使用しますが、実際にはデータ モデルを修正する必要があります。

于 2013-03-06T13:44:49.207 に答える
1

高速化できる唯一のもの

SELECT * FROM Table WHERE Col IS NOT NULL

Colのインデックスです。

ただし、サーバーからデータベース クライアントに 170 万件のレコードを送信するには、特にネットワーク経由の場合、時間がかかる場合があります。そこでできることは、SELECT で必要なフィールドだけを指定するなど、送信するデータの量を減らすことだけです。

于 2013-03-06T13:34:22.227 に答える
0

問題の外部キーが参照する他のテーブルとテーブルを結合しようとしましたか? これにより、外部キーが null であるすべてのエントリが削除されます。
参加は非常に遅くなると思いますが、驚くかもしれません。

また、問題の外部キーのインデックスはありますか?

于 2013-03-07T20:41:08.667 に答える
0

これらのテーブルが NULL であるかどうかに基づいてデータをパーティション分割すると、処理速度が少し向上する可能性があります。すべてのデータがCol != NULL1 つのパーティションにまとめられます。もちろん、これらの 5 つの列がこのテーブルの最も重要なビットであると想定しています。

CREATE PARTITION FUNCTION MyCol1 (int)
AS RANGE LEFT FOR VALUES (NULL)

CREATE PARTITION SCHEME MySchemeForCol1
AS PARTITION MyCol1
TO Col1FileGroup

ただし、テーブルをリファクタリングすると状況は改善されます。データのパーティション分割に時間をかける前に、テーブルをリファクタリングすることをお勧めします。このようにパーティショニングしても同じテーブルに保持されますが、ディスク上で分離されます...しかし、テーブルを一連のリンクテーブルにリファクタリングすると、おそらく費用対効果が高くなります.

ただし、パーティショニングで運が良ければ、みんなに知らせて解決策を投稿してください。

于 2013-03-06T18:59:15.503 に答える