sql >> データベース >  >> RDS >> Sqlserver

where句での関数呼び出し

    SQL ではよくあることですが、実際のスキーマが使用されていることを知らなければ、クエリはほとんど無関係です。

    Member.Phone にインデックスはありますか?いいえの場合、クエリの記述方法に違いはありません。すべてのクエリがテーブル全体をスキャンし、同じことを実行します (つまり、パフォーマンスが低下します)。 インデックスがある場合 クエリの書き方ですべてが変わります:

    SELECT * FROM Members WHERE Phone= @Phone;
    SELECT * FROM Members WHERE Phone= dbo.FormatPhone(@Phone);
    SELECT * FROM Members WHERE  dbo.FormatPhone(Phone)[email protected];
    

    最初のクエリは最適であることが保証され、インデックスで電話をシークします。
    2 番目のクエリは、dbo.FormatPhone の特性に依存します。最適なシークを使用する場合と使用しない場合があります。
    最後のクエリは悪いことが保証されています。テーブルをスキャンします。

    また、NOLOCK ヒントを削除しました。これが今日のテーマのようです... SQL の nolock の構文 . NOLOCK は常に 間違った答え。スナップショット分離を使用します。



    1. Mysqlでこれを解決する方法(#1242-サブクエリは複数の行を返します)?

    2. 左側のvarcharを特定の長さにパディングする最も効率的なT-SQLの方法は?

    3. 特定の年からの年のリストを返す SQL

    4. T-SQLで文字列から部分文字列を抽出する方法