Questions tagged «sql-server-2008»

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

1
ODBC数据源SQL Server连接-用户登录失败
我已将数据库从SQL 2005移至具有SQL 2008的服务器。 我现在正在尝试创建ODBC数据源。 我正在使用“通过SQL Server身份验证使用用户输入的登录ID和密码”,并且已经输入了我的登录名和密码。登录名在SQL Server Management Studio中的“安全性”->“登录名”下可见。 该登录名还包含我的旧服务器中同一登录名的确切属性。输入用户名和密码后,当我点击下一步时,我得到: Connection failed: SQLState: '28000' SQL Server Error: 18456 [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'myUser'. 阅读以下内容后:http : //support.microsoft.com/kb/555332我意识到服务器属性仅设置为“ Windows身份验证模式”,但是即使更改为“ SQL Server和Windows身份验证模式”,我仍然连接问题。我可以连接我的Windows帐户。

1
SQL Server 2008是否存储执行计划的创建日期?
最近,我们升级了一个使用的应用程序,其中涉及修改数据库的架构。这些更改可能迫使已丢弃的缓存执行计划。如果SQL Server被迫创建许多新计划,则可能会减慢用户体验。我想看看是否是这种情况。 因此,我的问题是,SQL Server 2008是否存储缓存的执行计划的创建日期?管理视图sys.dm_exec_cached_plans没有任何日期字段,因此我怀疑没有。

1
工作区内存内部
根据克里斯蒂安·博尔顿,布伦特·奥扎尔等人撰写的有关SQL Server 2008内部和故障排除(从伊利诺伊州本地图书馆借来的)的阅读书。可以确认或纠正我的理解。 每个需要查询内存授予的查询或操作都将需要工作空间内存。在使用排序,哈希匹配联接,并行性(不确定),批量插入(不确定),索引重建等的一般查询中,将需要查询工作区内存。 工作区内存是SQL Server缓冲池的一部分(分配为缓冲池的一部分),最大工作区内存为分配给缓冲池的内存的75%。默认情况下,单个查询不能获得超过25%的工作空间内存(在SQL 2008 / SQL 2012中-由资源调控器默认工作负载组开箱即用)。 寻求我的理解的确认 1)考虑具有48 GB RAM和最大服务器内存配置为40 GB的系统,这是否意味着最大工作空间内存限制为30 GB,并且单​​个查询不能获取超过10 GB的工作空间内存(查询内存)。因此,如果您有一个错误的查询要处理大量的哈希联接的十亿行,并且需要超过10 GB的内存(工作空间内存),那么是否还要遍历此内存授予队列或立即溢出到磁盘? 2)如果为执行大规模排序操作的查询分配了5 MB的工作空间内存,并且在查询执行期间查询优化器意识到由于统计错误或缺少索引,此查询实际上将需要30 MB的工作空间内存将立即溢出到tempdb。即使系统在执行期间有足够的工作区内存,一旦查询在执行期间超出了授予的工作区内存,它也必须溢出到磁盘上。我的理解正确吗?

3
拒绝访问SQL Server中的信息架构
我正在寻找对SQL Server中的用户/组禁用对sys.tables/的访问的最佳方法Information Schema。 我从2008年发现了这个话题 它显示了一种如何拒绝访问的方法,[sys].[something]如下所示: DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole GO DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole GO DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole GO DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole GO 但是没有办法如何禁用对的访问Information Schema: DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole 这似乎行不通。 如何禁用对information_schema的访问? 还有一种更简单的方法来禁用对所有sys/的访问information_schema吗? 更新: 实际上我不能同时运行以下语句: DENY SELECT ON [sys] …

