2016-04-18 10 views
0

大きなサイズのテーブルをクエリするための最速の結果を得る方法をアドバイスする必要があります。 私はSQL Server 2012を使用しています。私の条件は次のようなものです。大きなサイズのテーブルでクエリを実行するための最速の実行時間

私は5つのテーブルにトランザクションレコードが含まれており、各テーブルには3500万のレコードがあります。 すべてのテーブルには14の列があり、検索する必要がある列はGroupName、CustomerName、およびNoRegistrationです。私はこれらのテーブルのうち5つを含むビューを持っています。 GroupName、CustomerName、およびNoRegistrationレコードは、各テーブルで一意ではありません。

私のアプリケーションには、これらの列を検索する機能があります。私の質問はどのようにすることができますです

SELECT DISTINCT(NoRegistration) FROM TransactionRecords_view WHERE LOWER(NoRegistration) LIKE LOWER(@NoRegistration)+'%' 

:グループ名によって

検索:

SELECT DISTINCT(GroupName) FROM TransactionRecords_view WHERE GroupName LIKE ''[email protected]+'%' 

名で検索:

SELECT DISTINCT(CustomerName) AS 'CustomerName' FROM TransactionRecords_view WHERE CustomerName LIKE ''[email protected]+'%' 

NoRegistrationで検索 クエリは、このようなものです私は検索のための最も速い実行時間を達成する? 私の状況では、私が検索するたびに、3〜5分かかりました。

私の考えは、新しいテーブルにGroupName、CustomerName、およびNoRegistrationの異なる5つのテーブルすべてが含まれるようにすることです。

私の考えは、実行時間が短縮されることですか?または他のアイデア?あなたがTransactionRecords_viewのSQLを示さなければならない

これは、ビューのクエリである "TransactionRecords_view"

CREATE VIEW TransactionRecords_view 
AS 
SELECT * FROM TransactionRecords_1507 
UNION ALL 
SELECT * FROM TransactionRecords_1506 
UNION ALL 
SELECT * FROM TransactionRecords_1505 
UNION ALL 
SELECT * FROM TransactionRecords_1504 
UNION ALL 
SELECT * FROM TransactionRecords_1503 
+0

ので、列がタイプインされている文字列? GroupName 'NewGroup'で新しいトランザクションを入力することができます。数年前にそのトランザクションを使用したことがあった場合、新しいトランザクションは同じグループ内で同時に発生しますか?しかし、「NewGrooup」のようなタイプミスがあると、偶然にそれ自身のグループですか?私はむしろ、そのレコードを参照するトランザクションを持つGroupNameテーブルを期待しています。 –

+0

'SELECT * ... UNION ALL'?あなたの5つのテーブルはすべて同じように構造化されていますか?なぜあなたは5つのテーブルを持っていますか?それははるかに良いだろうか? –

+0

@ThorstenKettnerは毎月取引記録であるためです。私のアプリの別の機能は、毎月、先月、昨年のトランザクションを計算するので、毎月分けてパフォーマンスを向上させると思った。 – user1008497

答えて

1

これらの新しいテーブルを作成する必要はありません。これらのフィールドに基づいてクラスタ化されていないインデックスを作成すると、その結果として実際に実行されます。インデックスは、テーブル全体ではなく、指定したカラムにのみデータを格納します。ただし、索引はSELECT文をサポートするのに優れていますが、書込み文(INSERT、UPDATEなど)には悪影響を与えます。

次に、実際の実行計画をオンにしてクエリを実行します。これは、オプティマイザが(バックエンドで)各クエリを実行する方法を示します。ここで何か特別な問題はありますか?オペレータのコストがかなりかかっていますか?あなたはexe計画を前に見​​ていない場合は、それらを確認し、YouTubeで実行計画についての素晴らしい教訓のビデオがたくさんあります。

+1

ありがとうございます。実際の実行時間を使用してクエリを実行し、2つのインデックスがありません。 – user1008497

3


EDITありがとうございました。インデックスはありますか? NoRegistration列の照合は何ですか?クエリごとに実際の実行計画を貼り付けます。

+1

は**回答**または**コメント**です。 –

+0

私はすでに各テーブルにインデックスを作成していますが、それは私のアプリでは別の重要な機能のためだけです。この関数の索引付けは忘れてください。実際の実行計画を使用し、2つの索引が欠落しています。ありがとうございました – user1008497

+0

@NeerajPrasadSharmaこれは自己によって検討する答えがあるコメントです –

0

実際の実行計画にインデックスがないかどうかを確認しようとしましたか?

さらに、varcharの節を使用すると、フルテキスト検索について聞いたことがあります。多分それはあなたのために役立つことができます:

https://msdn.microsoft.com/en-us/library/ms142571(v=sql.120).aspx

+0

フルテキスト検索は良いようですが、フルテキストインデックスを作成する必要があり、フルテキストインデックスにはプライマリユニークキーが必要であり、テーブルには一意のキーがありません。ありがとうございました – user1008497

関連する問題