検索

Artigo
· Jul. 22 5min de leitura

Vector Search Performance

Test Objectives

InterSystems has been testing Vector Search since it was announced as an “experimental feature” in IRIS 2024.1. The first test cycle was aimed at identifying algorithmic inefficiencies and performance constraints during the Development/QD cycle. The next test cycle used simple vector searches for single threaded performance analysis to model reliable, scalable and performant behaviour at production database scale in IRIS, and performed a series of comparative tests of key IRIS vector search features against PostgreSQL/pgvector. The current test cycle models the expected behaviour of real-world customer deployments using complex queries that span multiple indices (vector and non-vector) and run in up to 1000 concurrent threads. These tests will be run against IRIS, PostgreSQL/pgvector, and ElasticSearch

Test Platform

testing has been carried out on a variety of Linux deployment platforms; at the high end we have utilised the facilities of InterSystems Scalability Lab and our primary test platform has been an HPE bare metal server with 48 cores and 528GB RAM running Ubuntu 24.04 and current versions of IRIS and PostgreSQL/pgvector

Test Data

access to appropriate volumes of high-quality embedding data has been a significant issue during all iterations of testing. Testing during Development and QD phases was typically run against thousands of rows of synthetic (randomly generated) embedding data, production scale testing requires a minimum of one million rows. Synthetic embedding data provides an unsatisfactory basis for production scale testing because it does not support plausibility checking (there’s no source data to validate semantic proximity against) and does not reflect the clustering of data in vector space and its effects on indexed search performance and accuracy (specifically recall). We have used the following datasets during testing:

  • 40 thousand embeddings generated from historical bid submissions by the internal RF-Eye project
  • reference dataset downloaded from Hugging Face of embeddings generated against Simple Wikipedia articles at paragraph level using the Cohere multilingual-22-12 model, initially 1 million rows and then an additional 9 million rows (out of 35 million available)
  • 25 million rows of embeddings generated by a customer against public domain medical data using a custom model

to support our tests data is loaded into a staging table in the database then incrementally moved to vector data structures to support testing at increasing database sizes. Where required indexing is deferred and run as a separate post-move step. A small percentage (generally 0.1%) of the staged data is written to a query data store and subsequently used to drive the test harness; depending on whether we want to model exact vector matching this data may also be written to the vector data store.

We intend to scale our tests up to 500 million rows of embeddings when we can identify and access an appropriate dataset

Test Methodology

our standard vector search unit test performs 1000 timed queries against the vector database using randomly selected (not generated) query parameters. For indexed searches we also run an equivalent unindexed query with the same parameters to establish the ground truth result set, then compute RECALL at 1, 5 and 10 records. Each test run performs one hundred unit tests, and we perform multiple test runs against each configuration/database size

Unindexed Vector Search

in IRIS unindexed COSINE and DOT_PRODUCT search performance demonstrate predictable linear scaling until we reach the compute constraints of the server (typically by exhausting global buffers). Running our test harness against the same dataset in PostgreSQL/pgvector demonstrates that unindexed search is faster in IRIS than in current versions of PostgreSQL/pgvector

 

vector storage footprint and unindexed search performance are affected by the dimensionality of the embedding (the number of discrete components that define it in vector space), which is a function of the embedding model. IRIS DOT_PRODUCT and COSINE search cost per n dimensions shows better than linear scaling (the relative cost of searching n dimensions in an embedding decreases as the dimension count of the embedding increases), because the fixed overhead of accessing and processing the record is amortized over a greater number of component calculations

   

Indexed Vector Search

we have tested Approximate Nearest Neighbor (ANN) search  (implemented in IRIS using the Hierarchical Navigable Small World (HNSW) algorithm) with datasets up to 25 million rows of real-world embedding data and 100 million rows of synthetic data.

IRIS ANN index build times are predictable and consistent as the number of records being indexed increases, in our test environment (48 core physical server) each increment of 1 million records increases the index build time by around 3000 seconds

