发布新帖

Encontrar

讨论 (0)1
登录或注册以继续
文章
· 八月 30, 2021 阅读大约需 2 分钟

クエリをチューニングする方法

これは InterSystems FAQ サイトの記事です。

InterSystems 製品には、テーブルのコンテンツに関する統計を収集し、クエリの最適化に役立てる「テーブルチューニング機能」があります。

設定方法は、以下のドキュメントをご参照ください。

ターミナルでは次のコマンドを実行します。

do $SYSTEM.SQL.Stats.Table.GatherTableStats("スキーマ名.テーブル名")

 

 2021.1以前のバージョンでは以下メソッドを利用します。

Do $system.SQL.TuneTable("スキーマ名.テーブル名",1,1)

 

また、以下の資料もご参照ください。

1) パフォーマンス調査の基礎知識として必要なグローバル構造の解説やSQLの動作の仕組みからクエリプランの見方の解説

インターシステムズ・シンポジア2011の資料

2) パフォーマンスチューニングの例(P13~)

インターシステムズ・シンポジア2012の資料

3) ビットマップ・インデックスの圧縮やオプティマイザ・ヒントなど、Caché SQLのパフォーマンスを最大限に引き出すための情報について

インターシステムズ・シンポジア2014の資料

4) パフォーマンスに困ったときにどこに着目し、どのツールで調べていくか、お客様から日々ご相談をいただくカスタマーサポートから、解決に向かうアプローチの「イロハ」をご紹介するビデオ

動画:Performance 101

5) 開発者コミュティのパフォーマンス関連情報(performanceタグ)

performanceタグ

 

関連する以下記事、FAQトピックも併せてご参照ください。

讨论 (0)1
登录或注册以继续
文章
· 八月 23, 2021 阅读大约需 4 分钟

データベースファイルのサイズを圧縮する方法

これは InterSystems FAQ サイトの記事です。

※データベースファイルとは、IRIS.DAT、および、CACHE.DATのことを指します。

Caché/Ensemble 2018.1.4、IRIS 2019.1.2/2020.1.0 以降のバージョンより、データベースファイル のサイズの縮小に、データベースの「圧縮」と「未使用領域の削除」機能をあわせて使用できます。

※注意※
Caché/Ensemble 2018.1.4、IRIS 2019.1.2/2020.1.0 より前のバージョンでは、データベースの「圧縮」機能は使用できません。使用された場合、データベース破損が引き起こされる可能性があります(「未使用領域の削除」機能は利用できます)。

詳細情報は以下、弊社ウェブサイト内のページをご確認ください。

製品ニュースとアラート>警告: データベース圧縮またはデフラグ後のデータベース整合性の問題

 

データベースサイズ縮小手順は以下の通りです。

管理ポータル: [システムオペレーション] > [データベース] を開き、操作したいデータベース名をクリックします。

(または、画面左上の[空き容量]ボタンをクリックし、データベースの空き容量を表示します。)

 

① 「圧縮」ボタンにより、データベースファイルの使用していないブロックを後ろに集めます

<圧縮のイメージ> ●が使用中ブロック、〇が未使用ブロックだとします。

●●○●●○○●○○ ←のようにブロックが並んでいるデータベースファイル(*.DAT)を「圧縮」すると

●●●●●○○○○○ ←このようになります (左が前方)

 

②「未使用領域削除」ボタンにより、後方に集めた未使用ブロックを削除してデータベースファイルのサイズを縮小します。

<未使用領域削除のイメージ> ●が使用中ブロック、〇が未使用ブロックだとします。

●●●●●○○○○○ ←のようにブロックが並んでいるデータベースファイルに「未使用領域削除」を実行すると

●●●●●  ←このようになります

 

圧縮について詳細は、ドキュメント(データベースの圧縮(IRIS))をご参照ください(2018.1以前のドキュメント:データベースの圧縮)。

 

管理ポータルの操作と同様の処理を、^DATABASE ユーティリティを使用して実行することもできます。

%SYS ネームスペースに移動してから実行します。

USER>zn "%SYS"
 
%SYS>do ^DATABASE
 
 
 1) Create a database
 2) Edit a database
 3) List databases
 4) Delete a database
 5) Mount a database
 6) Dismount a database
 7) Compact globals in a database
 8) Show free space for a database
 9) Show details for a database
10) Recreate a database
11) Manage database encryption
12) Return unused space for a database    // 「未使用領域削除」
13) Compact free space in a database      // 「圧縮」
14) Defragment a database         // 「DB の断片化解消」
15) Show background database tasks
 
Option?

※「圧縮」 = 13) Compact freespace in a database
 「未使用領域削除」= 12) Return unused space for a database

 

^DATABASE ユーティリティの 14) Defragment globals in a database(「DBの断片化解消」)について補足します。

「DBの断片化解消」では、指定したデータベースファイル内のグローバル毎にブロックが再編成され、データベースファイル内で連続領域に再配置します。

「圧縮」をより強力にしたものですが、この再配置を行う為には、データベースファイル末尾に十分な空きブロックが必要です(一般的に見て、デフラグを定期的に実行する必要はありません)。

<「DBの断片化解消」のイメージ>

^a ♦  ^b  ^c♥ 空き○

断片化解消前
♦♦♠♠♠♠♦♦♥♥♥♦♦♥♥○○○○○○

断片化解消後
♦♦♦♦♦♦♦♠♠♠♠♠♥♥♥♥♥○○○○○○○○○

 

※注意※
「断片化解消」機能についても、2015.1.3、2015.2.2 より前のバージョンでは使用できません。使用された場合、「圧縮」機能と同様に、データベース破損が引き起こされる可能性があります。

