在比较两个不同查询的执行时间时,清除缓存以确保第一个查询的执行不会改变第二个查询的性能非常重要。
在 Google 搜索中,我可以找到以下命令:
DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
Run Code Online (Sandbox Code Playgroud)
事实上,在多次执行后,我的查询需要比以前更现实的时间来完成。但是,我不确定这是推荐的技术。
最佳做法是什么?
我刚刚开始使用 Postgres。阅读此文档时,我遇到了以下查询:
SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
我可以理解这个查询中的所有内容,除了这个:FROM apod, ...
。
这,
是什么意思?我习惯于连接但不习惯于用FROM
逗号分隔的多个语句。
我在网上搜索无果。在查看并思考之后,在我看来,它声明了一个名为 query 的变量,因此它可以多次使用它。但如果这是真的,这与什么有关系FROM
?
我有一些单元测试来操作数据库中的数据。为了保证数据库状态在所有测试中始终相同,我们尝试database snapshot
在这些测试开始时恢复。
恢复代码如下所示:
USE Master
ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE {0} FROM DATABASE_SNAPSHOT = '{1}' WITH RECOVERY
ALTER DATABASE {0} SET MULTI_USER
Run Code Online (Sandbox Code Playgroud)
在此之后,测试连接到数据库并执行它们需要执行的任何操作。
问题是,在测试调试期间,如果最终我需要点击stop
按钮取消测试,数据库将Restoring
永远处于该状态。这很奇怪,因为它只在我停止调试会话时发生。如果我有 20 个测试并且所有测试都在测试之前恢复了快照,那么在这些测试执行期间我将不会出错。
您对可能导致这种情况的原因有什么建议吗?
编辑
补充@usr 的响应,要从测试开始时的不一致状态中恢复数据库,有必要将REPLACE
选项添加到restore 语句中。
如果它是这样的,它将起作用:
USE Master
ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE {0} FROM DATABASE_SNAPSHOT = '{1}' WITH RECOVERY, REPLACE
ALTER DATABASE {0} SET MULTI_USER
Run Code Online (Sandbox Code Playgroud)