Questions tagged «sql-server-2008»

SQL Server 2008(主要版本10.00.xxxx)。请同时用sql-server标记。

3
通过存储过程模拟TSQL序列
我需要创建一个模拟TSQL序列的存储过程。就是说,它总是在每次调用时提供递增的不同整数值。另外,如果传入一个整数,则在没有结果大于或没有下一个最大整数的情况下,应返回该值。不用说可以有多个客户端同时调用此SP。 给定具有列MetaKey varchar(max)和MeatValueLong bigInt的表MetaInfo。预期MetaKey为“ Internal-ID-Last”的行将包含分配的最后一个最大值。我创建了以下存储过程: CREATE PROCEDURE [dbo].[uspGetNextID] ( @inID bigInt ) AS BEGIN SET NOCOUNT ON; BEGIN TRANSACTION UPDATE MetaInfo WITH (ROWLOCK) SET MetaValueLong = CASE WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1 ELSE @inID+1 END WHERE MetaKey = 'Internal-ID-Last' SELECT MetaValueLong FROM MetaInfo WHERE MetaKey = 'Internal-ID-Last' COMMIT TRANSACTION …

3
是否可以通过更新分区键在分区之间移动行?
我认为这将是一个相当简单的问题,但实际上,我很难找到答案。 问题:您是否可以通过简单地更新分区列使其越过分区边界,将分区表中的数据行从一个分区移至另一个分区? 例如,如果我有一个带有分区键的表: CREATE TABLE SampleTable ( SampleID INT PRIMARY KEY, SampleResults VARCHAR(100) NOT NULL, ) 使用映射到主键的分区功能: CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS RANGE LEFT FOR VALUES (10000, 20000); 是否可以通过将SampleID从1更改为(例如)500,000,将行从第一分区移动到第三分区? 注意:我将其标记为sql server 2005和2008,因为它们都支持分区。他们有不同的处理方式吗?

3
如何保证SQL Server 2008 R2的插入内容首先缓存在RAM中?
想象一下一个“突发”的数据流,即可能有10,000个事件很快到达,随后一分钟什么也没到达。 您的专家建议:如何编写SQL Server的C#插入代码,以确保SQL立即将所有内容缓存在其自己的RAM中,而不会阻塞我的应用程序,而不会超出将数据馈入所述RAM所需的时间?为此,您是否知道用于设置SQL Server本身的任何模式,或者用于设置我要写入的单个SQL表的模式? 当然,我可以做自己的版本,这涉及在RAM中构造自己的队列-但我不想重塑旧石器时代的石斧。

6
尝试查看数据库层次结构时出现“超出了锁定请求超时期限”错误
我的数据库有问题。 我可以运行基本查询,尽管比正常情况要慢得多。 当我尝试在SSMS Object Explorer中查看表,视图或过程的层次结构树时,得到lock request time out period exceeded。 我在此数据库中的对象上运行的SSRS报告不再完成。 与该数据库上存储的过程关联的作业也不会运行。 我尝试使用 sp_who2查找并杀死数据库上的所有连接,但是这并没有解决问题。 这里发生了什么?我该如何解决?

1
查找上次更新表的时间
查询: SELECT name AS TableName, create_date AS CreatedDate, modify_date as ModifyDate FROM sys.tables order by ModifyDate; ...会告诉我上次创建和修改表的时间(从DDL角度来看)。但是我想知道上一次实际数据是从表中插入还是从表中删除。是否可以在SQL Server中获得此权限?


