Snowflake ODBC 驱动程序与 SQL API

Snowflake ODBC driver vs SQL API

使用 ODBC 驱动程序将我们的 RoR 应用程序连接到 Snowflake 与 SQL API 之间的主要区别是什么?

主要用例是只读访问 运行 针对几个表的各种自定义查询。

我们已经对这两种连接进行了原型设计。两者都运作良好。 运行宁简单查询时,ODBC 似乎更快。

一个用例是在一个请求中执行约 10 个查询。 ODBC 要求我们执行 10 个单独的 SQL 语句。虽然 SQL API 允许我们一起提交查询,但随后需要对每个 statementHandle 进行额外的 API 调用以获取结果。 API 调用速度很快,但仍然是 11 API 次调用。

ODBC 是这里显而易见的选择吗?如果大约 10 个查询增长到 50-100 怎么办?如果结果集是 50-100k+ 行数据怎么办?我确实看到 SQL API 如何划分结果。这可能会派上用场。不确定 ODBC 是如何处理的。

关于安全性、性能等的其他想法要考虑?

谢谢!

首先,可以通过一个请求用 ODBC 发送一批语句:Executing a Batch of SQL Statements (Multi-Statement Support)

除此之外,还有一些差异可能对您的用例无关紧要。例如,ODBC 驱动程序 returns 生成 Apache Arrow 格式。而 REST API 将 return 结果的第一个分区 JSON 和 gzipped JSON.

中的后续分区

其余的 api 有一些限制,主要是基于 REST API 无法跨请求维护会话以及其他一些怪癖,例如无法将文件放入阶段(包括非结构化)。

ODBC 驱动程序(和其他官方连接器)将始终可以访问 Snowflake 上的任何命令,因为它们可以维护会话。所以这最终会归结为个人喜好和您的应用需要做什么。

另一件需要考虑的事情是 ODBC 驱动程序有多年的发展,SQL API 相对较新。 (尽管从各方面来看,效果都很好)

来自文档的 SQL API 的限制。

不支持以下命令:

  • PUT 命令(在 Snowflake SQL)

  • GET 命令(在 Snowflake SQL)

  • The CALL command with stored procedures that return a table (stored procedures with the RETURNS TABLE clause).

仅在指定多个语句的请求中支持以下命令和语句:

执行显式事务的命令,包括:

  • 开始
  • 提交
  • 回滚

更改会话上下文的命令,包括:

  • 使用

  • 改变会话

  • 设置会话变量的语句。

  • 创建临时 tables 和阶段的语句(tables 和阶段仅在当前会话中可用)。