我有一个包含 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 2000 数据库还原到 SQL Server 2008 实例?
我有一个旨在促进收入预测的数据库。收入预测包括跟踪在多个时间点(每个点,一个收入日期)确认为收入的订单。有两个表(斜体键):
在任何时候,查询收入表都会给我每个收入日期的总收入。
我想添加一个时间组件,以便我可以跟踪任何给定时间点的收入预测情况。类似于以下内容:
以这种方式做表将允许我查询(forecastDate,revenueDate)以获得我的答案。不幸的是,它还需要我为每次重新预测复制所有数据点,即使是那些没有改变的数据点。
是否有更有效的方法来设计我的表格,以便每个新预测只需要附加更改或更改的数据点,同时仍然允许我查看任何历史时间点的预测?
===更新===
我实际上并不期望对此有明确的答案,因为 Snodgrass 和 Darwen 等领域的杰出人物似乎对如何最好地在数据库中建模时间存在根本分歧(请参阅 ISO 在 1996 年拒绝时间元素) .
我用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会一直执行很长时间但没有得到任何结果。有谁知道如何解决这个问题?
我现在管理一个由另一个人设计和创建的 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
但是否有原因或我不知道的好处?我以前从未见过类似的东西。并且此数据库没有任何文档可以解释任何内容。
假设我有一个Stuff包含一列的表,但City没有包含该列的索引。我填充表格。然后我决定创建一个索引:
CREATE INDEX [StuffOnCityIndex] ON [dbo].[Stuff](City ASC);
Run Code Online (Sandbox Code Playgroud)
并且数据库确认CREATE INDEX成功。
新创建的索引会立即包含表中的所有现有条目还是会在“后台”缓慢构建?换句话说,如果我认为创建索引会提高性能,那么我会在CREATE INDEX完成后立即看到这种改进吗?
我刚刚进入了一个开发项目,其中开发人员使用相同的 SQL Server 登录名连接到中央数据库以进行工作。我以前从未遇到过这种情况,因为每个开发人员通常都有自己的登录名。
我对这一切都很陌生,所以要温柔:)。
我有大型医疗数据库,我需要根据选定的医生为患者提取数据。
现在我建立了一个病人名单
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 名患者列表,上述查询需要很长时间。
关于更好的方法的任何建议?
我正在尝试向数据库添加一列。查询已经运行了 25 分钟,它锁定了对该表的 Web 访问并破坏了我们的网站:
alter table MyTable
add MyNewColumn varchar(max) not null
default ('')
Run Code Online (Sandbox Code Playgroud)
该表在不同的列中包含二进制数据并且非常大。
使用红色的“取消执行查询”按钮取消会导致其他问题吗?我只是想弄清楚此时是否应该尝试取消查询,以及它运行了这么长时间后会发生什么。
如果我的 SQL 服务器出现故障并且需要很长时间才能恢复,我是否可以在另一台 SQL 服务器上恢复我的数据库并从那里运行我的软件(我可以指出从哪个 SQL 服务器运行)?
所有元数据、索引和外键也会被恢复吗?
此外,我当前的 SQL 服务器在我们的域中,我拥有的另一个在它自己的工作组中......它还有可能吗?还是我需要先将其加入域?
sql-server ×7
mysql ×2
performance ×2
restore ×2
dbcc ×1
index ×1
maintenance ×1
msdtc ×1
mysql-5.5 ×1
security ×1
select ×1