2

オッズ比の 2x2 テーブルを作成するストアド プロシージャがあります。基本的なオッズ比表は次のようになります。 ここに画像の説明を入力

編集- このクエリは最終的に終了し、2 分後に関数を 32 回呼び出した後、正しい回答が返されました。なぜこれが再帰的に実行されているのかわかりません。アイデアはありますか?

A - only records that satisfy both thing 1 and thing 2 go here
B - only records that satisfy thing 1 (people with thing 2 CANNOT go here)
C - only records that satisfy thing 2 (people with thing 1 CANNOT go here)
D - people with thing 1 OR thing 2 cannot go here

テーブル内のすべてのセルは、人口を表す整数になります。

私はいくつかの新しい構文を学ぼうとしていたので、intersectandを使用することにしexceptました。thing 1およびthing 2s 変数を作成したかったので、以下のクエリをストアド プロシージャに入れました。

CREATE PROC Findoddsratio (@diag1 NVARCHAR(5), 
                           @diag2 NVARCHAR(5)) 
AS 
    IF Object_id('tempdb..#temp') IS NOT NULL 
      DROP TABLE #temp 

    CREATE TABLE #temp 
      ( 
         squarenumber CHAR(1), 
         counts       FLOAT 
      ) 

    INSERT INTO #temp 
                (squarenumber, 
                 counts) 
    SELECT * 
    FROM   ( 
           --both + 
           SELECT 'a'                                    AS squareNumber, 
                  Cast(Count(DISTINCT x.counts)AS FLOAT) AS counts 
           FROM   (SELECT DISTINCT ic.patid AS counts 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE @diag1 
                   INTERSECT 
                   SELECT DISTINCT ic.patid AS counts 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE @diag2)x 
           UNION 
           --only 1+ 
           SELECT 'b', 
                  Count(DISTINCT x.counts) 
           FROM   (SELECT DISTINCT ic.patid AS counts 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE @diag1 
                   EXCEPT 
                   SELECT DISTINCT ic.patid AS counts 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE @diag2)AS x 
           UNION 
           --only 2+ 
           SELECT 'c', 
                  Count(DISTINCT x.counts) 
           FROM   (SELECT DISTINCT ic.patid AS counts 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE @diag2 
                   EXCEPT 
                   SELECT DISTINCT ic.patid AS counts 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE @diag1)AS x 
            UNION 
            --both - 
            SELECT 'd', 
                   Count(DISTINCT x.counts) 
            FROM   (SELECT DISTINCT ic.patid AS counts 
                    FROM   icdclm AS ic 
                    EXCEPT 
                    SELECT DISTINCT ic.patid AS counts 
                    FROM   icdclm AS ic 
                    WHERE  ic.icd LIKE @diag2 
                    EXCEPT 
                    SELECT DISTINCT ic.patid AS counts 
                    FROM   icdclm AS ic 
                    WHERE  ic.icd LIKE @diag1) AS x)y 

    --i used a pivot table to make the math work out easier 
    SELECT Round(Cast(( a * d ) / ( b * c ) AS FLOAT), 2) AS OddsRatio 
    FROM   (SELECT [a], 
                   [b], 
                   [c], 
                   [d] 
            FROM   (SELECT [squarenumber], 
                           [counts] 
                    FROM   #temp) p 
                   PIVOT ( Sum(counts) 
                         FOR [squarenumber] IN ([a], 
                                                [b], 
                                                [c], 
                                                [d]) ) AS pvt)t 

ICDCLMのような構造を持つテーブルですpatid=int, icd=varchar(5)

には ~ 100 万行ありICDCLMます。ストアド プロシージャにせずにこのクエリを実行すると、数秒で実行されます。私がしようとするとexec FindsOddsRation 'thing1%','thing2%'。実行され実行されますが、何も返されません (> 2 分)。ストアド プロシージャに非常に時間がかかることの違いは何でしょうか? ここでSQL Server 2008 R2 フィドル

4

1 に答える 1

5

ストアド プロシージャとまったく同じ SQL を実行していて、時間がそれほど異なる場合は、ストアド プロシージャが古いメタデータに依存している可能性があります。統計を更新するか、ストアド プロシージャを再コンパイルしてください。

于 2012-12-06T20:05:55.353 に答える