标签: sql-server

我可以物理拆分 SQL Server 数据库吗?

我好像记得前段时间读过一篇文章说我可以将一个 SQL Server 数据库拆分成多个文件,请允许我详细说明。

我有一个数据库,里面有十几个表,这些表反映了过去 'n' 年的统计数据。该表称为History2007,History2008等和当年的表就被称为History。前几年的所有表都包含静态数据(不会更改),我想将这些文件移动到链接到主数据库的另一个文件中。随着旧的数据表中包含外键Articles,Clients而Suppliers等我不能只是这些表复制到一个新的数据库。

整个想法是减少数据库和备份的大小,因为我可以对“旧”数据进行一次备份,并且直到明年才会改变。

有什么想法吗?想法?指导?

谢谢,马丁。

sql-server-2008 sql-server

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

SQL Server 查询性能受重建未分段索引的影响

我在存储过程中有一个查询,当它通常以毫秒为单位运行时,相同的输入将定期超时(> 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

关于其他地方的任何建议或此问题的来源?

sql-server

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

SQL Server 函数调用语法问题

以下摘录是从本页摘录。

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)

sql-server t-sql

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

SQL Server - 包含 PK 的索引

让我们假设我们有一个如下表:

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。

index sql-server-2005 sql-server

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

查询优化:在我的情况下哪个更好 - CURSOR 或基于集合的方法?

首先,我可以描述表的架构,但我的表本身大约是 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 …

sql-server-2008 sql-server query

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

是否可以隐式而不是显式地引用链接服务器?

我正在使用引用链接服务器的视图和存储过程:

SELECT Id, Name
FROM [LinkedServer].Database.dbo.FooView
Run Code Online (Sandbox Code Playgroud)

我想隐藏[LinkedServer].Database或至少隐藏[LinkedServer]我的视图和存储过程的一部分。这样我就可以拥有“与服务器无关”的代码,可以很容易地在生产服务器和开发服务器之间进行比较。

这可以在服务器级别(如链接服务器)或数据库级别(使用它的视图和存储过程)完成。

sql-server linked-server

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

当我告诉光标时,它不打印文本

我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-2008 sql-server cursors

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

关于在系统数据库上创建用户对象的建议

我想在 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

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

在 sql 中管理选择结果

我们需要操作从选择查询返回的一组记录。这可以在:

  1. 通过将整个记录保存到表变量中,然后执行所需的过程。
  2. 我们可以这样做

    Select * from
       (select * from table where conditions) AS results
       where results.RowNum between ....
    
    Run Code Online (Sandbox Code Playgroud)

    那么在这种情况下最好的方法是什么..使用表变量或第二种方法。与第一种方法相比,使用第二种方法是否存在任何性能问题?

sql-server select

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

Sql Server 资源调控器 - 跟踪 IO

我知道我可以使用性能计数器来跟踪资源调控器 CPU 和内存使用情况。是否可以跟踪每个工作负载组的 I/O 使用情况?我没有看到任何具体的或任何推荐的做法。

performance sql-server

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