NHibernate 自动使用带有不同参数的 sp_executesql 来执行它的数据。现在我们在生产中注意到的是,我们有时会受到参数嗅探的影响。通过这种方式,查询性能不仅会受到影响,而且实际上会导致超时。
我不是 DBA,所以我有点犹豫,但对我来说,查询似乎正在针对少量数据(10 行)进行优化,然后必须查询大量数据(150000 行),这些数据正在打磨它停止。
现在我发现了 4136 Trace,它完全禁用了 SQL Server 实例的参数嗅探。
现在,由于我们也在升级我们的一些服务器,我想知道 NHibernate 在 SQL Server 2008 上的行为是否与 2005 年有所不同。例如,它是否添加了 OPTIMIZE FOR UNKOWN 点点滴滴。
据我所知,SQL 2008 中添加了一些“工具”,以便更好地处理这些参数嗅探问题。我很好奇 NHibernate 是否采用了这些工具并使用它们,或者如果我们更改为 SQL Server 2008,我们仍然必须使用此跟踪或类似的东西来处理这些问题。
我正在将一个约 15GB 的数据库从 SQL Server 2005 迁移到运行 SQL Server 2008 的新服务器,同时我需要创建所有新的维护计划。我可以处理所有备份的东西,但表维护让我有些困惑。有没有人对我应该多久(或者你多久做一次就足够了)以下任务有任何意见?
我错过了什么吗?再说一次,如果您能分享您执行这些任务的频率,那就太好了……和/或分享有关您的表格维护方法的任何一般信息,这将很有帮助。最后,我以什么顺序运行这些任务(在设置作业时)是否重要?
哦,我愿意接受任何可能有帮助的链接!
简化说明:我有三个主要表:customer、phone 和customer_phone 来解决多对多问题。我需要确保只有管理员才能在未经批准的情况下插入/更新这些表。其他所有人都需要将他们的东西放入批准队列,以便管理员批准。管理员需要在批准/拒绝之前查看当前值和提议的更改。系统应该在审计跟踪中记录谁提交了信息,谁批准了它(如果适用),以及任何修改它的人。当前采用的方法为每个实体提供三个表:
我认为应该有一些更简单的解决方案。当前系统在以下情况下存在问题:
这对我来说似乎不是最佳解决方案。有没有更好的办法?
更长的解释:这是场景的简化视图:我有一个主要实体和次要实体通过链接表链接到它。管理员可以随意添加/编辑任何实体,但标准用户必须在更改生效之前获得管理员的批准。问题是,有时当标准用户输入主实体和链接实体时,管理员必须先批准主实体,链接才能生效。我希望管理员能够在批准之前查看旧值和提议的新值,并且我希望确保他们首先批准主要实体。例如,假设我们有下表,客户是主要实体,电话是次要实体,然后有一个链接表来解决多对多关系:
CREATE TABLE [dbo].[customer](
[Customer_ID] [int] NOT NULL,
[Customer_Name] [varchar](255) NOT NULL,
PRIMARY KEY CLUSTERED ([Customer_ID] ASC)
CREATE TABLE [dbo].[phone](
[Phone_ID] [int] NOT NULL,
[Phone_Number] [int] NOT NULL,
PRIMARY KEY CLUSTERED ([Phone_ID] ASC)
CREATE TABLE [dbo].[customer_phone](
[Customer_Phone_ID] [int] NOT NULL,
[Customer_ID] [int] NOT NULL,
[Phone_ID] [int] NOT NULL,
[Approved] [char](1) NOT NULL, --Y/N
PRIMARY KEY CLUSTERED ([Phone_ID] ASC)
Run Code Online (Sandbox Code Playgroud)
现在,只有管理员才能在未经批准的情况下添加客户或电话号码。如果标准用户想要添加某人,它会进入一个保留表。这就是目前在我的系统中的样子。除了以上表格:
CREATE TABLE [dbo].[customer_holding](
[Customer_ID] [int] NOT NULL,
[Customer_Name] [varchar](255) …Run Code Online (Sandbox Code Playgroud) 之前已经问过这个问题(在 SQL Server 2008 中使用 varchar 的速度影响),但答案不够详细,令我满意。诚然,这不是当前的问题,主要是针对我的教育。
但是,我将尝试将其作为我正在做的一些当前数据库模式工作的具体示例;
选项 A
CREATE TABLE [VMware].[TblHostSystem](
[ID] [int] IDENTITY(1,1) NOT NULL,
<snip/>
[PowerStateID] [int] NOT NULL
)
ALTER TABLE [VMware].[TblHostSystem] WITH
CHECK ADD CONSTRAINT [FK_TblHostSystem_TblPowerState]
FOREIGN KEY([PowerStateID])
REFERENCES [VMware].[TblPowerState] ([ID])
GO
CREATE TABLE [VMware].[TblPowerState](
[ID] [int] IDENTITY(1,1) NOT NULL,
[PowerState] [varchar](50) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
选项 B
CREATE TABLE [VMware].[TblHostSystem](
[ID] [int] IDENTITY(1,1) NOT NULL,
<snip/>
[PowerState] [varchar](50) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
如果我选择了选项 B(正如模式的前任作者所做的那样),由于主机的功能会经常变化,这会产生什么样的流失?
一些我认为是真实的陈述,
所以我的问题是,当将第二个示例中的 …
我们在具有 24+GB RAM 和 16 个内核的机器上安装了 SQL Server 2008。加上快速驱动器等。按照我们的标准,这是一台大型机器。
无论如何,那台机器 100% 专用于 SQL Server,并且上面有两个生产数据库。每个数据库来自两个不同的供应商。
这已经运行了2年。
现在,在过去 2 周内,供应商 B 表示 SQL Server 无法处理其 8 GB 数据库的性能。几个月来,我们的结局没有任何变化。我们的数据库服务器没有被触及。
供应商 A 工作得很好。
所以听起来供应商 A 正在占用更多资源并减慢供应商 B 的速度。但我不怀疑供应商 A 是罪魁祸首,因为我熟悉他们的数据库及其用户。
如何找出每个数据库使用了多少资源?我怎么能说供应商 A 获得 50% 和供应商 B 获得服务器的 50%?
我已经在我的开发机器上安装了 SQL Server 2012 和 LocalDB,并且能够使用 SQL Server 管理工具 2012 和使用新修改的连接字符串从我的 winform 应用程序中连接到 LocalDB,如下所示:
Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Integrated Security=True;Connect Timeout=60
Run Code Online (Sandbox Code Playgroud)
当我尝试将我的应用程序移植到运行 SQL Server 2008 的 Windows 2008 Server 时出现问题(我知道我可以跳过 LocalDB 安装而只使用 SQL Server 2008,但我只是在测试我的应用程序的安装在这台机器上..)
我已经安装了 SQL Server 2012 LocalDB 并使用位于http://support.microsoft.com/kb/2544514 的知识库文章将 .net 4.01 更新为 .net 4.02
我不断收到收到一个错误,当我尝试连接到(LocalDB)\v11.0来自我的应用程序,并从SQL Server管理工具2008,我也手动启动(LocalDB)\v11.0的cmd->SQLLocalDB -s "v11.0",然后尝试再次连接使用NP
IE np:\\.\pipe\LOCALDB#8B2C7490\tsql\query
当我使用命名管道时,一切都连接正常,所以我假设这样有效,那么 LocalDB 的安装也是正确的。
你建议我怎么做来解决这种情况?
我还担心随着我的应用程序部署的正确实施,我现在是否应该将 .Net 4.03 作为先决条件?如果是这样,是否已经有一个 clickonce bootstrap 清单可用于此,或者我是否需要创建一个..以便我的应用程序正常工作,我真的很担心 LocalDB 可能会破坏它..到目前为止我还没有多幸运..
我想如果所有其他方法都失败了,我可以重新使用 SQL Server Express 2008,因为此实现之前可以正常工作..
谢谢,
作为一个更大项目的一部分,我试图在 SQL Server 实例中的每个数据库上创建一个新视图。
我创建了一个存储过程,其中包括通过游标循环遍历实例中的数据库,然后尝试使用sp_executesql. 不幸的是,我试图在其上创建视图的数据库中不存在存储过程。所以我试图让 sql server 使用该数据库,然后运行创建视图脚本。当我运行它时,我收到错误
'CREATE VIEW' 必须是查询批处理中的第一个语句。
关于我如何做到这一点的任何想法?这是sp_executesql程序的一部分。
declare @DB VARCHAR(50)
declare @SQL NVARCHAR(max)
set @DB = '[dbname]'
SET @SQL = N'USE ' + @DB + N' CREATE VIEW vNonhiddenCategories
AS
SELECT categories.categoryid
FROM categories
--WHERE ... irrelevant remainder of view code ...
'
execute sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud) 是否可以将表名传入存储过程?
例如,假设您有同一个表的多个视图。它们都具有完全相同的结构。
您需要一个可以为任何视图运行的存储过程。
就像是:
create procedure myprocedure
@tableName varchar(50) = ''
select blah from @tableName where blah = blah2
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,我得到
Must declare the table variable @tablename
Run Code Online (Sandbox Code Playgroud)
任何想法我怎么能做到这一点?
SQL Server 2008 生产性能远低于预期。与下班后的 250 毫秒相比,简单的单表查询有时在中午工作 5 秒。当负载增加时,我们无法找到哪个资源是瓶颈。
通常关于性能调优的建议无济于事。CPU未过载(约30%),页面寿命约1.5小时;IO 队列几乎总是空的。sys.dm_os_wait_statswait_time_ms:有一个可疑的记录引导视图LATCH_EX。最大的锁存器(比第二大锁存器大 4 倍)是NESTING_TRANSACTION_FULL. 这被描述为“仅供内部使用”。
请问NESTING_TRANSACTION_FULL统计意味着什么?它能否为我们提供诊断其配置、硬件、应用程序等问题的线索?
我知道 SQL Server 可以将并行性用于某些 DDL 操作,例如索引重建或某些 SELECT 语句,当查询成本超过并行性成本阈值时,很可能在数据仓库环境中。
从版本 8i 开始,ORACLE 提供并行 DML操作,如 INSERT、UPDATE 或 DELETE。
SQL Server 是否对 DML 操作使用并行性?
sql-server-2008 ×10
sql-server ×4
performance ×3
dynamic-sql ×1
maintenance ×1
t-sql ×1
varchar ×1