2010-11-27 5 views
1

私はいくつかのクエリの最適化をしようとしています。 SQLクエリをリレーショナル代数に変換して最適化します。データベースリレーショナル代数最適化

私のDBテーブルスキーマ以下の通りです:

ランナーやヒルズの多くの列があるかもしれない
Hills(MId, Mname, Long, Lat, Height, Rating,...) 
Runners(HId, HName, Age, Skill,...) 
Runs(MId, CId, Date, Duration) 

私のSQLクエリは次のとおりです。

SELECT DISTINCT Runners.HName, Runners.Age 
FROM Hills, Runners, Runs 
WHERE Runners.HId = Runs.HId AND Runs.MID = Hills.MId AND Height > 1200 

だから私は実行して起動することもできます。このような

π Name, Age(σ Height > 1200 (Hills × Runners × Runs)) 

か何かをして、参加するの良い選択でそれを最適化し、しかし、私はないんだけど

+1

どのプラットフォームで最適化しますか? SQLを使用して最適化するのはなぜですか?最終目的は何ですか? – Randy

+1

このような最適化では、正確に何を達成する予定ですか?通常、SQL問合せは、問合せ計画を使用して正しい索引を定義する速度に最適化されています。関係代数最適化の理論は何ですか? – thomaspaulb

+1

これは、すべてのRDBMSがバックでやっていることだからです。物理的な最適化はそれの最後の部分にすぎません。関係モデルが非常に「緩い」方法で動作するため、多くのクエリはさまざまな方法で記述することができ、異なる関係演算子を適用する順序は複雑さの大きな違いを意味します。つまり最初に選択したものと最初に結合するものなど –

答えて

3

を開始する場所を確認してくださいあなたは表記に参加するSQLを使用して開始することができます:

SELECT DISTINCT P.HName, P.Age 
    FROM Hills AS H 
    JOIN Runs AS R ON H.MId = R.MId 
    JOIN Runners AS P ON P.HId = R.HId 
WHERE H.Height > 1200 
0をあなたが検索基準を押し下げることができるように

あなたは、その後、WHERE条件だけヒルズに適用されることを観察することができます

SELECT DISTINCT P.HName, P.Age 
    FROM (SELECT MId FROM Hills WHERE Height > 1200) AS H 
    JOIN Runs AS R ON H.MId = R.MId 
    JOIN Runners AS P ON P.HId = R.HId 

これは標準の最適化である - とSQLオプティマイザが自動的に行います1。実際、オプティマイザがそれに対処できるため、最初に表示されたクエリの書き換えを行う価値はないでしょう。私は可能性として見る他の最適化はレベルダウンDISTINCT操作を推進している。

SELECT P.HName, P.Age 
    FROM (SELECT DISTINCT R.HId 
      FROM (SELECT MId FROM Hills WHERE Height > 1200) AS H 
      JOIN Runs AS R ON H.MId = R.MId 
     ) AS R1 
    JOIN Runners AS P ON P.HId = R1.HId 

これは可能な限り小さく設定中間結果を保持します:R1は、少なくとも実行している人々のためのID値のリストが含まれています1つは1200メートル(または1200フィート?)の丘で、Runnersテーブルの詳細と1:1で結合できます。オプティマイザがDISTINCTのプッシュダウンをそれ自身で推論できるかどうかを調べることは興味深いでしょう。

もちろん、関係代数では、DISTINCT演算は '自動的に'実行されます。すべての結果と中間結果は常に重複のないリレーションです。これは、最初に対応

  • π氏名、年齢(> 1200σ高さ(ヒルズ×ランナー×が実行))

:元の 'リレーショナル代数' 表記が与えられる


上記のSQLステートメント。

2番目のSQLステートメントの後、対応(多かれ少なかれ)へ:

  • π名前、年齢((MIDπ(σ身長> 1200(ヒルズ)))×ランナー×を実行します)

第三SQL文、その後対応(多かれ少なかれ)へ:

  • π名前、年齢((πHID((MIDπ(σ身長> 1200(ヒルズ)))×ラン))×ランナー)

ここでは、括弧が関係代数に式を順番に評価させることを前提としています。私はそこに括弧の数をできるだけ少なくしているのかどうかはわかりませんが、そこにあるものはあいまいさの余地があまりありません。

+0

私は関係代数ではなく、SQL – Spawn

+1

でこれを行う必要がありますそれは明らかに宿題です:) –