IRIS ANN search performance is significantly better than unindexed search performance, with sub-second execution of our test harness at database sizes up to 25 million real world records

ANN search recall was consistently above 90% in our IRIS tests with real world data

comparative testing against the same dataset in PostgreSQL/pgvector demonstrates that IRIS ANN search runs more slowly than an equivalent search in PostgreSQL/pgvector but has a more compact data footprint and quicker index builds

What’s Next?

our current benchmarking effort is focused on complex multi-threaded queries which span multiple indices (ANN and non-ANN). The ANN index is fully integrated into InterSystems query optimizer with an assigned a pseudo-selectivity of 0.5%. The query optimizer generates a query plan by comparing the selectivity of all indices available on the table being queried, with query execution starting with the most selective index and evaluating the ANN index at the appropriate step

Key Application Considerations (so far)

  • if you need guaranteed exact results unindexed search is the only option – try to limit the size of the dataset to fit into global buffers for best performance
  • restrict dimensionality to the minimum value that will provide the search granularity required by your application (model choice)
  • if you’re using ANN indexing understand the RECALL value your application needs and tune the index accordingly (remember this is data dependent)
  • the index-time resource requirement is likely to be different from the query-time requirement, you may need different environments
  • index build is resource intensive – maximize the number of worker jobs with Work Queue Manager and be aware of the constraints in your environment (IOPS in public cloud); ingest then index rather than index on insert for initial data load
  • keep the index global in buffers at query time, consider pre-fetching for optimal performance from first access
  • good IRIS system management remains key.
Discussão (0)1
Entre ou crie uma conta para continuar
Anúncio
· Jul. 22

线上研讨会 | 从FHIR到OMOP,灵活的转换有效推动数据资产的应用落地

📣📣📣2025年7月25日15:00,我们邀请InterSystems销售工程师Kate Lau带来一场关于“InterSystems FHIR to OMOP数据管道”的分享,欢迎参加!

🎉🎉🎉欢迎点击此处报名参会🎉🎉🎉

 

医疗数据资产化对于现代化医院管理非常重要,因为它正在重塑医疗行业的价值创造逻辑,推动医疗机构从传统的“诊疗服务提供者”向“数据驱动的健康生态参与者”转型。作为数字时代的“石油”,数据资产化正在重新定义医疗行业的价值分配规则——将数据转化为可计量、可交易、可增值资产,成为数据持有方(例如:医疗机构)的必修之路。

然而在数据资产化的过程中,数据持有方(例如:医疗机构)面临四大典型困境
  • 数据孤岛:EHR、PACS、LIS等系统数据格式割裂,导致患者360视图缺失。
  • 标准缺失:缺乏统一性,一方面大量数据源未采用有效标准;另一方面,行业通用模型众多、数据质量标准不一,且应用场景差异巨大。这些都阻碍了数据的有效利用。
  • 治理耗时:数据治理依赖人工映射,导致ETL耗时过长。
  • 价值沉没:海量数据因缺乏标准化处理,无法支持AI模型训练或科研转化。

这些典型困境的解题钥匙在互操作性和数据标准,那么便离不开FHIR和OMOP这两大标准。

FHIR(Fast Healthcare Interoperability Resources)是HL7组织开发的医疗互操作性标准,以RESTful API和JSON/XML格式为核心,以解决医疗数据交换的实时性、轻量化和跨系统协作问题,因此,FHIR目前在全球医疗健康数据资产化方面占据统治地位,FHIR可以通过标准化数据接口和持久化能力,将原始医疗数据转化为可流通、可复用的资产,为互联网医疗、健康管理、保险精算等场景提供底层支持。

