2011-12-01 23 views
0

、レポートのデータは、(許容可能である)、約2〜9秒で走るビューとして形をとっています。 1秒未満で、独自の実行にSQLクエリ速度

select * 
from vw_report 
where employee_id in (select id from dbo.fnc_security(@personRanAsID)) 

セキュリティ機能:私はまた、ビューをフィルタリングする必要があるIDのセットを返す機能を持っています。しかし、上記の2つを組み合わせると、クエリに15分以上かかります。

もともと私はそれをロックダウンするかもしれないと思ったので、ビューとセキュリティ機能が仕事のかなり多くを行う、私はセキュリティ機能にはロックを試していないてきたが、それは何の違いを作ったん両方。私は間違って行くこともどこまでとして

任意のヒントやトリック?

それは私が文の一部でに関数の結果をコピーすると、ことは注目に値することがあります

select * 
from vw_report 
where employee_id in (123, 456, 789) 

速度が戻って2〜9秒に増加します。

+0

私たちは、あなたが(オラクル、MySQLの、SQL ServerのはPostgreSQL、SQLiteの...)を使用して、何そのRDBMSのバージョンいるRDBMSかわからない場合はお答えすることは困難です。 SQLの実装は異なります。たとえば、クエリの効率を向上させるために使用できる機能があります。 – Benoit

答えて

0

私は、一時テーブルにセキュリティ機能から結果をダンプし、私のメインのクエリで一時テーブルを使用して終了。最速の方法であることが証明されました。

例えば:

create table #tempTable (id bigint) 

select id 
into #tempTable 
from dbo.fnc_security(@personRanAsID) 

select * 
from vw_report 
where id in (select id from #tempTable) 
0

サブセレクトクエリがvw_reportから行ごとに実行するので、2番目のクエリはないながら、それほど多くの時間を要します。あなたは、のようなものを使用する必要があります

select * 
from vw_report r, (select id from dbo.fnc_security(@personRanAsID)) v 
where r.employee_id = v.id 
2

まず、余分な背景はここに役立ちます...
- ビューおよび関数のコードをお持ちですか?
- 参照されるテーブルに使用されるスキーマとインデックスを指定できますか?これらがなければ

、困難になる助言が、私は刺しを持っているよ...

1)。 IN節をJoinに変更することができます。
2)。ビューでWITH(NOEXPAND)を指定することができます。

SELECT 
    * 
FROM 
    vw_report WITH (NOEXPAND) 
INNER JOIN 
    (select id from dbo.fnc_security(@personRanAsID)) AS security 
    ON security.id = vw_report.employee_id 

注:NOEXPANDを先に試してみます。

他のオプションは、インデックスとビューの製剤の組み合わせが良い実行計画を作成するために、オプティマイザのために非常に懸命にそれを作ることです。私が上に求めた余分な情報で、このを改善することができます。

+0

注:NOEXPAND部分はMS SQL Serverです。他のRDBMSにも同様のオプションがあります。 – MatBailie