小编Nic*_*mas的帖子

tsql:大行删除后表数据大小不会缩小

我有一个包含 12 个月以上数据的表格。我备份表然后删除所有行,只保留上个月插入的行。但是表大小不会缩小,底层物理文件也不会缩小。

dbcc showcontig ('mytable') with tableresults;

ObjectName  ObjectId    IndexName   IndexId Level   Pages   Rows    MinimumRecordSize   MaximumRecordSize   AverageRecordSize   ForwardedRecords    Extents ExtentSwitches  AverageFreeBytes    AveragePageDensity  ScanDensity BestCount   ActualCount LogicalFragmentation    ExtentFragmentation
mytable 478624748   PK_Log  1   0   21344   467392  94  8033    237 0   2675    12918   2862,346    64,6361996540647    20,6517532316743    2668    12919   77,8392053973013    71,7757009345794


exec sp_spaceused 'mytable', @updateusage = 'TRUE'

name    rows    reserved    data    index_size  unused
LogTrace    467392      8984976 KB  8930056 KB  21984 KB    32936 KB
Run Code Online (Sandbox Code Playgroud)

这些值意味着表的每一行大约是 19MB!

我尝试在没有更改的情况下重建索引:ALTER INDEX PK_myindex ON mytable REBUILD

我尝试过的其他事情:

select …
Run Code Online (Sandbox Code Playgroud)

sql-server maintenance dbcc

5
推荐指数
1
解决办法
4873
查看次数

5
推荐指数
1
解决办法
2万
查看次数

我如何向这个预测数据库添加时间维度,而不必在每次重新预测时复制每个数据点?

我有一个旨在促进收入预测的数据库。收入预测包括跟踪在多个时间点(每个点,一个收入日期)确认为收入的订单。有两个表(斜体键):

  • 订单:id, orderDate
  • 收入:ForeignKey(Order.id)incomeDate,金额

在任何时候,查询收入表都会给我每个收入日期的总收入。

我想添加一个时间组件,以便我可以跟踪任何给定时间点的收入预测情况。类似于以下内容:

  • 订单:idforecastDate, orderDate
  • 收入:ForeignKey(Order.id)ForeignKey(Order.forecastDate)incomeDate,金额

以这种方式做表将允许我查询(forecastDate,revenueDate)以获得我的答案。不幸的是,它还需要我为每次重新预测复制所有数据点,即使是那些没有改变的数据点。

是否有更有效的方法来设计我的表格,以便每个新预测只需要附加更改或更改的数据点,同时仍然允许我查看任何历史时间点的预测?

===更新===

我实际上并不期望对此有明确的答案,因为 Snodgrass 和 Darwen 等领域的杰出人物似乎对如何最好地在数据库中建模时间存在根本分歧(请参阅 ISO 在 1996 年拒绝时间元素) .

data-warehouse database-design

5
推荐指数
1
解决办法
467
查看次数

在 SQL Server 2008 中使用 MSDTC

我用Hyper-v安装了一台windows 2008服务器机器,然后复制镜像创建另一台并更改计算机名称,它们都在同一个域中,我使用域用户作为管理员来配置它们。

安装 SQL Server 2008 后,我尝试了以下 T-SQL:

SET XACT_ABORT ON
GO

BEGIN DISTRIBUTED TRANSACTION
EXEC CatalogSQLServer.Catalog.dbo.Hello
ROLLBACK
Run Code Online (Sandbox Code Playgroud)

我第一次尝试?我得到的错误信息如下:

链接服务器 '' 的 OLE DB 提供程序 'SQLNCLI' 返回消息 '没有活动的事务

我 100% 确定我已配置 DTC、链接服务器并允许防火墙的所有入站和出站规则。我根据这些说明配置了MSDTC

之后,我尝试使用命令:

msdtc -uninstall 
msdtc -install 
Run Code Online (Sandbox Code Playgroud)

...然后重新启动 dtc 以在 CatalogSQLServer 上重新安装 msdtc。但这一次,当我执行测试脚本时,SSMS会一直执行很长时间但没有得到任何结果。有谁知道如何解决这个问题?

sql-server-2008 sql-server msdtc

5
推荐指数
1
解决办法
1373
查看次数

这种设置有我不知道的原因/好处吗?

我现在管理一个由另一个人设计和创建的 MySQL 数据库。

我对原始开发人员创建的某个设置感到困惑。

他没有对表 ID 使用自动增量。相反,他创建了一个名为system_sequences的表 ,它有两列:

system_sequences.Table_Name 
system_sequences.Next_Value
Run Code Online (Sandbox Code Playgroud)