OMOP(Observational Medical Outcomes Partnership)是一个由多学科研究人员组成的国际合作组织,OMOP通用数据模型(CDM)和标准化术语集,为医疗数据分析提供了统一框架和语言,医院、制药公司、数据公司,都可以从OMOP提供的标准化数据资产中获益。通过统一数据结构和术语,支持跨数据库、跨机构的大规模队列研究。OMOP的主导型场景体现在真实世界研究,如药物安全性监测、多中心临床研究、专病数据库建设等方面,通过标准化数据模型和工具链,能够降低科研门槛,加速从数据到知识的转化,成为药物研发、公共卫生政策制定的核心基础设施。

 

一图理解FHIR与OMOP的场景差异与协同路径

如果说FHIR是数据资产化的“起点”,通过实时交换和标准化接口,将分散的医疗数据转化为可流通的资产;那么OMOP就是科研价值的“终点”,通过标准化模型和工具链,挖掘数据资产中的知识,支撑临床决策和药物研发。从FHIR到OMOP,灵活的转换能够有效推动数据资产的应用落地。

InterSystems FHIR to OMOP数据管道提供了解决方案。通过标准互操作(基于FHIR R4标准构建数据接口)、自动化映射(内置OMOP CDM预构建映射规则,大大缩短传统ETL开发周期)、 自动化数据质量分析和云原生架构(依托AWS HealthLake实现弹性扩展),可以帮助用户快速实现数据资产的OMOP化,为用户在数字时代占据先机!

📣📣📣2025年7月25日15:00,我们邀请InterSystems销售工程师Kate Lau带来一场关于“InterSystems FHIR to OMOP数据管道”的分享,通过Demo演示,详解拆解InterSystems FHIR to OMOP解决方案。欢迎点击此处报名参会!

Discussão (0)1
Entre ou crie uma conta para continuar
InterSystems Oficial
· Jul. 22

VS Code - Extension ObjectScript désormais avec télémétrie améliorée

InterSystems a le plaisir d'annoncer la sortie de la version 3.0.5 de l'extension VS Code - ObjectScript. Cette version inclut de nombreuses corrections de bugs, ainsi que des modifications des données de télémétrie collectées. La collecte de données d'utilisation supplémentaires permet à InterSystems d'identifier et de prioriser les correctifs et améliorations les plus bénéfiques pour vous, nos utilisateurs. Les informations personnelles identifiables (PII) ne seront jamais collectées et la télémétrie peut être désactivée via le paramètre telemetry.telemetryLevel. La liste complète des données collectées est disponible ici. Merci d'utiliser nos extensions et n'hésitez pas à nous signaler tout problème si vous avez des commentaires !

Discussão (0)0
Entre ou crie uma conta para continuar
Discussão (0)1
Entre ou crie uma conta para continuar
InterSystems Oficial
· Jul. 22 10min de leitura

IRIS 2025.2 から導入される IRISSECURITY データベースについて

InterSystems IRIS 2025.2 から、セキュリティデータが格納される IRISSECURITY データベースが導入されます。これまでセキュリティデータが格納されていた IRISSYS とは異なり、IRISSECURITY データベースは暗号化することが可能です。これにより機密データをより安全に保管することができるようになります。将来のバージョンでは、IRISSECURITYはミラーリングもサポートされる予定です。

このバージョンではあわせて、セキュリティ管理タスク用の %SecurityAdministrator ロールも導入されます。 

この記事でお伝えする変更は、継続的デリバリ (CD) および 拡張メンテナンス (EM) の両方に導入されます。つまり、バージョン 2025.2 (CD版、2025年7月23日リリース) および 2026.1 (EM版) 以降、InterSystems IRIS に IRISSECURITY データベースが含まれるようになります。そして該当バージョンにアップグレード時に、すべてのセキュリティデータが IRISSYS から IRISSECURITY に自動的に移動します。

InterSystems IRIS 2025.2 は 2025年7月23日リリース予定です。ただし、InterSystems IRIS for Health および Health Connect 2025.2 については、OAuth 設定データに影響を与えるミラーリングの問題の修正が完了するまで公開を延期します。