4
当包裹在TVF中时,为什么此查询的速度大大降低?
我有一个相当复杂的查询,它仅需几秒钟即可运行,但是当包装到一个表值函数中时,它要慢得多。我实际上并没有完成它,但是它运行了十分钟而没有结束。唯一的变化是用日期参数替换了两个日期变量(用日期文字初始化): 七秒钟内运行 DECLARE @StartDate DATE = '2011-05-21' DECLARE @EndDate DATE = '2011-05-23' DECLARE @Data TABLE (...) INSERT INTO @Data(...) SELECT... SELECT * FROM @Data 至少跑十分钟 CREATE FUNCTION X (@StartDate DATE, @EndDate DATE) RETURNS TABLE AS RETURN SELECT ... SELECT * FROM X ('2011-05-21', '2011-05-23') 之前,我已经使用带有RETURNS @Data TABLE(...)子句的多语句TVF编写了该函数,但是将其替换为内联结构并没有进行明显的更改。TVF的长时间运行是实际SELECT * FROM X时间;实际上创建UDF只需几秒钟。 …

3
休眠的SPID阻止了其他事务
我确实很难找到我们遇到的一些障碍。 根阻止SPID的状态为“正在休眠”,cmd为“正在等待命令”,并且sqltext为SET TRANSACTION ISOLATION LEVEL READ COMMITTED。 当我查看“按阻塞的交易计数列出的最高交易”报告时,阻塞的SQL语句为“-”。 我已经在SQL上执行了跟踪,并且当阻塞发生时是在跟踪根阻塞SPID,但它并没有真正引导我到任何地方。最后一个trace语句与sqltext上面的相同SET TRANSACTION ISOLATION LEVEL READ COMMITTED。 我检查了所有可以找到的相关存储过程,以确保它们具有TRY / CATCH BEGIN TRAN / COMMIT TRAN / ROLLBACK TRAN语句(我们将存储过程用于所有内容,因此没有独立的语句在运行)。该问题在过去的24小时内才刚刚开始发生,并且没有人声称对系统进行了任何更改。 解决方案:我们很少使用的存储过程之一有一个插入错误(列数不匹配),但是我们仍然对正在发生的事情感到困惑。 查看所有跟踪信息时,有时会列出该存储过程的EXEC语句,但绝不会在阻塞SPID上发生BLOCK之前。看来,当它开始阻塞时,跟踪并没有记录它(或其中的任何一条语句)的执行情况。但是,还有其他时间跟踪确实记录了它的执行并且没有发生阻塞。 存储过程错误报告来自用户,我能够在跟踪中找到多个EXEC语句并在SSMS中运行它们。当我运行它们时,我们没有任何阻塞发生或挂起的情况。它们按预期运行(错误后触发catch块并回滚了事务)。解决了存储过程的问题后,我们再也没有看到此问题。

2
如何避免在WHERE子句中使用变量
给定一个(简化的)存储过程,例如: CREATE PROCEDURE WeeklyProc(@endDate DATE) AS BEGIN DECLARE @startDate DATE = DATEADD(DAY, -6, @endDate) SELECT -- Stuff FROM Sale WHERE SaleDate BETWEEN @startDate AND @endDate END 如果Sale表很大,则SELECT可能要花很长时间才能执行,这显然是因为优化器由于局部变量而无法优化。我们测试了SELECT使用变量运行零件,然后对日期进行了硬编码,执行时间从〜9分钟缩短至〜1秒。 我们有许多存储过程可根据“固定”日期范围(周,月,8周等)进行查询,因此输入参数仅为@endDate,而@startDate是在过程内部计算的。 问题是,避免在WHERE子句中使用变量以免损害优化程序的最佳实践是什么? 下面显示了我们提出的可能性。这些最佳实践中的任何一种还是其他方法? 使用包装程序将变量转换为参数。 参数不会像局部变量那样影响优化器。 CREATE PROCEDURE WeeklyProc(@endDate DATE) AS BEGIN DECLARE @startDate DATE = DATEADD(DAY, -6, @endDate) EXECUTE DateRangeProc @startDate, @endDate END …