2
SQL Server EXECUTE AS故障
我在尝试使存储过程使用时丢失了某些东西EXECUTE AS。存储过程正在从中读取数据source_db,对其进行汇总并将结果存储在中target_db。 sp本身在中target_db。我有一个专用的登录名,并将其映射到sp的所有者source_db和target_dbsp的所有者中(因此,app_agent在source_db和target_db登录中都有一个用户app_agent)。 如果我以身份登录app_agent并执行 EXEC target_db.app_agent_schema.import_data 一切正常。但是如果我改变 ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`) 并尝试执行它,它会抛出 服务器主体“ app_agent”在当前安全上下文下无法访问数据库“ source_db”。 我正在使用SQL Server 2008。 有人可以指出我的错误吗? 谢谢 更新 经过一番研究,我发现可以ALTER DATABASE target_db SET TRUSTWORTHY ON解决问题,但对于我来说似乎并不是正确的解决方案...

4
重建索引,数据库现在的大小是原来的10倍
我有一个大约15演出的SQL Server数据库(2008 R2 SP1)。事实证明,维护已经有一段时间没有运行了,所以我创建了一个维护计划来重建所有索引,它们非常分散。 这项工作完成了,碎片消失了,但是现在数据库已超过120个演出!我知道它会使用额外的空间来进行所有重建,但是既然工作已经完成,我认为所有空间都是可用空间,但是可用空间仅显示为3个演出,因此正在使用117个演出即使索引重建作业已完成。 我很困惑,可以使用一些指导,我已经将数据库恢复到合理的大小,我们没有足够的磁盘空间。 提前致谢! 这是发布的两个查询的结果: log_reuse_wait_desc没有 name TotalSpaceInMB UsedSpaceInMB FreeSpaceInMB LIVE_Data 152 123 28 LIVE_Log 18939 89 18849 LIVE_1_Data 114977 111289 3688 第3个文件是.ndf文件,该文件仅在未使用的空间中显示3688,但是在111289中的存储量约为15 gigs。

1
插槽阵列和总页面大小
我继续在许多论坛和博客中读到一个页面构成,如下所示:页面大小:16 x 512B = 8192B页面标题:= 96B最大行内行:= 8060B 这留下(8192-96-8060)B = 36B。 好的,这是合乎逻辑且正确的。我的问题是:为什么有那么多人说剩下的36B是为插槽阵列保留的? 显然,插槽数组在页面上每行提供2B的空间;因此,它可以小至2B,大至1472B: 2B:1行* 2B = 2B 1472B:8096B = n * 9B(带有开销的最小行大小...考虑单个TINYINT列)+ n * 2B(每行的插槽阵列成本)=> 8096 = 11n => n = 8096/11 = 736。 736 * 2B = 1472B。 由于使用14B版本标记,因此我的排名为20。 USE master ; GO CREATE DATABASE test ; GO USE test …

3
在SQL Server的表上具有多个可为空的FK是否被视为一种不好的做法
在SQL Server的数据库结构中,我有3种类型的产品,它们需要有关订单的不同信息。所以,我创建了一个Customers桌子,三个不同的顺序表:OrdersForProductAs,OrdersForProductBs,OrdersForProductCs。所有订单表在表上都有一对多的关系Customers。 我还有另一个表格,Payments里面将保存付款明细。但是我在这里对如何组织感到怀疑。 因为我有多种产品类型,并且一个客户可能同时具有多个产品的订单,所以我需要将这三个订单表与Payments表相关联。 另一个问题是,客户只能订购一种产品。因此,表上的FK列Payments需要为nullable。 我的问题是nullable,从长远来看,那些FK色谱柱是否会让我头疼?一般来说,在表上具有可空的FK列是否会被视为不好的做法?

3
如果不存在,则插入
我在存储过程中的插入出现并发问题。该过程的相关部分是: select @_id = Id from table1 where othervalue = @_othervalue IF( @_id IS NULL) BEGIN insert into table1 (othervalue) values (@_othervalue) select @_id = Id from table1 where othervalue = @_othervalue END 当我们同时运行3或4个这些存储的proc时,有时会得到多个插入。 我打算像这样修复此问题: insert into table1 (othervalue) select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK) where NOT EXISTS …

2
死锁错误未返回死锁SQL
Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 当我的一个网站繁忙时,我会随机收到此错误。我大致知道它在哪组表上发生,但是根据我在其他程序中的经验,我通常会在发生死锁的地方返回SQL。我应该打开一个标志来允许这种情况发生吗? 我将尝试将死锁本身作为一个单独的问题进行调试,因为这是我目前的主要问题。 我正在使用SQL Server 2008标准版。

4
SQL Server 2008 R2上的SQL Server语句间歇性变慢
对于我们的一位客户,我们的应用程序遇到了一些性能问题。这是一个.NET 3.5 Web应用程序,正在使用和更新SQL Server数据库上的数据。当前,我们的生产环境由一台Windows 2008 R2计算机作为前端,而在后端则是一个SQL Server 2008 R2群集。我们的应用程序使用COM +和MSDTC连接到数据库。 这是正在发生的事情:我们的最终用户有时会抱怨应用程序运行缓慢。某些页面的加载时间比预期的要多。在尝试找出正在发生的事情时,我设法找出了数据库方面的一些奇怪行为,这可能是性能下降的原因。我注意到有时有些SQL语句需要花费更多的时间才能运行。我设法使用探查器跟踪(带有TSQL_Duration模板)来识别长时间运行的查询,从而识别其中一些语句(主要是对应用程序存储过程的调用)。 问题是,当我直接在SQL Management Studio的数据库上运行这些存储过程时,有时它们会花费很长时间(大约7/8秒),而其他时候它们却很快(不到1秒)。我不知道为什么会这样,这让我发疯,因为其他任何应用程序都没有使用SQL机器(4核,32 GB),并且这些查询的运行时间不会太长。 不是DBA或SQL Server专家,我一直在尝试研究一些可以帮助我理解问题的东西。这是我尝试解决问题以及到目前为止发现的步骤: 应用程序调用的所有TSQL代码都是在存储过程中编写的。 我在SQL Server事件探查器上确定了一些长时间运行的查询,但是,当我在Management Studio上运行这些查询时,它们要么运行很长时间(从4到10秒),要么运行很快(不到1秒)。我正在使用参数中传递的相同数据运行完全相同的查询。这些查询主要是存储过程,其中包含选择语句。 我尝试查看等待和排队统计信息,以尝试确定是否有某些资源在等待进程。我运行了以下查询: WITH Waits AS (SELECT wait_type, wait_time_ms / 1000.0 AS WaitS, (wait_time_ms - signal_wait_time_ms) / 1000.0 AS ResourceS, signal_wait_time_ms / 1000.0 AS SignalS, waiting_tasks_count AS WaitCount, 100.0 * wait_time_ms …

4
创建集中式DBA数据库
我们有200多个服务器,我正在考虑创建一个集中式DBA数据库,该数据库在其中记录备份,错误,空间作业并生成关于SSRS的报告。我不确定从哪里开始,非常感谢您的帮助。非常感谢你。

5
如何检测对数据库的任何更改(DDL和DML)
我的客户端的SQL服务器上有很多数据库。这些数据库正在开发中,因此开发人员可以设计,重构,进行数据修改等。有些数据库很少更改。我的客户必须确保所有人(备份)的安全,并花一些时间来管理环境。(该公司没有数据库管理员的职位。)经过长时间的讨论,由于易于还原,客户决定使用每日完全备份策略。 因此,这是情况的摘要: 数据库的数量每天都会变化。 更改的数据库(意味着数据和/或结构已更改)应备份。 未更改的数据库不得备份。 解决方案不得影响数据库结构(这不是限制性要求) 该“备份引擎”将自动工作。 主要问题:如何检测数据库已更改。问题的第一部分(DDL更改)可以通过使用DDL触发器来解决。但是数据更改(DML更改)是一个问题。无法将DML触发器应用于所有数据库的所有表以跟踪更改(性能,扩展对象的管理...)。备份引擎必须跟踪所有更改,以将每个数据库标记为准备备份。 更改数据捕获是一种解决方案,但似乎过于繁琐(它也需要SQL Server Enterprise Edition)。 另一种方法是跟踪数据库文件的更改(大小或上次更改时间),但无法正常工作:当数据库超出所有保留的可用空间并且sp_spaceused不是解决方案时,数据库可以更改其大小。 跟踪是一种解决方案,但它会导致性能问题并需要其他管理。 是否有解决方案可以计算实际的数据库使用量,而又不影响其他数据库管理对象(如统计数据……)?可以肯定的是,对表数据的更改不会改变表的大小不会触发(我认为),但这总比没有好。确实,我在寻找SQL Server 2008的直接或间接解决方案。 感谢您的任何评论,解决方案和想法。 添加: 这是解决方案(感谢Marian): Select NextLSN = MAX(fn.[Current LSN]) ,Databasename = DB_NAME() from fn_dblog(NULL, NULL) fn LEFT JOIN sys.allocation_units au ON fn.AllocUnitId = au.allocation_unit_id LEFT JOIN sys.partitions p ON p.partition_id = au.container_id LEFT JOIN …


3
如何查看SQL Server 2008中的内存中缓存了什么?
有没有一种方法可以找出SQL Server 2008 R2中缓存的内容?我找到了以下不错的文章:http : //blog.sqlauthority.com/2010/06/17/sql-server-data-pages-in-buffer-pool-data-stored-in-memory-cache。但是,我想知道每个表和索引存储了多少数据(例如百分比和KB)。是否有一些简单的方法来获取此类数据?

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.