文章 "SQLite: MQL5 原生 SQL 数据库操纵" - 页 9 123456789101112 新评论 JRandomTrader 2021.11.21 09:42 #81 Maxim Kuznetsov #: SQLite 是为一个线程或一个作者和许多读者设计的。许多作者并不关心它,而是关心其他不 "轻 "的基础。 这与 MQL 无关--它就是这样,而且无处不在。 这也是我希望看到 PostgreSQL 工作的另一个原因。 Maxim Kuznetsov 2021.11.21 09:58 #82 JRandomTrader #:这也是我希望看到 PostgreSQL 工作的另一个原因。 那就做啊,有什么问题呢?允许使用 DLL 并使用它。 我不是 PostgreSQL 用户,但我使用过 MySQL、MonetDB、SQL Relay 和 mt5 的 ODBC。 当有需要时,自己动手比等待大自然的恩赐更方便快捷。 Daniil Kurmyshev 2021.11.28 03:08 #83 Maxim Kuznetsov #:查询速度会下降,内存需求会增加....但一切正常 :-)SQLite 是为一个线程或一个写入器和多个读取器设计的。许多写入者并不关心它,关心它的其他基础并不 "轻"。 这与 MQL 无关 - 它就是这样,而且无处不在。 也许你不知道如何准备 SQLite,它没有瓶颈,即如一个单一的 TCP 服务器,它会摧毁所有传入的数据流,这个服务器是在所有其他数据库...... SQLite 是一种天赋,如果准备得当,写入请求的速度将高于 Redis,而关于读取本身,当你从基础线程读取时,线程之间不会相互阻塞,一切都会以尽可能快的速度发生,在你的系统资源中休息,你也有机会在 RAM 中部署数据库,这并不重要,在创建时,你可以通过特殊软件在 RAM 中创建一个磁盘,并在上面放置数据库和创建一个符号链接,如果你用于顾问等,这将提供尽可能高的 性能。 也许你还不明白为什么在 SQLite 中需要共享缓存......,这是为了节省输入输出的内存资源,以便最终 减少 专家顾问和脚本的内存消耗,这只是因为为它们的工作分配了单独的线程,而没有为指标分配单独的线程。 当使用共享缓存模式时,与基础的连接是为整个进程打开的,而不是为单独的线程打开的,这样可以节省资源,但结果会导致我上面描述的类似错误,并且共享缓存会减慢基础的工作速度。 我一方面可以理解 MQL 开发人员的决定,但另一方面也不太理解,因为我有很多使用该平台的经验,还没有遇到过有人同时运行超过 200 个线程的情况,在 1 个终端中限制为 100 个图表,因此您可以为每个图表附加 1 个智能交易系统和 1 个脚本,但您也可以运行服务,关于服务的数量我认为没有限制,但这至少在任何情况下都是不方便和资源密集型的,而且如果这些线程打开了自己与数据库的连接,那么相对于内存而言就是沧海一粟。 对终端的这种使用至少是不方便的,最多是毫无意义的,因为有能力的开发人员会将多货币智能交易系统作为单线程来制作,而不会从事这种无意义的工作。 亲爱的开发人员,请删除常用缓存,或者告诉我漏掉了什么。 从官方文档中摘录了关于"SQLite 共享缓存"的要点: "这可以大大减少系统所需的内存和 IO 数量。 这是链接,请阅读。 Anatoli Kazharski 2022.10.05 01:54 #84 在 MetaEditor中 ,这些 用于处理数据库的按钮("运行 " 除外)还不能用吗? 它们始终处于锁定状态。 Anatoli Kazharski 2022.10.05 13:40 #85 此查询不会返回任何结果: PRAGMA foreign_keys; 尝试包含FOREIGN KEY 失败: string query = "PRAGMA foreign_keys=ON;"; if(!DatabaseExecute(m_db_handle, query)) { Print(__FUNCTION__, " > Query failed with code: ", GetLastError()); } 文档中有这样的信息:https://www.sqlite.org/foreignkeys.html#fk_enable Tip: If the command "PRAGMA foreign_keys" returns no data instead of a single row containing "0" or "1", then the version of SQLite you are using does not support foreign keys (either because it is older than 3.6.19 or 因为编译时 定义了SQLITE_OMIT_FOREIGN_KEY 或SQLITE_OMIT_TRIGGER)。 忽略触发器 定义此选项将省略对 TRIGGER 对象的支持。在这种情况下,CREATE TRIGGER 或 DROP TRIGGER 命令 都不可用,尝试执行这两种 命令 都会导致解析错误。该选项还禁止执行外键约束,因为实现触发器的代码和该选项省略的代码也用于实现外键操作。 sqlite_omit_foreign_key 如果定义了该选项,则外键约束 语法 将不被识别。 版本没有问题: //--- 如何启用外键? Renat Fatkhullin 2022.10.05 14:28 #86 Anatoli Kazharski #:该查询不会返回任何结果:尝试包含FOREIGN KEY 失败:文档中有这样的信息:https://www.sqlite.org/foreignkeys.html#fk_enable版本没有问题://---如何启用FOREIGN KEY?FOREIGN KEY 是默认启用的,我们不使用 SQLITE_OMIT_FOREIGN_KEY 或 SQLITE_OMIT_TRIGGER。 不应使用PRAGMA foreign_keys=ON;。 。 要检查性能,可以使用示例https://www.sqlite.org/foreignkeys.html。CREATE TABLE artist( artistid INTEGER PRIMARY KEY, artistname TEXT ); CREATE TABLE track( trackid INTEGER, trackname TEXT, trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES artist(artistid) );在编辑器中工作时,一切运行正常,没有错误。 Anatoli Kazharski 2022.10.05 15:01 #87 Renat Fatkhullin #:FOREIGN KEY 默认启用,我们不使用 SQLITE_OMIT_FOREIGN_KEY 或 SQLITE_OMIT_TRIGGER。 不应使用PRAGMA foreign_keys=ON;。 要检查性能,可以使用https://www.sqlite.org/foreignkeys.html 示例。在编辑器中工作时,一切运行正常,没有错误。 感谢您的回答! 由于某些原因,我没有得到预期的结果: //--- 错误出在哪里? 这也是我想解决的问题: 关于交易、自动交易系统和交易策略测试的论坛 讨论文章 "SQLite:在 MQL5 中使用 SQL 数据库的本地工作"。 Anatoli Kazharski, 2022.10.05 01:54 AM 在 MetaEditor中, 这些 用于处理数据库的按钮(执行 除外)还不能用吗? 它们总是被阻止。 Anatoli Kazharski 2022.10.05 17:53 #88 请找人重现上述示例。 不应添加轨迹 表中的最后一行(高亮显示)。 Anatoli Kazharski 2022.10.06 01:22 #89 在SQLiteStudio 中测试了相同的模式,一切正常。 当尝试添加 父表中不存在的ID 行时,警告应该是这样的: Renat Fatkhullin 2022.10.06 01:31 #90 谢谢,我们会去看看的。 123456789101112 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
Maxim Kuznetsov #:
SQLite 是为一个线程或一个作者和许多读者设计的。许多作者并不关心它,而是关心其他不 "轻 "的基础。
这与 MQL 无关--它就是这样,而且无处不在。
这也是我希望看到 PostgreSQL 工作的另一个原因。
这也是我希望看到 PostgreSQL 工作的另一个原因。
那就做啊,有什么问题呢?允许使用 DLL 并使用它。
我不是 PostgreSQL 用户,但我使用过 MySQL、MonetDB、SQL Relay 和 mt5 的 ODBC。
当有需要时,自己动手比等待大自然的恩赐更方便快捷。
查询速度会下降,内存需求会增加....
但一切正常 :-)
SQLite 是为一个线程或一个写入器和多个读取器设计的。许多写入者并不关心它,关心它的其他基础并不 "轻"。
这与 MQL 无关 - 它就是这样,而且无处不在。也许你不知道如何准备 SQLite,它没有瓶颈,即如一个单一的 TCP 服务器,它会摧毁所有传入的数据流,这个服务器是在所有其他数据库......
SQLite 是一种天赋,如果准备得当,写入请求的速度将高于 Redis,而关于读取本身,当你从基础线程读取时,线程之间不会相互阻塞,一切都会以尽可能快的速度发生,在你的系统资源中休息,你也有机会在 RAM 中部署数据库,这并不重要,在创建时,你可以通过特殊软件在 RAM 中创建一个磁盘,并在上面放置数据库和创建一个符号链接,如果你用于顾问等,这将提供尽可能高的 性能。
也许你还不明白为什么在 SQLite 中需要共享缓存......,这是为了节省输入输出的内存资源,以便最终 减少 专家顾问和脚本的内存消耗,这只是因为为它们的工作分配了单独的线程,而没有为指标分配单独的线程。
当使用共享缓存模式时,与基础的连接是为整个进程打开的,而不是为单独的线程打开的,这样可以节省资源,但结果会导致我上面描述的类似错误,并且共享缓存会减慢基础的工作速度。
我一方面可以理解 MQL 开发人员的决定,但另一方面也不太理解,因为我有很多使用该平台的经验,还没有遇到过有人同时运行超过 200 个线程的情况,在 1 个终端中限制为 100 个图表,因此您可以为每个图表附加 1 个智能交易系统和 1 个脚本,但您也可以运行服务,关于服务的数量我认为没有限制,但这至少在任何情况下都是不方便和资源密集型的,而且如果这些线程打开了自己与数据库的连接,那么相对于内存而言就是沧海一粟。
对终端的这种使用至少是不方便的,最多是毫无意义的,因为有能力的开发人员会将多货币智能交易系统作为单线程来制作,而不会从事这种无意义的工作。
亲爱的开发人员,请删除常用缓存,或者告诉我漏掉了什么。
从官方文档中摘录了关于"SQLite 共享缓存"的要点:
"这可以大大减少系统所需的内存和 IO 数量。
这是链接,请阅读。
在 MetaEditor中 ,这些 用于处理数据库的按钮("运行 " 除外)还不能用吗?
它们始终处于锁定状态。
此查询不会返回任何结果:
尝试包含FOREIGN KEY 失败:
文档中有这样的信息:https://www.sqlite.org/foreignkeys.html#fk_enable
Tip: If the command "PRAGMA foreign_keys" returns no data instead of a single row containing "0" or "1", then the version of SQLite you are using does not support foreign keys (either because it is older than 3.6.19 or
因为编译时 定义了SQLITE_OMIT_FOREIGN_KEY 或SQLITE_OMIT_TRIGGER)。
忽略触发器
sqlite_omit_foreign_key
版本没有问题:
//---
如何启用外键?
该查询不会返回任何结果:
尝试包含FOREIGN KEY 失败:
文档中有这样的信息:https://www.sqlite.org/foreignkeys.html#fk_enable
版本没有问题:
//---
如何启用FOREIGN KEY?
FOREIGN KEY 是默认启用的,我们不使用 SQLITE_OMIT_FOREIGN_KEY 或 SQLITE_OMIT_TRIGGER。
不应使用PRAGMA foreign_keys=ON;。。
要检查性能,可以使用示例https://www.sqlite.org/foreignkeys.html。
CREATE TABLE artist( artistid INTEGER PRIMARY KEY, artistname TEXT ); CREATE TABLE track( trackid INTEGER, trackname TEXT, trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES artist(artistid) );在编辑器中工作时,一切运行正常,没有错误。
FOREIGN KEY 默认启用,我们不使用 SQLITE_OMIT_FOREIGN_KEY 或 SQLITE_OMIT_TRIGGER。
不应使用PRAGMA foreign_keys=ON;。要检查性能,可以使用https://www.sqlite.org/foreignkeys.html 示例。
在编辑器中工作时,一切运行正常,没有错误。
感谢您的回答!
由于某些原因,我没有得到预期的结果:
//---
错误出在哪里?
这也是我想解决的问题:
关于交易、自动交易系统和交易策略测试的论坛
讨论文章 "SQLite:在 MQL5 中使用 SQL 数据库的本地工作"。
Anatoli Kazharski, 2022.10.05 01:54 AM
在 MetaEditor中, 这些 用于处理数据库的按钮(执行 除外)还不能用吗?
它们总是被阻止。
请找人重现上述示例。
不应添加轨迹 表中的最后一行(高亮显示)。
在SQLiteStudio 中测试了相同的模式,一切正常。
当尝试添加 父表中不存在的ID 行时,警告应该是这样的: