SQLの実行パフォーマンスについて 2010


SQL2011

IThttp://el.jibun.atmarkit.co.jp/g1sys/2010/05/post-2d1b.html



SQL

使



SQLSQLCJOINOOC++使 






C++DBMSSQL


10
SQLCJOINDBMS






TABLE_A a
INNER JOIN TABLE_B b
    a.KEY = b.KEY

SQLC++


 
 

SQL


 SQL
CSVSQLJOINSQLSQLJOINC
SELECT Price.CODE, RDATE, OPEN, CLOSE, NAME
FROM Price INNER JOIN Company ON (Price.CODE = Company.CODE)

1 SQLJOIN


 SQL

#include <iostream>
#include <time.h>
#include "../kz_odbc.h"

using namespace std;

int main(void)
{
    kz_odbc db("DSN=Trade",true);
    kz_stmt stmt(&db);

    time_t  t = time(NULL);

    // テーブルからデータの取得
    stmt, "SELECT Price.CODE, RDATE, OPEN, CLOSE, NAME "
          " FROM Price INNER JOIN Company ON (Price.CODE=Company.CODE)"
          , endsql;
    kz_string_array result = stmt.next();
    int             cnt = 0;
    while ( !result.empty() ) {
        cout << result[0] << "," << result[1] << ","
             << result[2] << ","  << result[3] << ","
             << result[4] << "\n";
        result = stmt.next();
        cnt++;
    }

    cerr << "Execute time is " << time(0) - t << "sec." << endl;
    cerr << "Record count is " << cnt << "." << endl;
    return 0;
}

 Wordpress

 
 stmt, "SELECT 
 
 result.empty()
 stmt.next()
 ODBC API
 
Execute time is 131sec.
Record count is 4671568.  
 

 135CSV
CompanyTYPEeq_refJOIN

2 C++JOIN

 

#include <iostream>
#include <time.h>
#include "../kz_odbc.h"

using namespace std;

int main(void)
{
    kz_odbc db("DSN=Trade",true);
    kz_stmt stmt(&db);
    time_t  t = time(NULL);

    // テーブルからデータの取得
    stmt, "SELECT CODE,RDATE,OPEN,CLOSE FROM Price", endsql;

    kz_string_array result = stmt.next();
    int                cnt = 0;
    while ( !result.empty() ) {
        // JOINの実行(ネステッドループ)
        kz_stmt    stmt2(&db);
        stmt2, "SELECT NAME FROM Company WHERE CODE = ? "
             ,  result[0].c_str(), endsql;
        kz_string_array result2 = stmt2.next();

        cout << result[0] << "," << result[1]  << ","
             << result[2] << ","  << result[3] << ","
             << result2[0] << "\n";
        result = stmt.next();
        cnt++;
    }

    cerr << "Execute time is " << time(0) - t << "sec." << endl;
    cerr << "Record count is " << cnt << "." << endl;
    return 0;
}


Execute time is 1714sec.
Record count is 4671568.

 
SQL
12

OOSQL



3 C++JOIN

 JOIN
 
 mapJOIN
 C++Boost使
 map使

#include <iostream>
#include <time.h>
#include "../kz_odbc.h"

using namespace std;

int main(void)
{
    kz_odbc db("DSN=Trade",true);
    kz_stmt stmt(&db);

    time_t  t = time(NULL);

    // マスターの取得・マップの作成
    map< string, string>    company;
    stmt, "SELECT CODE, NAME FROM Company  ",  endsql;
    kz_string_array result = stmt.next();
    while ( !result.empty() ) {
        company.insert( pair< string, string>( result[0], result[1]) );
        result = stmt.next();
    }

    // テーブルからデータの取得
    stmt, "SELECT CODE,RDATE,OPEN,CLOSE FROM Price ", endsql;
    result = stmt.next();
    int                cnt = 0;
    while ( !result.empty() ) {
        cout << result[0] << "," << result[1] << ","
             << result[2] << ","  << result[3] << ","
             << company[ result[0] ] << "\n";
        result = stmt.next();
        cnt++;
    }

    cerr << "Execute time is " << time(0) - t << "sec." << endl;
    cerr << "Record count is " << cnt << "." << endl;
    return 0;
}


 1
