1

私はSQLクエリに不慣れで、それらについてできるだけ多くのことを学ぼうとしています。これが私が今いちゃつくSQLクエリであり、それについていくつか質問があります。

SELECT COUNT(id) AS count 
FROM stride 
WHERE recipientId = ? 
   AND recipientView = 0 
   AND sourceUserId != recipientId
  1. 等しくない前に等しいを置くこと、またはその逆を行うことは、パフォーマンスに違いをもたらしますか?
  2. ここではrecipientIdを2回使用しています。変数を2回呼び出す方がよいですか、それとも両方の時間で変数を入力する必要がありますか?例えば。

SELECT COUNT(id) AS count FROM stride WHERE recipientId = ? AND recipientView = 0 AND sourceUserId != ?

  1. id主キーです。COUNT(*)代わりに置くことでパフォーマンスに違いはありますか?やるCOUNT(id)ほうが早い気がしますが、それはただの気持ちであり、証拠がありません。
  2. INクエリ速度を上げるために、代わりにここでまたは他の演算子を使用する必要がありますか?
  3. このクエリを高速化するためにここで行うことはありますか?
4

2 に答える 2

4

クエリの最適化は、クエリの構文とはほとんど関係がなく、RDMSクエリオプティマイザーとは多くの関係があります。

オプティマイザーがそれらを引き離し、最良のクエリであると感じるものを構築するので、あなたが提案するすべてのものはおそらく何の違いもありません。具体的には、

  1. 関係ない
  2. 関係ない
  3. パフォーマンスへの影響はありませんが、id列にsがあるCOUNT(id)<>COUNT(*)場合NULL、主キーの場合はsがないことに注意してくださいNULL
  4. このクエリをどのように作成できるかわかりませんINが、いずれにしてもパフォーマンスに影響はありません
  5. インデックスは速度に劇的な影響を与えます-このクエリの場合、インデックスrecipientIdは劇的な影響を及ぼしrecipientViewますsourceUserId

あなたがすべきことは、私の言葉を信じないことです。各クエリを設定し、RDMSから実行プランを確認します。それらが同じである場合、それらは同じクエリです。

于 2013-03-04T02:07:14.403 に答える
1

サブクエリがない限り、等しいものと等しくないものがどこにあるかは問題ではありません。あなたの場合、where句は全体として評価されるので、等しくないものと等しいものがどこにあるかは問題ではありません。

[id]が主キーであるため、Count(id)とCount(*)は同じです。どちらのカウントにもパフォーマンス上の利点はありません。

于 2013-03-04T02:18:47.707 に答える