0

私は巨大なストアプロシージャを持っています。これのほんの一部を貼り付けます。

私のクエリ:

--declare variable and Select Statement goes here
WHERE  ((v.[RoleID] IN (
         SELECT [dbo].[aspnet_UsersInRoles].roleid 
         FROM [dbo].[aspnet_UsersInRoles] 
         INNER JOIN [dbo].[aspnet_Users] 
           ON [dbo].[aspnet_Users].userid = [dbo].[aspnet_UsersInRoles].userid 
         WHERE 
           [dbo].[aspnet_Users].username = @UserName 
         UNION ALL 
         SELECT [RoleId] 
         FROM   dbo.aspnet_roles 
         WHERE loweredrolename = 'anonymous user') 
OR v.username = @UserName)) 

クエリは完璧に機能しますが、実行に時間がかかります。状態 内WHERE状態有り 状態 かなりありますIN。内部のサブクエリは時間がかかると思いますININこのクエリを最適化し、条件内を置き換える方法はありますかWHERE。または、このタイプのクエリを最適化する別の方法を提案してください。ありがとう。

4

3 に答える 3

1

内部サブクエリの出力は常に同じなので。それを外に出して、それらの値を以下のような一時テーブルに挿入すると、一時テーブルにクエリを実行できます。したがって、同じことを実行するループに入らないたびに

  `create table #temp(roleid int); `

  ` insert into #temp as (sSELECT [dbo].[aspnet_UsersInRoles].roleid 
     FROM [dbo].[aspnet_UsersInRoles] 
     INNER JOIN [dbo].[aspnet_Users] 
       ON [dbo].[aspnet_Users].userid = [dbo].[aspnet_UsersInRoles].userid 
     WHERE 
       [dbo].[aspnet_Users].username = @UserName 
     UNION ALL 
     SELECT [RoleId] 
     FROM   dbo.aspnet_roles 
     WHERE loweredrolename = 'anonymous user');`

    WHERE  ((v.[RoleID] IN ( select roleid from #temp);
于 2013-01-17T06:04:33.593 に答える
0

IN句の結果を使用して一時テーブルを作成し、それに結合することができます。これにより、問題は2つのはるかに単純なタスクに分割されます。

于 2013-01-17T05:44:44.877 に答える
-2

Orangecrushの推奨によると

--declare variable and Select Statement goes here
WHERE  EXISTS (
         SELECT 1
         FROM [dbo].[aspnet_UsersInRoles] 
         INNER JOIN [dbo].[aspnet_Users] 
           ON [dbo].[aspnet_Users].userid = [dbo].[aspnet_UsersInRoles].userid 
         WHERE 
           [dbo].[aspnet_Users].username = @UserName 
             AND [dbo].[aspnet_UsersInRoles].roleid = v.[RoleID]
         UNION ALL 
         SELECT 1
         FROM   dbo.aspnet_roles 
         WHERE loweredrolename = 'anonymous user'
           AND dbo.aspnet_roles.roleid = v.[RoleID])
OR v.username = @UserName)
于 2013-01-17T07:56:46.547 に答える