詳細は、ドキュメント(データベースのグローバルのデフラグ(IRIS))をご参照ください(2018.1以前のドキュメント:データベースのグローバルのデフラグ)。

讨论 (0)1
登录或注册以继续
公告
· 七月 27, 2021

New Podcast: The InterSystems Kubernetes Operator

Episode 20 of Data Points features a conversation with Bob Kuszewski about the Kubernetes and the InterSystems Kubernetes Operator (IKO). Take a listen to hear about some of the use cases and features of IKO, plus how it compares to InterSystems Cloud Manager (ICM) within the cloud space.

For all episodes of Data Points and to subscribe on your favorite app, check out https://datapoints.intersystems.com

讨论 (0)1
登录或注册以继续
文章
· 七月 22, 2021 阅读大约需 6 分钟

FAQ 常见问题系列--Java 从IRIS数据库中读取Stream数据性能优化-Prefetch方式介绍

提示:本文包含在Java中通过JDBC Driver对Caché/IRIS数据库进行查询的示例代码。

近期有客户反应使用Java从老版本Caché中读取数据时,如果数据中包含long varchar, Caché数据库中与之对应的属性类型为%Stream.GlobalCharacter,即使实际上该流数据长度非常小,也会成十几倍的降低性能。

大家先来看一段代码, 

public static void test99()
    {
        Statement stmt = null;
        ResultSet rs = null;
        
        int fetchSize = 100000;
        long before = System.currentTimeMillis();
        String sql="Select Title, Notes from My.Employee Where id=1";
        try {

            CacheDataSource ds = new CacheDataSource();
            
            ds.setURL("jdbc:Cache://123.123.123.1:1972/Samples");            //访问Caché数据库
            ds.setUser("_SYSTEM");
            ds.setPassword("SYS");
            Connection connection = ds.getConnection();
            connection.setAutoCommit(false);
            stmt = connection.createStatement();
            rs = stmt.executeQuery(sql);
            long executed = System.currentTimeMillis();
            System.out.println("execute take miliseconds of:"+(executed-before));
            ResultSetMetaData rsmd = rs.getMetaData();
            int colnum = rsmd.getColumnCount();
            String str = null;
            while (rs.next()) {
                for (int i = 1,ilen = colnum; i <= ilen; i++) {
                str = rs.getString(i);
                }
            }
          stmt.close();
          rs.close();
            connection.close();
            long end = System.currentTimeMillis();
            System.out.println("read take miliseconds of:"+(end - executed));
            System.out.print("total take miliseconds of:"+(end-before));
        }catch (Exception ex) {
              System.out.println("TinyJDBC caught exception: " 
                   + ex.getClass().getName() + ": " + ex.getMessage());
        }    
    }

以上代码中查询的sql表My.Employee,在Caché数据中对应的类如下,

Class My.Employee Extends (%Persistent, %Populate)
{

Property Name As %String;

Property Title As %String;

Property Notes As %Stream.GlobalCharacter;
}

那么对于Stream数据的读取慢在哪儿,为什么会慢呢?执行完sql语句数据库服务器端返回的结果集中将包括Title这个String类型数据,但是并不包括Stream数据Notes,这么设计也是合理的,因为如果把一个几个M的流数据直接包含在结果集中返回,而应用程序并不需要使用这个流数据,那么这个代价花得就有点不值了。所以真正去获取这个流数据是在getString()时向数据库服务器端发送请求然后服务器端将这个数据返回的,即使流数据的实际长度很小,网络的一来一回也无法避免。所以慢在getString, 原因是多花费了一次网络的往返。

为了应对此场景,IRIS增加了Prefetch机制,也就是预先读取一定长度的流数据放在结果集中一并返回,如果设置得恰当就能避免二次请求。以此提高读取性能。Prefetch使用方法请参考如下示例代码,

public static void test98()
    {
        Statement stmt = null;
        ResultSet rs = null;
        
        long before = System.currentTimeMillis();
        String sql="Select Title, Notes from My.Employee Where id=1";
        try {

            IRISDataSource ds = new IRISDataSource();
            ds.setURL("jdbc:IRIS://123.123.123.2:1972/USER/jdbc-prefetch2.log");  // iris数据库,此代码测试在IRIS2021.1上进行。
            ds.setUser("_SYSTEM");
            ds.setPassword("SYS");
            IRISConnection irisconnection = (IRISConnection)ds.getConnection();
            irisconnection.setStreamPrefetchSize(10000);
            stmt = irisconnection.createStatement();
            rs = stmt.executeQuery(sql);
            long executed = System.currentTimeMillis();
            System.out.println("execute take miliseconds of:"+(executed-before));
            ResultSetMetaData rsmd = rs.getMetaData();
            int colnum = rsmd.getColumnCount();
            String str = null;
            while (rs.next()) {
                for (int i = 1,ilen = colnum; i <= ilen; i++) {
                str = rs.getString(i);
                }
            }
          stmt.close();
          rs.close();
            irisconnection.close();
            long end = System.currentTimeMillis();
            System.out.println("read take miliseconds of:"+(end - executed));
            System.out.print("total take miliseconds of:"+(end-before));
        }catch (Exception ex) {
              System.out.println("TinyJDBC caught exception: " 
                   + ex.getClass().getName() + ": " + ex.getMessage());
        }    
    }
}

以上代码中查询的sql表My.Employee在IRIS中的定义同上。

关于如何使用Java的更多内容,请参见如下在线文档,
https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=BJAVA

IRISDataSource API,请参见如下在线文档,
https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=BJAVA_refapi#BJAVA_refapi_iris-data-source

3 Comments
讨论 (3)3
登录或注册以继续