2016-12-14 9 views
0

SQL Serverで問題の解決方法がわかりません。私は単一のフルテキスト検索列を持つ大きな製品テーブル(25mレコード)を持っています。次のクエリを実行カウントを追加するとSQL Serverのパフォーマンスが遅くなる

を約1秒

CHECKPOINT; 
GO 

DBCC DROPCLEANBUFFERS; 
GO 

SELECT TOP 15 
    [ProductID], [EAN], [BrandID], [ShopID], 
    [CategoryID], [DeliveryID], [ProductPrice], 
    [ShippingCosts] 
    -- ,count(ProductID) over() 
FROM 
    product WITH (nolock) 
WHERE 
    CONTAINS(Search, 'Samsung AND Galaxy') 

私はなどサブクエリと異なる解決策を試してみましたレコードの合計を知ることがかかりますが、count(ProductID) over()を追加することは良い解決策になるはずです。

クエリに合計カウント部分を追加すると、クエリが非常に遅くなります。今は約1m30かかります。 containsの代わりにcontainstableに変更するか、freetextを使用しても違いはありません。

実行計画が含まれています。いくつかの奇妙な値があります(テーブルスプール868%)

しかし、フルテキストインデックスの再作成と統計の再構築では違いはありません。

カウントを高速化する方法を知っている人はいますか?

Execution plan

+0

ここでは非常に注意してください。あなたはNOLOCKを使用しており、パフォーマンスを求めているようです。そのヒントはパフォーマンスツールではありません。ほとんどの人が気付かない非常に重い荷物を運びます。それは、欠けている行や重複している行を、他の厄介なものとともに返すことができます。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/あなたが本当にそのヒントが必要であることが実証されていない限り(そしてその根拠を明確に説明することができます)、それを避けるのが最善の方法です。 –

+0

懸念をありがとう。私はそれが最も好きなオプションではないことを知っています。しかし、更新プロセス(6 - 8時間かかる)は、テーブルを長い間無視するようにロックしています。 一括インポートテーブルからバッジ250kのssisパッケージのテーブルを更新します。 insert en updateクエリは製品テーブルをロックアップします。 更新後にテーブルとスイッチを複製する前に、私の最後の手段です。 私は他のオプションを検討します。常により良い解決策があるので。 – lbeuker

答えて

0

それはテーブル全体を評価し、あなたの数を与えることがあるので、カウントして、長い時間を割いています。プランは、あなたの上位15人のうちの1人を見つけて、数えてテーブルを覗いてから、繰り返すように見えます。カウントがなければ、基準を満たした後でテーブルからトップ15を見るだけです。

これは、集計機能を使用しない場合の選択よりも高速ですが、まだ遅い場合があります。

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO 

;WITH cte AS (
select 
     [ProductID] 
     ,[EAN] 
     ,[BrandID] 
     ,[ShopID] 
     ,[CategoryID] 
     ,[DeliveryID] 
     ,[ProductPrice] 
     ,[ShippingCosts] 
     from product with (nolock) 
    where 
    contains(Search,'Samsung AND Galaxy')) 

select top 15 
     [ProductID] 
     ,[EAN] 
     ,[BrandID] 
     ,[ShopID] 
     ,[CategoryID] 
     ,[DeliveryID] 
     ,ProductPrice 
     ,ShippingCosts 
     ,count(ProductID) over() 
     FROM cte 
+0

いつものように根本的な問題があります。 このクエリは、バルクがバックグラウンドで読み込まれたときに最初のデータを表示するという考えでした。 私はすべてのデータが必要です(私はフィルタなどのための参照データを参照することができます)しかし、私は、最初にページングと負荷フィルタを使用していくつかの項目を提示することを考えていた。 このクエリは、すべてのデータを取得してWebサーバー上にキャッシュする、より大きなストアドプロシージャのベースです。 私は100000以上のアイテムを返すことはちょうど多くのことに賛成です。描画ボードに戻ることができます:) – lbeuker

+0

私は、全文索引が何かを数えればもっと早くなると思ったと思います。 – lbeuker

関連する問題