Clear filter
Announcement
Olga Zavrazhnova · May 22
Okay, it's officially going to be an outstanding Developer Zone this year at InterSystems READY 2025!Tech Exchange — a special space filled with developer-tailored content — is back this year, better than ever!
Here's what to explore at Tech Exchange:
✅ More than 40 short tech demos with Q&A✅ Developer Ecosystem Booth:
Meet and chat with the Developer Relations team — the people behind the Developer Community, Global Masters, Ideas Portal, Open Exchange, Programming Contests, and many other activities we run for developers! Try your luck at the Wheel of Fortune Snap a photo at our booth for a secret project (we’ll reveal more at the booth!) and earn Global Masters points🍪 Did you know there will be a barista in the room? Well, our table has cookies! Help us clear the cookies — yes, the edible kind!As always, learn about everything we offer to support developers — including our new AI-powered Developer Community tool (get faster answers and debug errors more easily), programming and writing contests with prizes, and tons of great resources!✅ Learning Services booth with one-on-one training sessions and learning plan consultations. Learn more here ✅ User Experience booth✅ Request a 1-on-1 meeting with InterSystems product experts and developers
Dedicated tables with InterSystems experts that will be ready to answer your questions:✅ FHIR & Interoperability tableAttend the FHIR Table at Tech Exchange to Learn About New Bulk FHIR Features:
Population-level analytics across patient cohorts and EHRs
Building high-quality research datasets with FHIR
Extracting clinical measures, operational analytics, and care quality metrics from health systems using FHIR
How SMART on FHIR and FHIR Bulk Access support third-party application development and innovation
✅ Python table of Mumpsters and Pythonistas
Mumpsters, you have question around Python? Python developpers you have question around IRIS ? come to the Python Table!
Meet with our experts to discuss all things Python and IRIS. We will be happy to answer your questions, share best practices, and help you get the most out of your Python experience with IRIS.
🐍 Topics:
Interoperability on Python (IoP)
Remote debugging
Deep Dive in low level APIs
Best practices
How to start with Python and IRIS
Virtual Environment Support
✅ Got SQL Questions? Stop by the SQL Table!Meet InterSystems experts and get quick answers on IRIS SQL, vector search, query tuning, data modeling, and more.
Topics:
IRIS SQL fundamentals
Vector search and foreign tables
Data modeling and indexing strategies
Query optimization and error investigation
Document storage and sharding techniques
✅ Visit the Supply Chain Table
Stop by for one-on-one conversations and live demos covering the latest in InterSystems supply chain solutions.
Topics:
Overview of InterSystems supply chain solutions and strategy
Deep dive into our key products:
InterSystems Supply Chain OrchestratorInterSystems Data Fabric Studio with supply chain module
Real-world client use cases and implementation stories
Live demos featuring:
Intelligent supply chain for smarter healthcare
Empowering enterprise applications through a supply chain data gateway
Decision intelligence with Supply Chain Orchestrator
Generative AI Co-Pilot for supply chain workflows
What: Tech Exchange @ InterSystems READY 2025Where: Bonnet Creek IX
As always, we have a number of Global Masters activities - both fun and informational - to keep you updated on the event while you also earning the points. Check them out under "InterSystems READY" tag. 👏
Announcement
Anastasia Dyubaylo · May 26
Hi Community,
It's voting time! Cast your votes for the best applications in our InterSystems FHIR and Digital Health Interoperability Contest:
🔥 VOTE FOR THE BEST APPS 🔥
How to vote? Details below.
Experts nomination:
An experienced jury from InterSystems will choose the best apps to nominate for the prizes in the Experts Nomination.
Community nomination:
All active members of the Developer Community with a “trusted” status in their profile are eligible to vote in the Community nomination.
Blind vote!
The number of votes for each app will be hidden from everyone. We will publish the leaderboard in the comments to this post once a day.
The order of projects on the contest page will be as follows: the earlier an application was submitted to the competition, the higher it will be on the list.
P.S. Don't forget to subscribe to this post (click on the bell icon) to be notified of new comments.
To take part in the voting, you need:
Sign in to Open Exchange – DC credentials will work.
Make any valid contribution to the Developer Community – answer or ask questions, write an article, contribute applications on Open Exchange – and you'll be able to vote. Check this post on the options to make helpful contributions to the Developer Community.
If you change your mind, cancel the choice and give your vote to another application!
Support the application you like!
Note: contest participants are allowed to fix the bugs and make improvements to their applications during the voting week, so don't miss and subscribe to application releases!
Announcement
Anastasia Dyubaylo · Jun 17
Hi Community,
Enjoy the new video in a series of videos created by our Project Managers to highlight some of the interesting features of the new 2025.1 release:
⏯ RAG with built-in Vector Search in InterSystems IRIS 2025.1
The 2025.1 release of InterSystems IRIS introduces powerful new support for retrieval-augmented generation (RAG) using built-in vector search. This lets developers combine their enterprise data with large language models to build smarter, context-aware applications — all within the database. The new approximate nearest neighbor indexing dramatically boosts performance, and InterSystems offers learning resources to help developers get started.
🗣 Presenter: @tomd, Product Manager - Machine Learning, InterSystems
Stay in the loop. Watch the video and hit subscribe for more updates!
Article
Sylvain Guilbaud · May 30
Kong provides an open source configuration management tool (written in Go), called decK (which stands for declarative Kong)
Check that decK recognizes your Kong Gateway installation via deck gateway ping
deck gateway ping
Successfully connected to Kong!
Kong version: 3.4.3.11
Export Kong Gateway configuration to a file named "kong.yaml" via deck gateway dump
deck gateway dump -o kong.yaml
After modifying the IP adcresses in kong.yaml file, show the differences via deck gateway diff
deck gateway diff kong.yaml
updating service test-iris {
"connect_timeout": 60000,
"enabled": true,
- "host": "192.168.65.1",
+ "host": "172.24.156.176",
"id": "8fc9849d-9e61-402d-bcad-c3e611808892",
"name": "test-iris",
"port": 9092,
"protocol": "http",
"read_timeout": 60000,
"retries": 5,
"write_timeout": 60000
} updating service uct {
"connect_timeout": 60000,
"enabled": true,
- "host": "192.168.65.1",
+ "host": "172.24.156.176",
"id": "96ad587e-8921-4d6c-acb7-3f7f7a7cc072",
"name": "uct",
"path": "/api/uct/",
"port": 9092,
"protocol": "http",
"read_timeout": 60000,
"retries": 5,
"write_timeout": 60000
} Summary:
Created: 0
Updated: 2
Deleted: 0
Apply changes via deck gateway sync
deck gateway sync kong.yaml
updating service uct {
"connect_timeout": 60000,
"enabled": true,
- "host": "192.168.65.1",
+ "host": "172.24.156.176",
"id": "96ad587e-8921-4d6c-acb7-3f7f7a7cc072",
"name": "uct",
"path": "/api/uct/",
"port": 9092,
"protocol": "http",
"read_timeout": 60000,
"retries": 5,
"write_timeout": 60000
} updating service test-iris {
"connect_timeout": 60000,
"enabled": true,
- "host": "192.168.65.1",
+ "host": "172.24.156.176",
"id": "8fc9849d-9e61-402d-bcad-c3e611808892",
"name": "test-iris",
"port": 9092,
"protocol": "http",
"read_timeout": 60000,
"retries": 5,
"write_timeout": 60000
} Summary:
Created: 0
Updated: 2
Deleted: 0
Export the configuration of a workspace via deck gateway dump --workspace myworkspace
deck gateway dump --workspace workspace1
Deploy a workspace via deck gateway sync workspace1.yaml --workspace workspace1
deck gateway sync workspace1.yaml --workspace workspace1
For more information :
https://docs.konghq.com/deck/get-started
https://docs.konghq.com/deck/reference/faq/
https://github.com/Kong/deck/blob/main/CHANGELOG.md/
Announcement
Anastasia Dyubaylo · Jun 9
Hi Community,
Enjoy the new video on InterSystems Developers YouTube:
⏯ Migrating 20TB to InterSystems IRIS with Near 0 Downtime @ Global Summit 2024
Pardini (Grupo Fleury) executed a significant migration to InterSystems IRIS while also switching the operating system from Sun Solaris to Red Hat. Hear from them about their journey and technical challenges, and discover new InterSystems IRIS features, including API Manager, InterSystems IRIS Reports, and Columnar Storage.
Presenters:🗣 @Rochael.Ribeiro, Sales Engineer Manager, InterSystems 🗣 @Fernando.Ferreira, Sales Engineer, InterSystems
Want to learn something new? Watch the video and subscribe for more!
Article
Harry Tong · Jun 6
If you're migrating from Oracle to InterSystems IRIS—like many of my customers—you may run into Oracle-specific SQL patterns that need translation.
Take this example:
SELECT (TO_DATE('2023-05-12','YYYY-MM-DD') - LEVEL + 1) AS gap_date
FROM dual
CONNECT BY LEVEL <= (TO_DATE('2023-05-12','YYYY-MM-DD') - TO_DATE('2023-05-02','YYYY-MM-DD') + 1);
In Oracle:
LEVEL is a pseudo-column used in hierarchical queries (CONNECT BY). It starts at 1 and increments by 1.
CONNECT BY LEVEL <= (...) determines how many rows to generate.
The difference between the two dates plus one gives 11, so the query produces 11 rows, counting backwards from May 12, 2023 to May 2, 2023.
Breakdown of the result:
LEVEL = 1 → 2023-05-12
LEVEL = 2 → 2023-05-11
...
LEVEL = 11 → 2023-05-02
Now the question is: How do you achieve this in InterSystems IRIS, which doesn’t support CONNECT BY?
One solution is to implement a SQL-style query using ObjectScript that mimics this behavior. Below is a sample CREATE QUERY definition that accepts a STARTDATE and a number of DAYS, and returns the descending list of dates.
✅ InterSystems IRIS: Implementing a Date Gap Query
CREATE QUERY GET_GAP_DATE(IN STARTDATE DATE, IN DAYS INT)
RESULTS (GAP_DATE DATE)
PROCEDURE
LANGUAGE OBJECTSCRIPT
Execute(INOUT QHandle BINARY(255), IN STARTDATE DATE, IN DAYS INT)
{
SET QHandle("start") = STARTDATE
SET QHandle("days") = DAYS
SET QHandle("level") = 1
RETURN $$$OK
}
Fetch(INOUT QHandle BINARY(255), INOUT Row %List, INOUT AtEnd INT)
{
IF (QHandle("level") > QHandle("days")) {
SET Row = ""
SET AtEnd = 1
} ELSE {
SET Row = $ListBuild(QHandle("start") - QHandle("level") + 1)
SET QHandle("level") = QHandle("level") + 1
}
RETURN $$$OK
}
Close(INOUT QHandle BINARY(255))
{
KILL QHandle
QUIT $$$OK
}
You can run the above CREATE QUERY in IRIS System Management Portal, or through a tool like DBeaver or a Python/Jupyter notebook using JDBC/ODBC.
🧪 Example Usage:
To generate the same result as the Oracle query above, use:
SELECT * FROM GET_GAP_DATE(
TO_DATE('2023-05-12', 'YYYY-MM-DD'),
TO_DATE('2023-05-12', 'YYYY-MM-DD') - TO_DATE('2023-05-02', 'YYYY-MM-DD') + 1
);
This will output:
GAP_DATE
----------
2023-05-12
2023-05-11
...
2023-05-02
(11 rows)
🔁 Advanced Usage: Join with Other Tables
You can also use this query as a subquery or in joins:
SELECT *
FROM GET_GAP_DATE(TO_DATE('2023-05-12', 'YYYY-MM-DD'), 11)
CROSS JOIN dual;
This allows you to integrate date ranges into larger SQL workflows.
Hope this helps anyone tackling Oracle-to-IRIS migration scenarios! If you’ve built alternative solutions or have improvements, I’d love to hear your thoughts.
Announcement
Anastasia Dyubaylo · Apr 16, 2020
Hi Community,
We're pleased to invite you to join the upcoming InterSystems IRIS 2020.1 Tech Talk: Data Science, ML & Analytics on April 21st at 10:00 AM EDT!
In this first installment of InterSystems IRIS 2020.1 Tech Talks, we put the spotlight on data science, machine learning (ML), and analytics. InterSystems IntegratedMLTM brings automated machine learning to SQL developers. We'll show you how this technology supports feature engineering and chooses the most appropriate ML model for your data, all from the comfort of a SQL interface. We'll also talk about what's new in our open analytics offerings. Finally, we'll share some big news about InterSystems Reports, our "pixel-perfect" reporting option. See how you can now generate beautiful reports and export to PDF, Excel, or HTML.
Speakers:🗣 @Benjamin.DeBoe, Product Manager🗣 @Thomas.Dyar, Product Specialist, Machine Learning🗣 @Carmen.Logue, Product Manager, Data Platforms
Date: Tuesday, April 21, 2020Time: 10:00 AM EDT
➡️ JOIN THE TECH TALK! The webinar begins right now. Do not miss, you can still register!
➡️ JOIN THE TECH TALK! Hi Developers,
Please find the webinar recording here.
Enjoy!
Announcement
Anastasia Dyubaylo · Jun 30, 2020
Hi Community,
We introduced 3 new tags for the posts:
Data Import and Export
CSV
InterSystems Business Solutions and Architectures
Please check the full list of DC tags.
Leave your requests for other new tags to introduce! 👍🏼
Announcement
Luca Ravazzolo · Jul 2, 2020
GA releases are now available for the first version (v1.0) of InterSystems System Alerting and Monitoring (InterSystems SAM for short) InterSystems SAM v1.0 provides a modern monitoring solution for InterSystems IRIS based products. It allows high-level views of clusters and single-node drilled down metrics-visualization together with alerts notifications. This first version provides visualization for more than one hundred InterSystems IRIS kernel metrics, and users can extend the default-supplied Grafana template to their liking. V1.0 is meant to be a simple and intuitive baseline. Help us make it great by trying it and sending us feedback! SAM can display information from InterSystems-based instance starting with version 2020.1 SAM is only available in container format. You will need the SAM Manager container plus a small set of additional open-source components (Prometheus and Grafana) that are added automatically by the composition file.SAM components and the SAM Manager Community Edition are available fromThe WRC Components page as “SAM Components” and the WRC Containers page as “SAM Manager”Externally via the Components Github repo & the Container page
Documentation can be found here. Introduction to System Alerting and Monitoring from our Learning Services team:
https://www.youtube.com/watch?v=UzUs5iHcoJ0&feature=youtu.be That's great!
Thanks for sharing
Announcement
Anastasia Dyubaylo · Jul 16, 2020
Hey Developers,
New "Coding Talk" video was specially recorded by @Yuri.Gomes for the InterSystems IRIS AI Programming Contest:
⏯ SAPPHIRE - AutoML UI to InterSystems IntegratedML
In this video, you'll learn about a web application to create your InterSystems IntegratedML models called SAPPHIRE.
⬇️ SAPPHIRE on Open Exchange
➡️ Learn more: Machine Learning with IntegratedML and Sapphire
For any questions, please write to @Yuri.Gomes at yurimarx@gmail.com or in the Direct Messages on DC.
Enjoy watching this video!
And don't forget to vote for this project in the IRIS AI Programming Contest! 🔥
Article
Yuri Marx · Jul 18, 2020
Now Sapphire enable you load CSV to IRIS. See the steps:
1) Create a sample CSV file using Excel (save file as CSV):
2) Follow these instructions to install Sapphire into your enviroment: https://openexchange.intersystems.com/package/SAPPHIRE
3) Access Sapphire web page. Go to top menu Import > Load CSV
4) Configure access to your IRIS target instance, select new table, set your new table name, click Choose button and load your csv file and click upload. Click Get Definitions.
5) CSV Export definitions are presented and you can edit sql column name or sql column type to your preferences if you want.
6) After configuration click Export CSV:
7) See results in your Management Portal:
With this feature you can load your training, validate and real content data prediction or load CSV data to any new or existent table. Hi, Yuri,
I tried Sapphire and get a 'Undefiend' error when connect to my IRIS. the URL I used is : "jdbc:IRIS://LOCALHOST:9091/USER". I am not sure it's okay, because from container system, I can ping LOCALHOST, but I don't think this is the docker Host server, my MAC os, and I can't ping MAC OS's any ip address from docker. Any suggestion? thank you
Announcement
Anastasia Dyubaylo · May 25, 2020
Hey Developers,
The recording of the Kick-Off Webinar for InterSystems IRIS Native API Online Programming Contest is now available on InterSystems Developers YouTube:
Speakers: @Robert.Kuszewski, InterSystems Product Manager@Evgeny.Shvarov, InterSystems Developer Ecosystem Manager
The topic of this webinar is dedicated to the InterSystems IRIS Native API programming contest. In this competition, we would like to see what kinds of interesting applications can be built using the Native API.
This video describes the Native API Contest Template that demonstrates all 4 NativeAPIs setup and work. This template will help you to get started with the contest.
⬇️ Download the Native API Contest Template
We hope that you’ll enjoy the new APIs and have fun hacking!
Stay tuned! 👍🏼 I was unable to attend so I took the recording. The content was important and good to understand.But the shared desktops are all unreadable in the video. Hi Robert,
Please try again. 1080 HD is already available. 😊 Sorry my fault: my quality was set back to 240 (!) as I was watching High Noot wich Garry Cooper last time
with 1080 HD it is excellent Great! I was unable to attend too. I have some points with the IRIS Native API documentation whats the best channel to report? Good luck for all contestants Hi Renato!
Thanks for participating in the contest!
You can submit a new question here on Developers Community, or ask in Discord, or report on the problem to support@intersystems.com
Announcement
Anastasia Dyubaylo · Jun 23, 2020
Hi Developers,
Please welcome the new coding talk on InterSystems Developers YouTube:
⏯ How to Generate Modules for InterSystems Package Manager (ZPM)
This video describes how to generate module.xml descriptions for InterSystems IRIS Package Manager (ZPM) automatically.
Useful Resources:
Download ZMP from Open Exchange
ZPM 0.2.3 Release
ZPM Documentation
Big applause to @Evgeny.Shvarov! 👏🏼
Enjoy and stay tuned! How could you know that I was just looking for this ??? Because this is how we work, Robert :) Only this way ;)
Thanks @Anastasia.Dyubaylo!
Announcement
Georgina Finneran · Aug 12, 2020
All Interested Applicants Please Apply Here : https://www.indeed.com/job/remote-software-engineer-must-have-intersystems-or-iris-experience-cb27a40d004e96ec
RxMx is a fast-growing company at the intersection of technology and healthcare. Founded by four specialist physicians, our driving philosophy is developing medical systems that ensure the safe delivery of complex and sophisticated medicines, with minimal burden on both physicians and patients. We supply innovative technology solutions to our pharmaceutical clients that improve patient safety, reduce the complexity in drug launch and provide a platform for real world data.
We are looking for a Software Engineer to enhance, maintain and support new and existing software products and solutions. This role will work closely with clinical staff and product managers to product requirement specifications and work closely with other developers and QA Engineers to product high quality working software.
Essential Functions:
Participate in SDLC that leverages best practice and supports the design and delivery of sophisticated clinical applications.
Support the conversion of business systems and functional requirements into working software in established timelines and using best practices.
Work with clinical staff and product managers to produce requirement specifications and establish timelines for delivery.
Proactive and create thinking to problem solving to develop out of the box products. As well as Enhancing, maintaining, and supporting existing solutions.
Create and maintain appropriate documentation for software produced.
Correct errors by making appropriate changes and then rechecking the program to ensure that the desired results are produced.
Conduct trial runs of programs and software applications to be sure they will produce the desired information and that the instructions are correct.
Compile and write documentation of program development and subsequent revisions, inserting comments in the coded instructions so others can understand the program.
Clearly communicate and consult with managerial, engineering, and technical personnel to clarify program intent, identify problems, and suggest changes.
Conduct code reviews, and approve or reject pull requests.
Participate in capacity planning, assignment of work, team meetings and stand ups.
Qualifications:
Degree in Computer Science or related technical field and/or 5+ years of related practical work experience.
Experience with source control. BitBucket experience beneficial.
Experience with Atlassian tools such as JIRA and Confluence.
Experience with Agile methodologies.
Must be independent yet a team player with great communication skills.
Must be a go-getter, that can make things happen in a high paced environment.
Experience in Healthcare IT working with HL7 and other EMR and Lab integrations.
Experience with full stack development, with Angular experience preferred.
Experience with Intersystems technology is required.
To be successful in this role, you must have/be:
Ability to effectively identify what is important and prioritize competing projects.
Ability to problem solve in a resourceful and data-driven manner while working in a fast-paced, demanding environment.
A self-driven, results-oriented problem solver with a positive outlook.
We are proud of our collaborative culture and our dedicated team driven to improve treatment options for patients. Our company offers great benefits including flexible hours, remote work, and fun perks such as an extra vacation day on your birthday. While our offices are in Sydney, New York, and Berlin, we maintain the atmosphere of a small, close-knit company with employees who enjoy being social.
Further information on our company background and mission can be found at: https://rxmxcorp.com/
RxMx, Inc. provides equal employment opportunity to all individuals regardless of their race, color, creed, religion, gender, age, sexual orientation, national origin, disability, veteran status, or any other characteristic protected by federal, state or local law.
All Interested Applicants Please Apply Here : https://www.indeed.com/job/remote-software-engineer-must-have-intersystems-or-iris-experience-cb27a40d004e96ec
Article
Andrey Shcheglov · Dec 13, 2018
Astronomers’ tools
5 years ago, on December 19, 2013, the ESA launched an orbital telescope called Gaia. Learn more about the Gaia mission on the official website of the European Space Agency or in the article by Vitaly Egorov (Billion pixels for a billion stars).
However, few people know what technology the agency chose for storing and processing the data collected by Gaia. Two years before the launch, in 2011, the developers were considering a number of candidates (see “Astrostatistics and Data Mining” by Luis Manuel Sarro, Laurent Eyer, William O’Mullane, Joris De Ridder, pp. 111-112):
IBM DB2,
PostgreSQL,
Apache Hadoop,
Apache Cassandra and
InterSystems Caché (to be more precise, the Caché eXTreme Event Persistence technology).
Comparing the technologies side-by-side produced the following results (source):
Technology
Time
DB2
13min55s
PostgreSQL 8
14min50s
PostgreSQL 9
6min50s
Hadoop
3min37s
Cassandra
3min37s
Caché
2min25s
The first four will probably sound familiar even to schoolchildren. But what is Caché XEP?
Java technologies in Caché
If you look at the Java API stack provided by InterSystems, you will see the following:
The Caché Object Binding technology that transparently projects data in Java. In Caché terms, the generated Java proxy classes are called exactly like that - projections. This approach is the simplest, since it saves the “natural” relations between classes in the object model, but doesn’t guarantee great performance: a lot of service metadata describing the object model is transferred “over the wires”.
JDBC and various add-ons (Hibernate, JPA). I guess I won’t tell you anything new here apart from the fact that Caché supports two types of transaction isolation: READ_UNCOMMITTED and READ_COMMITTED – and works in the READ_UNCOMMITTED mode by default.
The Caché eXTreme family (also available in .NET and Node.js editions). This approach is characterized by the direct access to the low-level data representation (so-called “globals” – quanta of data in the Caché world) ensuring high performance. The Caché XEP library simultaneously provides object and quasi-relational access to data.
Object – the API client no longer needs to care about object-relational representation: following the Java object model (even in cases of complex multi-layer inheritance), the system automatically creates an object model on the Caché class level (or a DB schema if we want to use the terms of the relational representation).
Quasi-relational – in the sense that you can run SQL queries against multiple “events” stored in a database (to be exact, requests using the SQL subset) directly from the context of an eXTreme-connection. Indices and transactions are fully supported as well. Of course, all loaded data become immediately accessible via JDBC and a relational representation (supporting all the powerful features of ANSI SQL and SQL extensions specific to the Caché dialect), but the access speed will be completely different.
Summing up, here’s what we have:
“schema” import (Caché classes are created automatically), including
import of the Java class hierarchy;
instant relational access to data – you can work with Caché classes the way you work with tables;
support of indices and transactions via Caché eXTreme;
support of simple SQL queries via Caché eXTreme;
support of arbitrary SQL queries via the underlying JDBC over TCP connection (Caché uses the standard Type 4 (Direct-to-Database Pure Java) driver).
This approach offers some advantages in comparison with comparable relational (higher access speed) and various NoSQL solutions (instant access to data in the relational style).
The “nuance” of configuring Caché eXTreme prior to connecting is the environment set-up:
the GLOBALS_HOME variable has to point to the Caché installation folder and
LD_LIBRARY_PATH (DYLD_LIBRARY_PATH for Mac OS X or PATH for Windows) has to contain ${GLOBALS_HOME}/bin.
Additionally, you may need to increase the stack and heap size of the JVM (-Xss2m -Xmx768m).
Some practice
The authors were interested in how Caché eXTreme would behave while writing an uninterrupted stream of data in comparison with other data processing technologies. We used historical stock price data in the CSV format from the website of the “Finam” holding. Sample data file:
<TICKER>,<PER>,<DATE>,<TIME>,<LAST>,<VOL>
NASDAQ100,0,20130802,09:31:07,3 125.300000000,0
NASDAQ100,0,20130802,09:32:08,3 122.860000000,806 906
NASDAQ100,0,20130802,09:33:09,3 123.920000000,637 360
NASDAQ100,0,20130802,09:34:10,3 124.090000000,421 928
NASDAQ100,0,20130802,09:35:11,3 125.180000000,681 585
The code of the Caché class modeling the above structure might look like this:
Class com.intersystems.persistence.objbinding.Event Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, SqlTableName = Event ]
{
Property Ticker As %String(MAXLEN = 32);
Property Per As %Integer(MAXVAL = 2147483647, MINVAL = -2147483648);
Property TimeStamp As %TimeStamp;
Property Last As %Double;
Property Vol As %Integer(MAXVAL = 9223372036854775807, MINVAL = -9223372036854775810);
}
We also wrote some basic and naive test code. This “naive” approach can be justified by the fact that we are not really measuring the speed of the code generated by JIT, but the speed at which the code that is completely unrelated to JVM (with the exception of Apache Derby) can write to the disk. Here’s how the test program window looks like:
Our contenders:
Apache Derby 10.14.2.0
Oracle 10.2.0.3.0
InterSystems Caché 2018.1 (JDBC)
InterSystems Caché 2018.1 (eXTreme)
Note that since tests are somewhat approximate, we saw no practical purpose in providing exact numbers: the margin of error is fairly high, while the goal of the article is to demonstrate the general tendency. For the same reasons, we are not specifying the exact version of JDK and the settings of the garbage collector: the server-side JVM 8u191 with -Xmx2048m -Xss128m reached a very similar level of performance on Linux and Mac OS X. One million events were saved in each test; several warm-up runs (up to 10) were performed before each test of a particular database. As for Caché settings, the routine cache was increased to 256 MB and the 8kb database cache was expanded to 1024 MB.
Our testing yielded the following results (the write speed values are expressed in events per second (eps)):
Technology
Time, s (less is better)
Write speed, eps (more is better)
Apache Derby
140±30
7100±1300
Oracle
780±50
1290±80
Caché JDBC
61±8
17000±2000
Caché eXTreme
6.7±0.8
152000±17000
Caché eXTreme, transaction journaling disabled
6.3±0.6
162000±14000
Derby offers speeds varying from 6200 to 8000 eps.
Oracle turned out to be as fast as 1290 eps.
Caché in the JDBC mode gives you a higher speed (from 15000 to 18000 eps), but there is a trade-off: the default transaction isolation level, as mentioned above, is READ_UNCOMMITTED.
The next option, Caché eXTreme, gives us 127000 to 167000 eps.
Finally, we took some risk and disabled the transaction log (for a given client process), and managed to achieve the write speed of 172000 eps on a test system.
Those who are interested in more accurate numbers can view the source code. You will need the following to build and run:
JDK 1.8+,
Git,
Maven
Oracle JDBC driver (available from Oracle Maven Repository)
Maven Install Plugin for for creating local Caché JDBC and Caché eXTreme artifacts:
$ mvn install:install-file -Dfile=cache-db-2.0.0.jar
$ mvn install:install-file -Dfile=cache-extreme-2.0.0.jar
$ mvn install:install-file -Dfile=cache-gateway-2.0.0.jar
$ mvn install:install-file -Dfile=cache-jdbc-2.0.0.jar
and, finally,
Caché 2018.1+.
Great post! I have a followup question: How did you load the Finam data? Was it "over the wire" all at once? Or were you reading from one or more csv files? Hi Joel!Finam.ru is a trade broker for MOEX - Russian stock exchange. Previously they had an API to download quotes for any securities. What I see now they at still have the UI to download quotes e.g. in CSV - here is the link do download GAZPROM quotes. Evgeny, if I understand you, you're saying that they downloaded the quotes to a CSV file and then they read in the CSV file. I'm now wondering if/how they "chunked" the quotes. Did they read in and store each quote one at a time, or did they read in 1000 quotes into a Java array and then store those quotes, read in another 1000 and store those, etc. Joel, the code just reads one line at a time, immediately storing its parsed value into the database (within the same execution thread).Strictly speaking, this is a mix of a CPU-bound and I/O-bound tasks within the same thread, and we should have 3 threads instead:one reading from the local disk (I/O);the 2nd one parsing the CSV line, andthe last one storing the parsed value into the (potentially, remote) database.The 3-thread approach should improve the timings (for all the databases being tested), but the relative values are unlikely to reveal any substantial changes.Additionally, I have to remark that the auto-commit flag is off over each session, with a single commit issued after all the data are saved. In a real-life application, one should additionally issue intermediate commits (say, after each 1000 or 10000 of records). Can you tell me if all the figures stated are those that Intersystems created/monitered/collated from their own installations of the alternative databases or are the figures collated and verified by an external 3rd party company?forgive me but its easy to slant figures based upon marketing requirements.kevin Kevin, all the benchmarks have been run by me at one of my workstations (Intel Core i7-4790).The same Seagate ST1000DM010-2EP102 7200 rpm HDD was dedicated to host the data files over all experiments, with no other read or write operations interrupting it during each session.So, summing it up, there has been no relation to ISC infrastructure.I can share the detailed hardware specs if you need them. Or you can try and run the benchmark on your own hardware. Hi Kevin!I examined the article. It has two sources of figures: from EISA and from Andrey's personal research. Both have no relation to InterSystems official benchmarking.So, the answer is no - nothing Intersystems official here, only 3rd party researches. Andrey, Evgeny:while it was 3d party research, there are some signs of Caché performance tuning: global cache and routine cache were manually enlarged, journaling was switched off at the process level. Were the similar tuning steps performed for other DBMSs used in the research? AFAIK, Oracle would not allow to stop transaction logging (=journaling) at all. Only few people have appropriate knowledge of all DBMS products listed in the article (maybe Andrey is one of them), and nobody would touch hidden or semi-hidden performance parameters without it.That's why I doubt if an Oracle engineer (or even DBA) would approve such "derby" results. Shouldn't we agree with an author of the sentence? :...a single view of Oracle has lead to vastly different results, like the difference between a circle and a square. Always remember that there is no substitute for a real-world test that simulates the actual behavior of your production systems, using your own production SQL (http://www.dba-oracle.com/t_benchmark_testing.htm) hv they migrate to IRIS? how is IRIS performance against others?