1


0

次の2つの操作の複雑さを教えてください。 最初のケースは、私がインデックスを持っていることを列で並べ替えて、次のような特定の数値より下または上のすべての値のカウントを求めるカウントです。

SELECTカウント(*)FRB tbl WHERE col1> 10 ORDER BY col1;

もう1つのケースは中央値操作に関するものです。 中央値とは、(int)n / 2の行の値を見つけることを意味します。ここで、nはテーブル内の行数です。 この例としては、次のようなものがあります(これもcol1に索引があります)。

SELECT中央値(col1)FROM tbl ORDER BY col1;

これらのケースの最悪ケースの複雑さは何ですか?

1 Answer


2


`ORDER BY`句は不要です - 混乱を招くこと、またはその両方です。

`SELECT COUNT(*)`は単一行を返します(通常)。 検索基準があるため、オプティマイザーはcol1の索引スキャン(col1を索引の先頭列として持つ索引がある場合)、または表スキャンを実行する必要があります。 これはO(N)操作です。ここで、Nはテーブル内の行数です。

SELECT MEDIAN(col1)も単一行を返します(通常)。 これもO(N)操作になりますが、これも索引スキャンまたは表スキャンを使用します。

オプティマイザが ORDER BY`句を使って何をするのかは絶対にわからないので、「通常」の修飾子があります。 1つの可能性は、オプティマイザがそれが冗長であると判断し、それを無視することです。 他の可能性はそれがどういうわけかあなたが `ORDER BY`した col1`を射影の列に追加し、それを他の操作に含め、そして結果を返す前にそれを削除することです。 しかし、それは集約と非集約を `GROUP BY`句なしで混在させるのには馬鹿げたことになるでしょう - そのため、オプティマイザはそれを無視するか、クエリを拒否するでしょう。 しかし、私はMySQLで実験をしたことはありません。

FWIW、IBM Informix Dynamic Server(IDS)からエラー-19828が返されます。このコンテキストでは、ORDER BY列または式はSELECTリストに含まれている必要があります。

ORDER BY句がなければ、上記の分析は十分正確です。 条件のないSELECT COUNT(*)の場合、サーバーはO(1)時間内にクエリに答えるためにテーブルについて保持しているメタデータを使用することがよくあります。