2

ユーザーがディレクトリ内の名前を検索する AJAX クイック検索機能があります。name がパラメーターであるクエリは次のようになります。

SELECT TOP 30 * 
FROM   CONTACT c 
WHERE  ( c.FIRST_NAME LIKE '%#name#%' 
          OR c.LAST_NAME LIKE '%#name#%' ) 
        OR ( c.FIRST_NAME + ' ' + c.LAST_NAME LIKE '%#name#%' ) 
        OR ( c.LAST_NAME + ' ' + c.FIRST_NAME LIKE '%#name#%' ) 
ORDER  BY LAST_NAME, 
          FIRST_NAME 

このタイプのクエリをサポートするために必要なインデックスの最適なタイプは何ですか? または、パフォーマンスを最適化するためにクエリを別の方法で作成する必要がありますか? どんなアドバイスも素晴らしいでしょう。

4

2 に答える 2

0

あなたの最良の選択肢は次のとおりだと思います:

  1. クエリ プランを調べて、問題があるかどうかを確認します。わかりにくい場合は、質問するか、こちらをご覧ください: http://www.mssqltips.com/sqlservertip/1873/how-to-read-sql-server-graphical-query-execution-plans/

  2. sys.dm_db_missing_index_details テーブルでデータベース自体を調べ、不足しているインデックスがあるかどうかを確認し、次の説明に従って提案を評価します: http://www.danielahill.com/Blog/SQL_Server_Find_Add_Missing_Indexes.aspx

  3. SQL Server マシン自体のパフォーマンスを調べます (CPU が少なく、ディスク アクティビティが少ない)。

  4. アプリケーションのパフォーマンスを確認する

クエリのパフォーマンスは、クエリに含まれるデータと、データベースが情報をキャッシュするのがいかに簡単かによって大きく異なると思います。具体的なアドバイスをたくさん与えるのは難しいです。

于 2013-08-24T20:39:37.347 に答える
0

出発点として、次のことを試すことができます。

create index IX_CONTACT_Last_First on CONTACT (LAST_NAME, FIRST_NAME);

おそらく、(完全一致条件と比較して)を使用してもあまりメリットはありませんがlike、テーブルに他の列がかなりある場合は、少なくとも少ないページのデータをスキャンするのに役立つ場合があります。

*一部の列のみが*実際に必要な場合は、を使用しないでください。必要な列を直接指定する必要があります (例: select top (30) ID, LAST_NAME, FIRST_NAME, PHONE, EMAIL from ...)。それらをインデックスに含めることもできます。

create index IX_CONTACT_Last_First on CONTACT (LAST_NAME, FIRST_NAME)
    include (PHONE, EMAIL, ID);

また、よくわかりませんが、where句のいくつかの条件が冗長であるように思われるため、チェックを少なくしてみてください。

SELECT TOP (30) FIRST_NAME, LAST_NAME
FROM CONTACT c 
WHERE ( c.FIRST_NAME + ' ' + c.LAST_NAME LIKE '%#name#%' ) 
    OR ( c.LAST_NAME + ' ' + c.FIRST_NAME LIKE '%#name#%' ) 
ORDER BY LAST_NAME, FIRST_NAME;
于 2013-08-24T23:08:57.147 に答える