ビューを介して結合しようとしている2つのメインテーブルを持つSQL Azureデータベースがあります。私はそれが働いているが、実行時間は2分を超えています。ここで 日付間のSQLクエリと従業員名に基づく
は私が扱ってるメインテーブルと列です:TransactionsTable:
PostedDate | EmployeeFirstName | EmployeeLastName | DollarsCollected | UserName
---------------------------------------------------------------------------------------------
09/08/2017 09:05 am | 'John' | 'Smith' | 42.25 | 'john.smith'
09/08/2017 09:07 am | 'Jane' | 'Jones' | 58.50 | 'jane.jones'
09/08/2017 09:15 am | 'Tom' | 'Holland' | 62.75 | 'tom.holland'
09/08/2017 09:17 am | 'John' | 'Smith' | 48.50 | 'john.smith'
09/08/2017 09:19 am | 'Jane' | 'Jones' | 32.25 | 'jane.jones'
CustomerHistory
CustomerID | StartDate | Duration | UserName | TransactionType
-----------------------------------------------------------------------------
1 | 09/08/2017 09:02 am | 600 | 'john.smit'h | 'PropertyTax'
2 | 09/08/2017 09:03 am | 500 | 'tom.holland' | 'TagRenewal'
3 | 09/08/2017 09:04 am | 450 | 'jane.jones' | 'PropertyTax'
4 | 09/08/2017 09:12 am | 700 | 'john.smith' | 'TagRenewal'
5 | 09/08/2017 09:16 am | 300 | 'jane.jones' | 'TagRenewal'
ので、契約はここにある - 唯一の従業員を持つことができます一度に1つの顧客。トランザクションがいつ投稿されたか分かっており、従業員が投稿した内容が分かっている場合は、StartDate
およびを使用して、そのトランザクションの総計の一種としてCustomerHistoryテーブルにその情報を接続できる必要があります。はEndDate
と等しいとみなしてください。だから、ここで私はこれを実現するために実行しようとしているクエリです:参考
SELECT
*
FROM
CustomerHistory
JOIN TransactionsTable ON
CustomerHistory.UserName = TransactionsTable.UserName
AND
TransactionsTable.PostedDate >= CustomerHistory.StartDate
AND
TransactionsTable.PostedDate <= DATEADD(ss, CustomerHistory.StartDate, CustomerHistory.Duration)
は、私がUserName
フィールド上のインデックスと同様に日付フィールドを持っています。私が参加したいと思っている各テーブルからさらに多くのデータの列があるので、私はここで私のテーブルを単純化していると言えば十分です。私はSQL Serverで実行計画を実行しました。ハッシュマッチは実行時間の約38%を要し、トランザクションテーブルのテーブルスキャンは42%かかります。私はSQLでまともですが、私がここで扱っているものほどリソース集中的なクエリを掘り下げたことは一度もありませんし、サーバをこのように実行しようとするとかなりの負担をかけることになります。
誰でも手助けできますか?
です。私は、名前、姓、およびユーザー名のフィールドを持つUsersという3番目のテーブルに参加することができます。これを実行しても、このクエリではまだ2〜3分で実行されています。 この目的のために、両方のテーブルにUserNameフィールドがあると仮定します。私はこれを反映するために私の最初の質問を編集します。 – Shane
'UserNameフィールドと日付フィールドにインデックスがあります.'日付インデックスの' Duration'カラムを 'INCLUDE'と見なすと、SQL Serverはそのインデックスを使って' StartDate 'と' Duration'は同じインデックスからです –
テーブルとビューはどちらですか?あなたの質問は言いません。 – Dai