这是一个表的示例以及它当前如何插入表中(尽我所能):

有一个名为customer的表,有一个唯一的 ID 列。

如果我想插入客户,目前我必须执行以下操作:

SELECT system_sequences.Next_Value 
FROM system_sequences 
WHERE system_sequences.Table_Name = 'customer'
Run Code Online (Sandbox Code Playgroud)

将 next_value 保存到变量中并将其用作客户的下一个 ID

那么我必须:

UPDATE system_sequences 
SET Next_Value = Next_Value + 1 
WHERE system_sequences.Table_Name = 'customer'
Run Code Online (Sandbox Code Playgroud)

我没有设计这个,我不喜欢它的任何形状或形式(我实际上讨厌它)并且我想小心地将所有内容转换为 auto_increment

但是否有原因或我不知道的好处?我以前从未见过类似的东西。并且此数据库没有任何文档可以解释任何内容。

mysql database-design mysql-5.5

5
推荐指数
1
解决办法
298
查看次数

现有条目是否立即包含在新创建的索引中?

假设我有一个Stuff包含一列的表,但City没有包含该列的索引。我填充表格。然后我决定创建一个索引:

CREATE INDEX [StuffOnCityIndex] ON [dbo].[Stuff](City ASC);
Run Code Online (Sandbox Code Playgroud)

并且数据库确认CREATE INDEX成功。

新创建的索引会立即包含表中的所有现有条目还是会在“后台”缓慢构建?换句话说,如果我认为创建索引会提高性能,那么我会在CREATE INDEX完成后立即看到这种改进吗?

performance index sql-server-2008 sql-server

5
推荐指数
1
解决办法
211
查看次数

让多个用户使用一个 sql server 登录有什么好处吗?

我刚刚进入了一个开发项目,其中开发人员使用相同的 SQL Server 登录名连接到中央数据库以进行工作。我以前从未遇到过这种情况,因为每个开发人员通常都有自己的登录名。

  1. 使用这个模型有什么好处吗?
  2. 同一个 SQL Server 登录名的同时连接数是否有限制?

security sql-server

5
推荐指数
1
解决办法
8074
查看次数

带有大 WHERE IN 子句的 SELECT 需要很长时间

我对这一切都很陌生,所以要温柔:)。

我有大型医疗数据库,我需要根据选定的医生为患者提取数据。

现在我建立了一个病人名单

SELECT patID 
FROM appointments 
WHERE docID IN ('docid1', 'docid2', ..... , 'docidn') 
Run Code Online (Sandbox Code Playgroud)

一旦我得到我的病人名单,我就会在从一大堆病人相关的表格中提取数据时使用它。

根据我最初的医生名单,我最终可以得到超过 20,000 名的患者名单。系统中的患者总数接近 1,000,000。

然后我拿我的病人名单开始从其他表中获取数据,或多或少是这样的

Select * 
FROM xrays 
WHERE patID IN ('patid1', 'patid2', 'paid3',....., 'patidn' ) 
Run Code Online (Sandbox Code Playgroud)

我根据第一部分中的列表构建了 patids 列表。

可以想象,对于 20,000 名患者列表,上述查询需要很长时间。

关于更好的方法的任何建议?

mysql performance select

5
推荐指数
1
解决办法
8712
查看次数

添加列花费的时间太长

我正在尝试向数据库添加一列。查询已经运行了 25 分钟,它锁定了对该表的 Web 访问并破坏了我们的网站:

alter table MyTable
add MyNewColumn varchar(max) not null
default ('')
Run Code Online (Sandbox Code Playgroud)

该表在不同的列中包含二进制数据并且非常大。

使用红色的“取消执行查询”按钮取消会导致其他问题吗?我只是想弄清楚此时是否应该尝试取消查询,以及它运行了这么长时间后会发生什么。

sql-server-2008 sql-server

5
推荐指数
2
解决办法
6416
查看次数

将 SQL DB 从关闭的 SQL Server(在域上)还原到现有的 SQL Server(不在域上)

如果我的 SQL 服务器出现故障并且需要很长时间才能恢复,我是否可以在另一台 SQL 服务器上恢复我的数据库并从那里运行我的软件(我可以指出从哪个 SQL 服务器运行)?

所有元数据、索引和外键也会被恢复吗?

此外,我当前的 SQL 服务器在我们的域中,我拥有的另一个在它自己的工作组中......它还有可能吗?还是我需要先将其加入域?

sql-server restore

5
推荐指数
1
解决办法
714
查看次数