2016-09-22 20 views
1

SQL Server 2005に6588395レコードの顧客テーブルがあり、作成日に基づいて顧客テーブルからレコードを取得する必要があります。 作成日にクラスタ化インデックスを作成しました。リンクされたサーバーを介して、このテーブルからレコードを取得しています。私が使用している クエリは、このクエリは、レコードを取得するために30分を取っているSQLクエリ実行が遅い

@StartDate=N'01 Jan 2016',@EndDate=N'31 Mar 2016' 

select 
    firstname, 
    lastname, 
    Address, 
    Addrss1, 
    city  
from 
    [ABC\SQCENTRE].[Reports].[dbo].[tbl_Customer] 
where  
    creation_date BETWEEN @startdate AND @EndDate 

です。クエリを最適化する方法を教えてください。

私もopenqueryを試しましたが、それはまた何の違いもありません。 Creation_dateは日時フィールドです

ヘルプをいただければ幸いです。

+2

クエリが他のサーバー上で直接実行される速度はどれくらいですか?本当に日付をnvarcharとして保存しますか? – swe

+0

@swe creationdateはdatetimeフィールドです – user1554650

+0

With(NOLOCK)を使用してみてください –

答えて

1

CREATEDATEは日時がvarchar型datetime値にあなたのVARSにないように設定されているのであれば...

declare @Startdate datetime; @Startdate = convert(datetime, 'mydate')

SQLServerのは、あなたの比較値をテーブルの値を比較します。だから私は彼がdatetimeにあなたのsearchvalueをキャストするか、比較するために700万datetimesをvarcharにキャストするか分からない。だから、なぜ私は明示的にdatetimeに私の検索式をキャストEXPLICIT確かに、サーバーは、700万の日付の値をvarcharにキャストしません。

RAMまたはtempdbの7百万回のキャストは、openquery(where-clauseのローカル評価が確実に30分必要)を説明することができます。 実行計画があれば、これは簡単に言えます。

+0

SQL Serverはこれを自動的に行うべきではありませんか? – qxg

+0

@qxg WHYを示すために私の答えを更新しました。 – swe

関連する問題