アップグレード前に 

新しく導入される IRISSECURITY によって、現在セキュリティデータを直接参照しているユーザが影響を受ける可能性があります。 

  • ユーザはセキュリティグローバルに直接アクセスできなくなります。代わりに、セキュリティクラスが提供するAPIを利用する必要があります。
  • OAuth2 グローバルを別のデータベースにマッピングできなくなります。
  • SQLセキュリティが無効化されている場合でも、ユーザはセキュリティテーブルに対するSQLクエリを実行出来なくなります。
  • システムデータベースは、事前定義されたシステムリソースを使用するようになります (事前定義されたシステムリソースはユーザ変更不可)。
    • Unix では、以前のバージョンで新しいリソースを作成してシステムデータベースに割り当てていた場合、アップグレード後、それらリソースは事前定義されたシステムリソースに置き換わります。(ただし、デフォルトでないリソースを参照しているロールがある場合は、データベースへのアクセスを維持するために、デフォルトのリソースを使用するように手動で変更する必要があります)
    • Windows ではリソースをデフォルトに戻す必要があります。データベースにデフォルト以外のリソースがある状態で Windows 上でアップグレードを試みると、アップグレードが停止し (インスタンスは変更されません) 「Database must have a resource label of ...」というエラーメッセージが表示されます。

以下のセクションでは、これら変更点の詳細と、過去バージョンから移行後の代替策をお伝えします。アップグレード前に、ユーザアプリケーションやマクロを確認してテストいただくことを強くお勧めします。 以下の注意点もご確認ください。

  • (直接グローバルにアクセスせず) 提供されるセキュリティAPI経由でセキュリティデータを管理すること
  • これら API を利用する必要な権限  (%DB_IRISSYS:R および Admin_Secure:U) を持っていること 

グローバルアクセス 

以前は、IRISSYSデータベースにセキュリティグローバルが格納されており、ユーザは以下の権限があればセキュリティデータにアクセスできました。 

  • %DB_IRISSYS:R: 直接またはセキュリティAPI経由で、セキュリティグローバルを読み取り可能
  • %DB_IRISSYS:RW: セキュリティグローバルを読み書き可能 
  • %DB_IRISSYS:RW および Admin_Secure:U: セキュリティAPI経由で、セキュリティを管理可能 

InterSystems IRIS 2025.2 では以下のようになります。 

  • ユーザはセキュリティグローバルに直接アクセスできなくなります。
  • %DB_IRISSYS:R と %Admin_Secure:U の両方とも、(提供されたセキュリティAPIを経由して) セキュリティデータにアクセスするため、かつ、セキュリティクラスを通してセキュリティを管理するための、必要最小限の権限になります。
  • 一般的なセキュリティ管理には、新しい %SecurityAdministrator ロールをご利用いただけます。
  • セキュリティデータへの読み取り専用アクセス (これまでは %DB_IRISSYS:R が相当) が削除されました。

グローバルデータのロケーション

InterSystems IRIS 2025.2 では、以下のセキュリティグローバルデータが、IRISSYS から、IRISSECURITY に格納される ^SECURITY グローバルに移動されました。

  • ^SYS("SECURITY")
  • ^OAuth2.*
  • ^PKI.*
  • ^SYS.TokenAuthD

移動した重要なグローバルは以下のとおりです。関連セキュリティクラス、以前のロケーション、新しいロケーションを掲載しております。