3
SQL Server NTFS分配单位大小
在运行SQL Server 2008 R2的Windows 2008 R2上,NTFS分配单元大小对DISK IO性能的影响至关重要。在我看来,为任务关键型应用构建少量服务器的服务器管理员将NTFS分配单位大小(群集大小)保留为默认4 KB而不是64 KB。SQL服务器已安装。 是否值得付出痛苦-卸载SQL-用64 KB群集大小格式化驱动器并重新安装SQL Server?

2
SQL Server-增长数据库文件的最佳实践
我已经通过SQL Server 2008 R2中的数据收集器监视文件增长了两个星期。该数据库以每天约35(MB)的速度持续增长。该数据库尚未达到2 GB的初始大小。 数据库文件的自动增长设置为5MB,我想尝试另一种方法,所以我正在寻找建议和/或评论。 每个星期天晚上1:30 AM都会运行一项调优任务。该任务将: 检查数据库完整性 缩小日志文件–(可以,因为日志记录模式很简单) 收缩数据库 重组索引 重建索引 更新统计 清理历史 我想在每周调整计划中增加两个步骤: 如果使用的空间达到某个阈值或总大小,则将数据库文件增加500 MB。 如果使用的空间达到总大小的特定阈值,则将日志文件增加250 MB(缩小后)。 通过将增长负担放在离线时间,我希望通过减少重负载下的自动增长事件的数量来提高性能。 我有两个有关自动增长文件的问题。 放置文件增长步骤的最佳位置是在当前步骤之前还是之后? 如果我使用ALTER DATABASE|MODIFY FILE来增大文件,那么如何确定是否SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)呢?

5
测试是否有任何列为NULL
我试图找出一个简单的查询,我可以测试一个大表是否具有在ANY列中至少具有一个空白(NULL /空)值的条目列表。 我需要类似的东西 SELECT * FROM table AS t WHERE ANY(t.* IS NULL) 我不想做 SELECT * FROM table AS t WHERE t.c1 = NULL OR t.c2 = NULL OR t.c3 = NULL 这将是一个巨大的查询。


1
DBCC CheckDB会丢失哪些类型的损坏?
这个问题是由较早的帖子提示的,我将一个数据库归档以备将来调查,该数据库已恢复,具体操作如下: BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file ’BrokenDatabase.mdf'. Error: 3043, Severity: 16, State: 1. 在链接的问题和我准备进行DBCC PAGE调查的备份中,DBCC CHECKDB顺利通过,但显然存在损坏。 CHECKDB将通过但BACKUP WITH CHECKSUM失败将发生什么类型的损坏?

1
您如何按参数订购?
只是想知道我是否可以对正在运行的存储过程征求一些反馈,以及是否存在一种处理场景的更有效方法(我敢肯定会存在!)。 基本上,我有一个SP,可以调用它返回可能具有一个或多个状态和排序顺序的记录(作业)列表(我使用RowNum进行分页)。目前,我正在使用WITH RECOMPILE,因为状态的变化可以随时更改(取决于用户等)。还有一些过滤正在进行。 我正在使用IF语句来本质上运行相同的代码,唯一的变化是排序顺序。 我想我的问题是:是否有更好的方法(也许对于不同的状态使用不同的SP)?由于缺乏知识,我是否会使事情变得过于复杂(很有可能)SP确实可以,但是需要进行一些细微的调整以减少行数吗? 我在下面粘贴了一部分SP-完整代码的唯一区别是不同排序顺序的其他IF语句... 我将不胜感激。 提前致谢! PROCEDURE [dbo].[sp_Jobs] @PageNumber int, @PageSize int, @FilterExpression varchar(500), @OrderBy varchar(50), @CustomerID int, @ShowNotSet bit, @ShowPlaced bit, @ShowProofed bit, @ShowReProofed bit, @ShowApproved bit, @ShowOnTime bit, @ShowLate bit, @ShowProblem bit, @ShowCompleted bit, @ShowDispatched bit, @ShowUnapproved bit, @ShowClosed bit, @ShowReturned bit, @UserID int WITH RECOMPILE …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.