1

から来る2つの値を合計することは可能COUNT(DISTINCT [something]) ですか? 4 億近くのレコードを含むテーブルがあります。このテーブルは、ユーザーの訪問に基づいて増加します。現在COUNT(DISTINCT [SpecialUser])、通常のクエリに基づいて取得したいと考えています。クエリの回答には約 5 ~ 6 分かかります。今、私は次のことが可能かどうか考えていました:

昨日の からの回答を保存しCOUNT(DISTINCT [SpecialUser])、名前を付けてtotalから、今日の結果と合計して、クエリの速度を上げますか? Distinct のため、通常の方法では不可能であることはわかっていますが、別の解決策はありますか?

参考までに、完全なクエリを次に示します。

DECLARE @Total_User int 

SELECT @Total_User = COUNT(DISTINCT [SpecialUser]) 
FROM [dbo].[Visit] AS V 
WHERE 
  LEN([SpecialUser]) > 1 

UPDATE [dbo].[Stat] 
SET Total_User=@Total_User 
WHERE ID = 1;
4

2 に答える 2

1

明らかに、問題はデータベース スキーマ/テーブル構造にあります。

ユーザーがアクセスするたびに、新しいレコードがテーブルに追加されると思います。ただし、個別のフィールドをすべて取得する必要がありSpecialUserます。これは、テーブルにあるものとは異なる種類の情報です。

解決策は、その情報を別のテーブルに書き込むことです (または、既に持っているテーブルを使用します)。そのテーブルには、一意のキーを持つ個別の値が既に含まれているはずです

ただし、...何かの理由でこれが現在不可能な場合、私が今覚えている最善の解決策(および悪名高いvarchar-indexを回避する解決策)は、テーブルに計算列を追加し、永続化し、インデックスを付けて使用することですあなたのクエリでそれ。

次のようになります。

IsSpecialUser = CASE WHEN LEN([SpecialUser]) > 1 THEN 1 ELSE 0 END

完全な DDL:

ALTER TABLE dbo.Visit 
ADD IsSpecialUser AS (CASE WHEN LEN([SpecialUser]) > 1 THEN 1 ELSE 0 END) PERSISTED
GO

その後、 にインデックスを作成しますdbo.Visit.IsSpecialUser。クエリは次のようになります。

SELECT @Total_User = COUNT(DISTINCT [SpecialUser]) 
FROM [dbo].[Visit] AS V 
WHERE IsSpecialUser = 1
于 2013-08-11T08:30:35.733 に答える
0

日ごとに異なるテーブルに値を格納します。そうしないと、あなたが言ったのとほぼ同じ時間がかかります。

少しは最適化されているかもしれませんが、5 ~ 6 分からあまり低下することはありません。それよりも速いものが必要だと思います。データベースに数値を格納することに慣れていない場合は、クエリ キャッシュなどを使用してみてください。

結論:SQL組み込み関数を高速化することはできません。

それが役立つことを願っています:)

于 2013-08-11T07:01:17.577 に答える