2016-12-29 21 views
-1

私はパーティションテーブルでビューを作成しました。パーティション化された列をSELECTステートメントに渡すと、オプティマイザはEXPLAINステートメントでチェックされたときに特定のパーティションに移動しません。MySQL - ビューからのパーティションへのアクセス

ビューのアクセスをテーブルの単一パーティションにする方法はありますか?

は、[編集]:ここで私はそれがオプティマイザがパーティション「p_2000」と「p_2001」の両方に起こっている示し、「説明」を実行すると、私は2つのパーティション表

CREATE TABLE Partition1 (ID INT,NAME VARCHAR(100),DOB DATE) 
PARTITION BY LIST (YEAR(DOB)) 
(
    PARTITION P_2000 VALUES IN (2000), 
    PARTITION P_2001 VALUES IN (2001) 
); 

CREATE TABLE NOPART (ID INT,DOB DATE) 
PARTITION BY LIST (YEAR(DOB)) 
(
    PARTITION P_2000 VALUES IN (2000), 
    PARTITION P_2001 VALUES IN (2001) 
); 

CREATE OR REPLACE VIEW P_VIEW 
AS 
SELECT ID,DOB 
FROM PARTITION1 
UNION 
SELECT ID,DOB 
FROM NOPART; 

EXPLAIN 
SELECT * FROM P_VIEW 
WHERE DOB = '2001-01-01'; 

上のビューを作成する方法です。

+0

私たちに 'show create table [パーティションテーブル]'と 'show create view [your_view]'の出力を見せて、もっと詳しく教えてください。 –

+0

上記の更新された質問。 –

答えて

0

VIEWsの実装には多くの欠点があります。あなたはかもしれないが1つヒットしました。

パフォーマンスを提供しないPARTITIONingの用途が多数あります。 BY RANGEはおそらくの一部のの使用例のパフォーマンスに役立つ唯一の変種です。 100万行未満のテーブルは、分割する価値がありません。

CREATE TABLECREATE VIEWSELECTが表示されていないと、私のように曖昧な回答しか得られません。

(追加されたコードへの応答)それ以上のものがなければ、PARTITIONingはそのような方法でインデックスをDOBに置くことには利点がありません。

VIEW + PARTITIONアプローチ(インデックスなし)は、2001パーティション全体をスキャンして、 '2001-01-01'の数行を探します。代わりに、単純なインデックス手法では、それらを即座に見つけることができます(365倍高速)。 (OK、それほど高速ではありませんが、まだまだです)

+0

こんにちはリック!サンプルコードで質問を編集しました。それを見てください。 –

関連する問題