0

私は 3,000 万件を超えるレコードを持つテーブルに取り組んでいます。テーブルは sybase にあり、sas に取り組んでいます。レコード エントリのタイム スタンプを含む feed_key(numeric) 変数があります。特定の時間枠のレコードを取得したいと考えていました。

proc sql ;
Connect To Sybase (user="id" pass="password" server=concho);
create table table1 as
select * from connection to sybase
(
select a.feed_key as feed_key,
              a.cm15,
              a.country_cd,
              a.se10,
              convert(char(10),a.se10) as se_num,
              a.trans_dt,
              a.appr_deny_cd,
              a.approval_cd,
              a.amount        
         from abc.xyz a
  where a.country_cd in ('ABC') and a.appr_deny_cd in ('0','1','6') and a.approval_cd not in ('123456') and feed_key > 12862298
);
disconnect from sybase;
quit;

feed_key 条件を設定するかどうかに関係なく、同じ数のレコードを取得しており、クエリの実行にほぼ同じ時間 (feek_key 条件なしで 16 分、feed_key 条件ありで 15 分) を要しています。

この場合のwhere句の働きを明確にしてください。

レコードの 80% 以上がこの条件に一致しないため、feed_key 条件によりクエリの実行がはるかに高速になるはずだったと思います....

4

1 に答える 1

0

同じ数のレコードが返される場合、クエリの処理には同じ時間がかかります。

これは、I/O (データを SAS に転送して格納すること) が操作の中で最も時間のかかる部分であるためです。これが、インデックスの欠如が合計時間に大きな影響を与えない理由です。

返される行数が少なくなるようにクエリを調整すると、処理が速くなります。

これが当てはまる場合は、SAS ログを確認することで、CPU が使用した時間を確認できます (残りは IO です)。

    NOTE: PROCEDURE SQL used (Total process time):
          real time           11.07 seconds
          cpu time            1.67 seconds
于 2013-08-21T14:01:25.233 に答える