Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取SQL中的最后几个查询结果_Sql_Caching - Fatal编程技术网

获取SQL中的最后几个查询结果

获取SQL中的最后几个查询结果,sql,caching,Sql,Caching,我经常对SQL数据库进行静态分析,在此期间,除了我之外,没有人能够更改数据 但是,我还没有找到一种方法来“告诉”SQL,以防止多次运行同一查询 下面是我想做的,首先我从一个输出非常小的复杂查询开始 SELECT * FROM MYTABLE WHERE MYPROPERTY = 1234 然后,我从同一窗口运行一个简单的查询(如果相关的话,主要使用SQLServerStudio) 现在我突然意识到我忘记保存第一次复杂(缓慢)查询的结果 正如我所知,基础数据没有改变(或者即使改变了),我想后退一

我经常对SQL数据库进行静态分析,在此期间,除了我之外,没有人能够更改数据

但是,我还没有找到一种方法来“告诉”SQL,以防止多次运行同一查询

下面是我想做的,首先我从一个输出非常小的复杂查询开始

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中的格式非常有条理:

  • 每个工作表都有日期。(被称为“7月1日”。)
  • 每个电子表格包含一个月。(通常使用月份名称,如“work-201307”。)
  • 在“B”列中,我复制并粘贴查询
  • 在下面的“C”列中,我复制并粘贴结果
  • 下一个查询在几行之后开始,一行接一行
  • 我将查询放在“B”列中,这样我就可以转到“A”列并使用它来访问第一行。我将结果放在“C”列中,这样我就可以转到“B”列并使用它在查询之间移动

    我这样做主要是为了回去看看几个月前我做的工作。例如,有人从2月份发了一封电子邮件,说“再做一次”。我可以回到二月份的电子表格,回到它创建的那天,看看我当时在做什么


    不过,在你的问题中,我意识到我现在本能地解决了这个问题,因为“右键单击网格,使用列标题复制,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