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%)
しかし、フルテキストインデックスの再作成と統計の再構築では違いはありません。
カウントを高速化する方法を知っている人はいますか?
ここでは非常に注意してください。あなたはNOLOCKを使用しており、パフォーマンスを求めているようです。そのヒントはパフォーマンスツールではありません。ほとんどの人が気付かない非常に重い荷物を運びます。それは、欠けている行や重複している行を、他の厄介なものとともに返すことができます。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/あなたが本当にそのヒントが必要であることが実証されていない限り(そしてその根拠を明確に説明することができます)、それを避けるのが最善の方法です。 –
懸念をありがとう。私はそれが最も好きなオプションではないことを知っています。しかし、更新プロセス(6 - 8時間かかる)は、テーブルを長い間無視するようにロックしています。 一括インポートテーブルからバッジ250kのssisパッケージのテーブルを更新します。 insert en updateクエリは製品テーブルをロックアップします。 更新後にテーブルとスイッチを複製する前に、私の最後の手段です。 私は他のオプションを検討します。常により良い解決策があるので。 – lbeuker