获取SQL中的最后几个查询结果
我经常对SQL数据库进行静态分析,在此期间,除了我之外,没有人能够更改数据 但是,我还没有找到一种方法来“告诉”SQL,以防止多次运行同一查询 下面是我想做的,首先我从一个输出非常小的复杂查询开始获取SQL中的最后几个查询结果,sql,caching,Sql,Caching,我经常对SQL数据库进行静态分析,在此期间,除了我之外,没有人能够更改数据 但是,我还没有找到一种方法来“告诉”SQL,以防止多次运行同一查询 下面是我想做的,首先我从一个输出非常小的复杂查询开始 SELECT * FROM MYTABLE WHERE MYPROPERTY = 1234 然后,我从同一窗口运行一个简单的查询(如果相关的话,主要使用SQLServerStudio) 现在我突然意识到我忘记保存第一次复杂(缓慢)查询的结果 正如我所知,基础数据没有改变(或者即使改变了),我想后退一
SELECT * FROM MYTABLE WHERE MYPROPERTY = 1234
然后,我从同一窗口运行一个简单的查询(如果相关的话,主要使用SQLServerStudio)
现在我突然意识到我忘记保存第一次复杂(缓慢)查询的结果
正如我所知,基础数据没有改变(或者即使改变了),我想后退一步,简单地得到结果。然而,目前我不知道做这件事的诀窍,我必须再次运行整个查询
因此,问题的摘要是:如何(自动存储/)从最近执行的查询中获得结果
我对简单的select查询特别感兴趣,并且很乐意为自动结果存储分配100MB内存。更喜欢在SQL server studio中使用T-SQL的解决方案,但也欢迎使用其他SQL解决方案
编辑:我不是在寻找手动防止这种情况发生的方法。在我可以预见问题不会发生的情况下。最简单的方法是在自己的SSMS窗口中运行每个查询,结果将保留在那里,直到您关闭它,或者内存不足-除此之外,我不确定是否有办法实现您想要的
一旦关闭SSMS窗口,我不相信有办法返回“缓存”结果。我不确定这是否是您想要的。不管怎样,检查我的答案 在SQLServerManagementStudio中,可以打开多个选项卡以执行查询。为每个查询打开新选项卡,则执行查询的结果将在该选项卡下可用
在选项卡中执行一个查询后,不要将该选项卡用于新查询,请打开该作业的新选项卡。我经常遇到这种情况,我通常只是将较长时间运行的查询结果放入临时表中:
SELECT *
INTO #results1
FROM MYTABLE WHERE MYPROPERTY = 1234
SELECT *
FROM #results1
如果查询运行时间很长,我可能会使用“real”表。这是节省重新运行时间的好方法
缺点是它会增加您的查询
您还可以将查询结果发送到SSMS中的文件,有关格式化输出的信息如下:您是否考虑过使用某种脱机SQL客户端,如Excel?具体地说,Excel将把结果检索到电子表格中(使用数据功能区/菜单),在那里它们几乎永久地存储为结果。它会在必要时提示您刷新,或者您可以根据需要进行刷新
您关于是否可以在T/SQL或其他数据库中执行此操作的问题取决于数据库和结果缓存,即使它们是查询处理器可以使用的选项,也不能保证单个查询。这不是您问题的技术答案。多年来,我一直在编写查询并查看结果,我习惯于将结果保存在Excel中,而不管我使用的是什么数据库/查询工具 Excel中的格式非常有条理:
不过,在你的问题中,我意识到我现在本能地解决了这个问题,因为“右键单击网格,使用列标题复制,alt tab到excel,alt-V”是我很自然的行为。这在Microsoft SQL Server中无法实现。SQL Server不会缓存结果,而是缓存查询访问的数据页。这将使您的查询在第二次运行时运行得更快,这样重新运行它就不会那么痛苦了
在其他数据库中,如Oracle和MySQL,它们确实有一种查询缓存机制,允许您在第二次直接检索结果。我建议您将每个查询运行到脚本中,每次执行查询时(即I++)都会增加一个计数器(存储在表中)并将每个查询存储在名为“tmpTable”+i的临时表中,但这听起来非常复杂。我说得对吗 然后我在谷歌上找到了这个工具包:我没有试过,但你可以看看: 希望能有帮助 编辑:添加了机翼链接。有一个输出为XML文件的选项,他们提到SQL Server Integration Services也是一个可能的解决方案。 第二次编辑:还有一个独立于DBMS的工具,听起来很有趣:
虽然我不确定它是否符合我所描述的,但我可能正在寻找sql server FWIW的
结果缓存模式
,sql server在缓存查询方面做得相当不错,它可能足够聪明,可以意识到没有人做过任何更改。您确定再次运行整个查询是件坏事吗?也许最好的解决方案是“没有解决方案”。@catfood我已经尝试过很多次了,但实际上,如果我运行同一个查询两次,我从来没有注意到执行时间有显著的改进。对于任何查询,几乎没有办法做到这一点,因为它的性能太高了。您可以编写一个单独的软件来
SELECT *
INTO #results1
FROM MYTABLE WHERE MYPROPERTY = 1234
SELECT *
FROM #results1