セキュリティクラス 以前のロケーション (IRISSYS) 新しいロケーション (IRISSECURITY)
N/A ^SYS("Security","Version") ^SECURITY("Version")
Security.Applications ^SYS("Security","ApplicationsD") ^SECURITY("ApplicationsD")
Security.DocDBs ^SYS("Security","DocDBsD") ^SECURITY("DocDBsD")
Security.Events ^SYS("Security","EventsD") ^SECURITY("EventsD")
Security.LDAPConfigs ^SYS("Security","LDAPConfigsD") ^SECURITY("LDAPConfigsD")
Security.KMIPServers ^SYS("Security","KMIPServerD") ^SECURITY("KMIPServerD")
Security.Resources ^SYS("Security","ResourcesD") ^SECURITY("ResourcesD")
Security.Roles ^SYS("Security","RolesD") ^SECURITY("RolesD")
Security.Services ^SYS("Security","ServicesD") ^SECURITY("ServicesD")
Security.SSLConfigs ^SYS("Security","SSLConfigsD") ^SECURITY("SSLConfigsD")
Security.System ^SYS("Security","SystemD") ^SECURITY("SystemD")
Security.Users ^SYS("Security","UsersD") ^SECURITY("UsersD")
%SYS.PhoneProviders ^SYS("Security","PhoneProvidersD") ^SECURITY("PhoneProvidersD ")
%SYS.X509Credentials ^SYS("Security","X509CredentialsD") ^SECURITY("X509CredentialsD ")
%SYS.OpenAIM.IdentityServices ^SYS("Security","OpenAIMIdentityServersD") ^SECURITY("OpenAIMIdentityServersD")
OAuth2.AccessToken ^OAuth2. AccessTokenD ^SECURITY("OAuth2.AccessToken ")
OAuth2.Client ^OAuth2.ClientD ^SECURITY("OAuth2.Client")
OAuth2.ServerDefinition ^OAuth2.ServerDefinitionD ^SECURITY("OAuth2.ServerDefinitionD")
OAuth2.Client.MetaData ^OAuth2.Client.MetaDataD ^SECURITY("OAuth2.Client.MetaDataD")
OAuth2.Server.AccessToken ^OAuth2.Server.AccessTokenD ^SECURITY("OAuth2.Server.AccessTokenD")
OAuth2.Server.Client ^OAuth2.Server.ClientD ^SECURITY("OAuth2.Server.ClientD")
OAuth2.Server.Configuration ^OAuth2.Server.ConfigurationD ^SECURITY("OAuth2.Server.ConfigurationD")
OAuth2.Server.JWTid ^OAuth2.Server.JWTidD ^SECURITY("OAuth2.Server.JWTidD")
OAuth2.Server.Metadata ^OAuth2.Server.MetadataD ^SECURITY("OAuth2.Server.MetadataD")
PKI.CAClient ^PKI.CAClientD ^SECURITY("PKI.CAClient")
PKI.CAServer ^PKI.CAServerD ^SECURITY("PKI.CAServer")
PKI.Certificate ^PKI.CertificateD ^SECURITY("PKI.Certificate")
%SYS.TokenAuth ^SYS.TokenAuthD ^SECURITY("TokenAuthD")

OAuth2 グローバルマッピング

これまでは OAuth2 グローバルを別のデータベースにマッピングし、OAuth2 設定をミラーリングすることが出来ました。

InterSystems IRIS 2025.2 では、OAuth2 グローバルをマッピングできなくなりました。また IRISSECURITY はミラーリングできません。そのため現在 OAuth2 情報をミラーリングされていた場合、以下のいずれかの回避策をご利用ください。

  • プライマリとフェイルオーバの両方で手動で変更する
  • プライマリから設定をエクスポートし、フェイルオーバ側にインポートします。

OAuth2 構成データのエクスポート 

set items = $name(^|"^^:ds:IRISSECURITY"|SECURITY("OAuth2"))_".gbl"
set filename = "/home/oauth2data.gbl"
do $SYSTEM.OBJ.Export(items,filename)

OAuth2 構成データのインポート

do $SYSTEM.OBJ.Import(filename)

SQL Security 

これまでは、SQL セキュリティは CPF パラメータ DBMSSecurity によって制御されていました。もし DBMSSecurity が無効であれば、SQL権限のあるユーザは、データベース内のすべてのセキュリティテーブルに任意のクエリを実行できました。 

