gpt4 book ai didi

sql - 重用表变量?

转载 作者:行者123 更新时间:2023-12-05 08:15:08 25 4
gpt4 key购买 nike

我在特定日期时间段(即 05/01/2012 至 05/31/2012)内在数据库上运行复杂查询列表。然后我需要为 06/01/2012 到 06/30/2012 运行相同的查询。然后加入结果以供报告。

在查询中,我使用了几个表变量来保存临时数据。因为数据库很大,所以表变量大小也很大。有没有办法可以重用这些表变量?

DROP,Truncate 将不起作用。我是否必须从@table 中删除所有数据?如果是这样,会不会很慢?因为@table 有很多数据,我是否必须对它进行批量删除?

顺便说一句,由于系统的设计方式,我必须将所有查询放在一个 SP 文件中,不能调用函数或其他 SP。

谢谢

=============================

查询中没有循环。它的工作方式如下:

选择.....选择.....更新.....加入......

对日期 05/01/2012 到 05/31/2012 进行一组查询。然后需要从 06/01/2012 到 06/30/2012 的同一组查询。

在查询中,里面有很多逻辑,所以我们不能把这2个组合成一个查询。由于系统设计,我们不能调用函数或 SP 进行查询。必须按顺序执行第 1 组查询,然后是第 2 组查询。

问题是数据太多,@table太大了。如果我们可以重用@table,它就会解决问题。

谢谢

===============================

是的,现在,相同的代码,针对 2 个不同的日期时间间隔重复两次。然而,在代码中,它有一些逻辑内部,基于日期时间之间的差异的不同过程。抱歉,我无法发布实际代码。但是,这个过程就像一个以不同的日期时间段作为参数的 SP。

但是,在这种情况下我不能使用 SP/函数,所以必须对相同的代码进行两次硬编码。理想情况下,每次重复代码时都需要使用不同的@table(现在,我需要重复 3 次),但是由于数据大小,如果我重复 3 次,@table 就太大了(每次都需要多个@table做逻辑部分)。

也许我最好使用临时表?所以我可以在开始新的“重复”时放弃它?

谢谢

最佳答案

表变量未记录在当前数据库中,并且不受事务影响。为什么您认为截断或删除会比删除更快?你试过这个吗?

DECLARE @f TABLE(id INT);

INSERT @f SELECT 1;

BEGIN TRANSACTION;
DELETE @f WHERE id = 1;
ROLLBACK TRANSACTION;

SELECT id FROM @f;

没有结果。现在,如果删除已完全记录在当前数据库中(这就是 DELETE 比普通用户表的 TRUNCATE 慢的原因),您会期望 DELETE 已回滚,SELECT 应该已返回数据。但是不,删除不是事务的一部分。那么,您可以从逻辑上得出结论,DELETETRUNCATE 如果允许后者,即使不完全相同,也将非常相似。

如果必须使用表变量,只需使用删除即可。如果你发现它很慢,那可能不是因为删除,可能是因为你在循环中重新使用表变量,而不是使用基于集合的操作。但是当然,您比我们任何人都更有优势来测试如果您使用两个不同的@table 变量与重新使用单个表变量并在两者之间发出删除,您的代码会慢多少。但我仍然认为您的整个过程需要重新调查,因为它在很多层面上对我来说都不是最佳选择。

关于sql - 重用表变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11620736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com