我好像记得前段时间读过一篇文章说我可以将一个 SQL Server 数据库拆分成多个文件,请允许我详细说明。
我有一个数据库,里面有十几个表,这些表反映了过去 'n' 年的统计数据。该表称为History2007,History2008等和当年的表就被称为History。前几年的所有表都包含静态数据(不会更改),我想将这些文件移动到链接到主数据库的另一个文件中。随着旧的数据表中包含外键Articles,Clients而Suppliers等我不能只是这些表复制到一个新的数据库。
整个想法是减少数据库和备份的大小,因为我可以对“旧”数据进行一次备份,并且直到明年才会改变。
有什么想法吗?想法?指导?
谢谢,马丁。
我在存储过程中有一个查询,当它通常以毫秒为单位运行时,相同的输入将定期超时(> 30 秒)。
该表有 2077748 行、59 列和 13 个索引。我们发现重建其中一个索引会使性能恢复到毫秒级。
这是有趣的部分。此索引每次重建时的碎片百分比小于 1%,上次为 0.01%。我一直在玩填充因子,因为我认为这可能是一个扩展问题,它是 100,然后是 80,现在是 60。这并没有影响这个问题的频率。
当我运行以下
select b.name,*
from sys.dm_db_index_physical_stats(5,1075691080,NULL,NULL,NULL) a
JOIN sys.indexes b ON a.object_id = b.object_id AND a.index_id = b.index_id
Run Code Online (Sandbox Code Playgroud)
我得到
index_id partition_number index_type_desc alloc_unit_type_desc index_depth index_level avg_fragmentation_in_percent fragment_count avg_fragment_size_in_pages page_count
66 1 非聚集索引 IN_ROW_DATA 3 0 0.01 1116 18.9229390681004 21118
关于其他地方的任何建议或此问题的来源?
以下摘录是从本页摘录。
CURRENT_USER (Transact-SQL)
返回当前用户的名称。此函数等效于 USER_NAME()。
当我使用以下 TSQL 脚本(有问题的脚本被注释)执行这两个函数时,我对调用语法感到困惑。我想知道何时使用括号,何时不使用。谢谢!
SELECT CURRENT_USER
-- SELECT CURRENT_USER() -- Error!
SELECT USER_NAME()
-- SELECT USER_NAME -- Error!
Run Code Online (Sandbox Code Playgroud) 让我们假设我们有一个如下表:
PK -- nonclustered primary key
Col1 -- unique clustered
Col2
Col3
Run Code Online (Sandbox Code Playgroud)
这是指数:
nonclustered index on (Col2, Col3)
Run Code Online (Sandbox Code Playgroud)
与此索引的任何不同:
nonclustered index on (Col2, Col3) include (PK)
Run Code Online (Sandbox Code Playgroud)
如果我的 PK 是集群的而不是非集群的怎么办?现在它有所作为/没有有所作为吗?
编辑添加:
我想这是一种迂回的提问方式:非聚集索引的指针是基于聚集索引还是主键返回到表?我假设使用的是聚集索引 RID。
首先,我可以描述表的架构,但我的表本身大约是 80GB,所以我希望一些专家的眼睛可以看到可以执行的任何明显的优化。我正在进行一些基于活动的分析,以了解来自内部虚拟游戏环境的一组用户。
我有两个基表:
EventTable: Moderately big at 10GB
Activity_ID UserName ActivityStart ActivityEnd Badge
ActivityTable: Super big at 100GB
UserName ActivityTime Game1Points Game2Points
Run Code Online (Sandbox Code Playgroud)
简而言之,我正在尝试以下操作:
- For each activity in the EventTable:
- Compute the median of Game1Points, Game2Points
for two cases: for all entries in the ActivityTable
that were present since 1 hour before the activity
and for all entries stored during the activity itself
Run Code Online (Sandbox Code Playgroud)
因此,我期待的决赛桌是这样的:
ResultTable:
Activity_ID Badge Game1_Before Game1_During Game2_Before Game2_During
Run Code Online (Sandbox Code Playgroud)
这显然看起来像是CURSORs的工作,所以我首先使用这种方法编写了我的查询。它正在运行,我可以看到进度,但在阅读了这么多恐怖故事之后,我决定用基于集合的方法重写我的 200 行基于 CURSOR 的方法。这非常适用于小桌子。但是,对于我这种大小的桌子,它似乎停滞不前(或者至少我不确定应该运行多长时间)。我运行Display …
我正在使用引用链接服务器的视图和存储过程:
SELECT Id, Name
FROM [LinkedServer].Database.dbo.FooView
Run Code Online (Sandbox Code Playgroud)
我想隐藏[LinkedServer].Database或至少隐藏[LinkedServer]我的视图和存储过程的一部分。这样我就可以拥有“与服务器无关”的代码,可以很容易地在生产服务器和开发服务器之间进行比较。
这可以在服务器级别(如链接服务器)或数据库级别(使用它的视图和存储过程)完成。
我WAITFOR在以下脚本中与游标结合使用:
create table orders(orderId int primary key,productId int,productName varchar(20));
insert into orders values(1,11,'book');
insert into orders values(2,13,'flower');
insert into orders values(3,24,'microwave');
insert into orders values(4,7,'food');
insert into orders values(5,46,'clothes');
declare cur cursor for
select * from orders;
open cur;
fetch next from cur;
while(@@fetch_status=0)
begin
waitfor delay '00:00:01';
fetch next from cur;
end;
close cur;
deallocate cur;
Run Code Online (Sandbox Code Playgroud)
我希望每 1 秒的指定间隔显示来自光标的一条记录。例如:显示第一行,然后等待一秒钟;显示第二行,然后稍等;等等。上面的光标不会这样做。说orders有 5 行。该WHILE块等待 5 秒钟,然后一起显示所有记录。
这是游标的错吗?如何修改此脚本以按预期工作?
我想在 SQL Server 上使用 Service Broker 为我们的生产数据库设置一堆事件通知。
我在我的测试机器上设置了一个新数据库,一切正常。问题是我宁愿不必为此通知目的部署整个数据库,而且我不能使用一个已经到位的用户数据库(无论如何,这将是一团糟)。
如果可能,我最好将通知对象部署在 上master,但首先我想确定这实际上是一个好主意(如果确实如此)。
从网上书籍:
不要在 master 中创建用户对象。如果这样做,必须更频繁地备份 master。
Books Online建议我不要在master. 此外,我们已经master经常备份我们的数据库。
master在这种情况下,我应该使用数据库还是其他东西?
master在设置之前,我应该了解数据库、服务代理或事件通知吗?
sql-server-2005 sql-server sql-server-2008-r2 service-broker event-notification
我们需要操作从选择查询返回的一组记录。这可以在:
我们可以这样做
Select * from
(select * from table where conditions) AS results
where results.RowNum between ....
Run Code Online (Sandbox Code Playgroud)
那么在这种情况下最好的方法是什么..使用表变量或第二种方法。与第一种方法相比,使用第二种方法是否存在任何性能问题?
我知道我可以使用性能计数器来跟踪资源调控器 CPU 和内存使用情况。是否可以跟踪每个工作负载组的 I/O 使用情况?我没有看到任何具体的或任何推荐的做法。