2017-03-24 1 views
2

に参加し、私は、次のサブクエリがありますインナーとの相関サブクエリの改善、パフォーマンスが

SELECT 
    b.state, 
    b.city, 
    count(b.state) as totalCount, 
    sum(cast(replace(b.annual_prod, ',','.') as decimal)) AS annualProd, 
    (
    SELECT count(size_k) 
    FROM opentable_clean a 
    WHERE a.state = b.state 
     AND a.city = b.city 
     AND cast(replace(a.size_k, ',','.') as decimal) >= 20 
    GROUP BY a.state, a.city 
) as Above20k 
FROM opentable_clean b 
GROUP BY b.state, b.city 
ORDER by annualProd DESC; 

これは動作しますが、クエリは非常に非効率的であり、基本となるテーブルのサイズ与えられた長い時間がかかります。内部結合を使用するとパフォーマンスが向上すると思っていますが、動作するものを試すことができませんでした。

私はSQLの新機能として、どんな提案も役に立ちます。

+3

あなたの文字列(特に 'a.size_k')、およびその型変換&文字列操作として数値を格納していることが表示されますあなたの内側の 'where'節はSARG可能ではない可能性が高いです。数値データを適切に保存するためにテーブルを修正できますか? – alroc

+1

どのDBMSを使用していますか? Postgres?オラクル? –

+0

私はpostgresを使用しています – user3003374

答えて

1

それは..あなたはまだすべてのこれらの置き換えを行う上で、いくつかのヒットが表示されます。この

select b.state, 
    b.city, 
    count(b.state) as totalCount, 
    sum(cast(replace(b.annual_prod, ',','.') as decimal)) AS annualProd, 
    SUM(CASE 
      WHEN cast(replace(a.size_k, ',','.') as decimal) >= 20 
      THEN 1 
      ELSE 0 END) as Above20k 
    FROM opentable_clean b 
    GROUP BY b.state, b.city 
    ORDER by annualProd DESC; 

のようなもの、あなたが探しているの参加はありませんが、集約関数の条件 - あなたも作成することができた場合文字列を正しく格納するためにテーブル上の計算された永続列だけを使用すると、クエリのパフォーマンスが向上します。

エンジンがテーブルを2回スキャンするのではなく、1つのテーブルだけで作業しているので、1回のスキャンですべてのことができるはずです。実際に2番目のテーブルを使用していた場合は、同じ種類のメソッドを適切なJOINで使用したいと考えています。

+0

ありがとうDan。それは素晴らしい仕事でした。私はちょうど上記のソリューションで合計とカウントを交換する必要がありました。 – user3003374

+0

問題ありません。この回答があなたに役立った場合は、それを受け入れられたものとしてマークすることを検討してください - そして、後で参照するために、元の質問で使用しているRDBMSにタグを付けることが常にベストです(タグを更新しました) –

+0

'SQL Server'のように動作しますが、' SUM'も意味があります。 –

0

クエリのパフォーマンスを向上させるには、まず実行計画とioの統計を確認する必要があります。

実行計画を表示するには、表示実行計画ボタンをクリックします。

io statsを表示するには、SET STATISTICS IO ONを実行した後でクエリを実行します。統計情報がメッセージと共に表示されます。

インデックスがない場合、このクエリはtableScan/clusteredIndexScanによってopen_tableを読み取り、次にグループごとにtableScan/clusteredIndexScanによってopen_tableをグループ化して読み取ります。

(州、市)の一つの指標になります助けることができる最も簡単な指数

+0

OPがSQL Serverを使用していますか? –

関連する問題