InterSystems IRIS 2025.2 では以下のようになります。

  • CPF パラメータ DBMSSecurity は、以下のシステムワイドの SQL セキュリティプロパティに置き換わりました。 (管理ポータル > システム管理 > セキュリティ > システム・セキュリティ > システムワイドセキュリティパラメータ > SQLセキュリティを有効にする
  • セキュリティ・テーブルは、詳細および一覧を取得する API を通じてのみアクセス可能となります。APIを利用するには、SQLセキュリティが無効になっている場合でも %DB_IRISSYS:R と %Admin_Secure:U の両方の権限が必要となります。 

たとえば、ロールの一覧を取得するには、Security.Roles テーブルに直接クエリを実行できなくなります。代わりに、以下のように Security.Roles_List() クエリを使用します。

SELECT Name, Description FROM Security.Roles_List()

IRISSECURITY の暗号化

IRISSECURITY を暗号化する手順は以下のとおりです。 

  1. 暗号化キーを作成します。管理ポータル > システム管理 > 暗号化 > 新しい暗号化キーファイルを作成
    • キーファイル – 暗号化キーファイル名 
    • 管理者名 – 管理者の名前 
    • パスワード – キーファイルのパスワード 
  2. 暗号化キーをアクティベートします。管理ポータル > システム管理 > 暗号化 > データベース暗号化 > キー有効 から、上記で作成した キーファイル管理者名パスワード を指定します。 
  3. 管理ポータル > システム管理 > 暗号化 > データベース暗号化 > 起動設定構成
  4. 起動時にキー有効化 ドロップダウンメニューから、キー有効化メソッドを選択します。「インタラクティブ」キー有効を強くお勧めします。
  5. IRISSECURITY データベース暗号 ドロップダウンから 「はい」を選択します。
  6. 暗号化を有効にするため、システムを再起動します。 

%クラスへのアクセスルール

InterSystems IRIS の以前のバージョンでは、ウェブ・アプリケーション用の%クラスにアクセスするには、セキュリティグローバルに値をセットする必要がありました。InterSystems IRIS 2025.2 では、管理ポータルまたは ^SECURITY ルーチンを利用して、この設定を行うことができます。

管理ポータル 

管理ポータルを使って %クラスへのアクセスルールを設定する手順は以下のとおりです。 

  1. 管理ポータル > システム管理 > セキュリティ > アプリケーション > ウェブ・アプリケーション
  2. 設定したいアプリケーションを選択
  3. パーセントクラスアクセス タブから以下のオプションを設定
    • タイプ: このルールを、指定した%クラス (AllowClass) だけに対するアクセスに適用するか、指定した接頭辞を含むすべてのクラス (AllowPrefix) へのアクセスに適用するか
    • クラス名: アプリケーションにアクセスさせる %クラスまたは接頭辞 
    • アクセス許可: 指定された %クラスまたはパッケージへのアクセスをアプリケーションに与えるかどうか
    • すべてのアプリケーションへのアクセスを追加: すべてのアプリケーションにこのルールを適用するか

^SECURITY 

^SECURITY ルールを使ってクラスへのアクセスルールを設定する手順は以下のとおりです。

  1. %SYS ネームスペースで ^SECURITY ルーチンを実行
    DO ^SECURITY
  2. オプション 5, 1, 8 を順に選択し、1 を選択して class access rule プロンプトに入る 
  3. 以下のように指定
    • Application? – アプリケーション名 
    • Allow type? – このルールを、特定のクラスにアクセスできるよう適用するか (AllowClass)、指定した接頭辞を含むすべてのクラスに適用するか (AllowPrefix
    • Class or package name? – アプリケーションにアクセスさせるクラスまたは接頭辞
    • Allow access? – 指定クラスまたはパッケージへのアクセスをアプリケーションに許可するかどうか
Discussão (0)0
Entre ou crie uma conta para continuar