2017-01-24 6 views
0

次のupdate文のサブクエリが良い(相関していない)または悪い(サブクエリ)の場合、私は不思議ですか?不良(相関)または良好(相関なし)サブクエリ?

つまり、私の質問は非効率的なクエリですか?

UPDATE tableA 
SET field1=0 
FROM tableA 
WHERE field2 IN (SELECT field2 
       FROM tableA 
       WHERE someField IS NOT NULL 
       AND someOtherField = 'ABC') 
+4

良い(相関しない)または悪い(サブクエリ) "! – jarlh

+4

これは相関関係がありません。サブクエリです。 –

+0

相関サブクエリには、メインクエリへの参照を含む条件が含まれています。 – jarlh

答えて

0

サブクエリは(そのSQLオプティマイザではなくサブクエリよりも、悪いむしろ1が主張する可能性が)本質的に良いか悪いかではありません。あなたの例は全く相関していません。

特定のクエリが効率的かどうかという問題は、実行計画の分析を必要とします。これは、主に、データ、索引、およびデータのパーティション化スキームの配布に依存します。あなたのお問い合わせにつきましては、先験的なものはありません。

ロジックを書き込む他の方法があります。私はこれが好きです:

WITH toupdate as (
     SELECT a.*, 
      SUM(CASE WHEN someField IS NOT NULL AND someOtherField = 'ABC' 
         THEN 1 ELSE 0 
       END) OVER (PARTITION BY field2) as cnt 
     FROM tableA a 
    ) 
UPDATE toupdate 
    SET field1 = 0 
    WHERE cnt > 0; 

これは100%同じではありません。 1つの違いは、NULLの値を他の値と同じようにfield2で扱うことです。あなたのバージョンは決してNULL値を更新しません。

+0

*あなたのバージョンは決してNULL値を更新しません。* =>どのNULL値が更新されませんか? – beta

+0

'field2'が' NULL'である行は決して更新されません。 –

1

あなたのクエリが、そのわずかサブクエリを相関されていません。..以下

相関サブクエリ..ですクエリ上記

UPDATE a 
SET field1=0 
FROM tableA a 
WHERE exists (SELECT 1 
       FROM tableB b 
       WHERE a.somecol=b.somecol) 

1相関サブクエリのより多くの例

select orderid, 
(select custname from customers c where c.custid=o.custid) from orders o 

することができます結合として書かれる

select orderid,custname 
from orders o 
join 
customers c 
on c.custid=o.custid 
両方のクエリが同じ実行計画を使用する傾向があるとの両方が、我々が想定することはできませんwell..soと同じコストを持って実行する

、相関サブクエリは、上記のため

enter image description here

select orderid, 
(select count(orderid) from orders o2 where o2.custid=o.custid) 
from orders o 

より良い相関を実行しませんサブクエリは、SQLは注文テーブルに一度だけアクセスすることはできませんし、すべての計算を行う、それはテーブルに2回アクセスする必要があります..これは、私は相関サブクエリで見ることができたちょっとです。

関連する問題