処理時間と汎用性


1000ループで
MyTIME=00:00:00:343
TIME=00:00:00:433

10000ループで
MyTIME=00:00:01:983
TIME=00:00:05:240

汎用的な(いくつもの条件を判別する必要がある)APIを使用する場合は利便性と速度のバランスを検討しないと駄目な事を理解すべき。
レコード数や状況に応じて適用すべき手法は変わる。

CREATE FUNCTION myDist 
 (@x1 FLOAT,
  @y1 FLOAT,
  @x2 FLOAT,
  @y2 FLOAT)
RETURNS FLOAT
AS
BEGIN
  
  RETURN SQRT(SQUARE(@x2-@x1) + SQUARE(@y2-@y1))
END

GO

DECLARE @x1 AS FLOAT = 2;
DECLARE @y1 AS FLOAT = 1;
DECLARE @x2 AS FLOAT = 5;
DECLARE @y2 AS FLOAT = 7;

SELECT dbo.myDist(@x1,@y1,@x2,@y2);
SELECT GEOMETRY::Point(@x1,@y1,0).STDistance(GEOMETRY::Point(@x2,@y2,0));

DECLARE @loop INT = 1000;

--一時テーブルの作成
CREATE TABLE #DIST ( dists REAL )

SET NOCOUNT ON
DECLARE @Counter INT = 1

--時間計測開始
DECLARE @START_TIME datetime = GETDATE()

WHILE @Counter < @loop
BEGIN
 INSERT INTO #DIST (dists) VALUES (dbo.myDist(@x1,@y1,@x2,@y2));
 SET @Counter = @Counter + 1
END

SELECT * FROM #DIST;

--時間計測終了
PRINT 'MyTIME=' + CONVERT(VARCHAR, GETDATE()-@START_TIME,114) 

TRUNCATE TABLE #DIST;

SET @Counter = 1
--時間計測開始
SET @START_TIME = GETDATE()

WHILE @Counter < @loop
BEGIN
 INSERT INTO #DIST (dists) VALUES (
   GEOMETRY::Point(@x1,@y1,0).STDistance(GEOMETRY::Point(@x2,@y2,0))
 );
 SET @Counter = @Counter + 1
END

SELECT * FROM #DIST;

--時間計測終了
PRINT 'TIME=' + CONVERT(VARCHAR, GETDATE()-@START_TIME,114) 


GO

DROP FUNCTION myDist;
GO

DROP TABLE #DIST;
GO
カテゴリー: 開発, 設計 タグ: パーマリンク