0

これはテーブルです:

dt VARCHAR(65)
ct VARCHAR(65)
amount INT

これはクエリです:

SELECT SUM(CASE WHEN dt='peter' THEN amount ELSE -amount END) 
FROM receipt WHERE dt='peter' OR ct='peter'

テーブルには 80 万件のレコードがあります。dtctamount、およびにインデックスがありますct,dt。現在、このクエリには 5 分以上かかります (!)。

4

1 に答える 1

1

できるよ

SELECT SUM(s) AS ss
FROM (SELECT SUM(amount) AS s
      FROM receipt
      WHERE dt = 'peter'
      UNION
      SELECT -SUM(amount)
      FROM receipt
      WHERE dt = 'peter')

このクエリは、元のクエリよりも高速に実行されるはずです。それ以外の場合は、パフォーマンスを向上させるために結合を使用するように dt/ct 列を正規化する必要があります

于 2013-09-11T11:23:06.557 に答える