Execute time is 108sec.
Record count is 4671568.


 
 
実験1(SQL) 131秒
実験2(C++側でネステッドループ) 1714秒
実験3(C++側でハッシュ) 108秒



 
 SQLJOINC++


SQL

 OO


3%
13





2010-05-31 | コメント:14件
 xeren
 2011-01-03 20:11:05
 IT辿


Where
1

3
Where


2000

JOINRDB
CJava()
RDBI/F()




 
 2011-01-04 15:45:39
 xeren



SQL
31



1SQL3
xeren

Joinwhere2000
 xeren
 2011-01-07 16:16:46
 



 31




 



 1SQL

13


Price


2000
調
1


SQLJOINC++

SQLJOIN""
20541(*(10+8+4+4)byte1GB)

SQLDBC++AP

price20CODE
1000



P.S. 
 
 2011-01-08 02:10:56
 


使DB


31
>

join3
NoSQL使

C++C#31

 
 1SQL


SQL
xeren

Price



DB
33

SQLJOINC++
>SQLJOIN


100032SQLwhere

WHERE [CODE] in (SELECT [CODE] FROM Company WHERE [UNIT] = 1000)


 xeren
 2011-01-10 04:10:28
 

使

join3

13APDBI/F (4671568-1950)*Byte 

25Byte100MB

Company
()

WHERE [CODE] in (SELECT [CODE] FROM Company WHERE [UNIT] = 1000)
SQL
I/F

SQL
2
2



 
 2011-01-10 07:19:23
 xeren


OK



SQL
2

2
使C++ADPADP

3110where



SQL


SQL


xeren

20RDBMS15RDBMS
RDBMS
joinRDBMS


SQL

121

SQL使


2
21SQL


 
 2011-08-10 19:39:13
 






SQLServer
Company.codePrice.codeCompany.code
Company.code


Company

ohfujiより
2011-08-10 20:02:25
コメントありがとうございます。

せっかくコメントいただいたのですが、もう少しちゃんと読んでください。
#というか意図的にやっているのでしょうか?

>そもそも論として全件と全件というレアな結合で

コメント欄に答えが書いてありますよ。

で、改めて質問しますが、

『SQLはオブジェクト指向言語の数十倍の効率』

という考えは変わりませんか?
先の記事ではニュアンスが変わっていますよね。
 
 2011-08-11 00:43:40
 RDBMS










SQLRDBMS
使



 
 2011-08-11 09:10:30
 



SQL

xeren



SQLRDBMS使
RDBMS使使





SQL

おおふじより
2011-08-11 09:16:49
おお、追加で記事を書かれていますね。

記事の内容的には面倒くさいのでコメントしませんが、
『SQLはオブジェクト指向言語の数十倍の効率』
という話は出てきていないようですので、これについては不正確であるとお認めになったと受け取ります。
 
 2011-08-11 12:29:48
 http://d.hatena.ne.jp/Sikushima/20110809/1312871002


@IT
http://el.jibun.atmarkit.co.jp/g1sys/2010/05/post-2d1b.html

SQL
@ITJOINJOIN

1
JOINAP ORDER BY SQLRDBMS使 SQLAPDB 

JOINSQL
http://www.ohfuji.name/?p=813













http://www.ohfuji.name/?p=1462 






xeren
SQLJOINJOINAP

komaruより
2011-12-15 00:30:01
1000秒が100秒になろうが、どちらも使い物にならないと思うのですが。
ohfujiより
2012-02-24 11:32:09
スパムの整理をしていましたら発見しました。
スパムとマークされていたのですが、せっかくなので承認済みにします。

コメントの趣旨がわかりませんが、そもそもベンチマークテストなので、テストの差が出やすいように大量の行数を処理していますしマシンのパフォーマンスもあまり良くありません。
従いまして、時間の絶対的な数値にはあまり意味がないのですが?

コメントをどうぞ


『不適切なコメントへの対応』を一読下さい。
現在コメントは承認制となっております。

Previous Page | Next Page