如何扩展 SQL Server 2008(或 2012)?基本上,我理解有两种选择:
放大:
如果 CPU 受限,我可以清楚地看到从 1 个 CPU 内核到 2 个到 4 个。或者如果 RAM 使用量激增,只需添加更多 RAM。假设没有应用程序级别更改,SQL Server 2008/2012 是否真的弥补了这种不足并以这种方式扩展?为了尽量减少猜测,让我们假设我没有做一些愚蠢的事情,比如燃烧 CPU 周期、进行交叉连接等。
向外扩展:
目前尚不清楚扩展将如何工作。我的意思是如果我在第一个 SQL 服务器旁边添加另一个 SQL 服务器,查询如何知道要在哪个服务器上运行?前面是否有一些负载平衡器(它是否与 SQL Server 软件一起提供?)?它是否需要更改应用程序级别以扩展工作?或者我是否必须对数据进行分片并使用自定义代码根据数据分片键调用正确的数据库服务器?
希望更多有经验的人提供意见。
我正在研究对数据库进行碎片整理,似乎我正在寻找以下 SQL 语句:
ALTER INDEX ALL ON mytablename
REBUILD WITH(ONLINE = ON)
Run Code Online (Sandbox Code Playgroud)
当我从 中提取信息时sys.dm_db_index_physical_stats,我看到百分比非常高 - 70%、80% 和 90% (!)。所以这告诉我我想要一个REBUILD,而不是一个REORGANIZE。
在执行这些之前,我有几个问题REBUILDS。
ONLINE = ON
告诉我是的,但我想确认它不会崩溃。)还是在不使用时运行更好?REBUILD使事情运行得更慢。那是在重建索引的时候吗?(或永远之后)编辑:最后,重建它的最佳方法是什么?循环遍历百分比大于 30 的所有对象?或者?
谢谢!
这个程序
create proc dbo.Get_Accounts as
begin
declare @current_date datetime
set @current_date = dbo.fn_currdate()
select [fields]
into dbo.current_accounts
from linkedserver.database.dbo.accounts
where date = @current_date
end
Run Code Online (Sandbox Code Playgroud)
10 分钟后不断失败,并显示以下错误消息:
服务器:消息 7399,级别 16,状态 1,第 1 行 OLE DB 提供程序“SQLOLEDB”报告了错误。由于达到资源限制,提供程序终止了执行。[OLE/DB 提供程序返回消息:超时已过期] OLE DB 错误跟踪 [OLE/DB 提供程序 'SQLOLEDB' ICommandText::Execute 返回 0x80040e31:由于达到资源限制,提供程序终止执行。]。
但是,当我在具有硬编码日期的交互式查询窗口中从同一个数据库(不在远程数据库上)运行相同的查询时:
select [fields]
into dbo.current_accounts
from linkedserver.database.dbo.accounts
where date = '1/20/2012'
Run Code Online (Sandbox Code Playgroud)
它在 30 秒后返回。
本地服务器是 SQLSERVER 2008,远程服务器是 SQLSERVER 2000。
我们做了以下工作,但无济于事:
我正在开始一个新的网络企业,可能需要扩展到大量用户。
我对 SQL Server Web 版的 SPLA 许可充满信心,但想知道我是否需要考虑升级到 Standard、Enterprise 或 DataCenter(很确定不会是这个)。
我知道人们在需要之前不应该考虑扩展,但这会影响站点的架构和业务计划。
我知道处理器限制是每个物理处理器,而不是线程,所以我不用担心。然而,一些镜像和备份功能会让我担心。SO 是否依赖于这些功能?
tl;dr:
像 Stack Overflow 这样的网站可以在 SQL Server Web 上运行吗?哪些方面的维护和高可用性是不可能实现的?
我有一个包含事务的基表,我需要创建一个带有运行总计的表。我需要它们是每个帐户,并且每个帐户都有一些运行总计(取决于交易类型),在其中,每个子帐户都有一些运行总计。
我的基表有这些字段(或多或少):
AccountID | SubAccountID | TransactionType | TransactionAmount
Run Code Online (Sandbox Code Playgroud)
考虑到我每个 Account/TransactionType 有大约 4 种类型的运行总计,每个 Account/SubAccount/TransactionType 有 2 个以上的运行总计,我有大约 200 万个账户,每个账户有大约 10 个子账户,我收到了大约 1 万笔交易每分钟(在最大负载下),你会怎么做?
这也是必须通过 SQL 作业异步运行,创建聚合而不是事务本身的一部分。
我在这里使用光标很困难 - 这需要太长时间。我真的很感激任何或多或少相同的建议/文章。
如果这个问题重复了另一个已经问过的问题,我深表歉意。我已经搜索了几个小时,但没有找到适合我的情况。
期望的结果
使用 SQL 身份验证的用户对 Server1(默认实例)上的 Database1 具有执行权限,仅此而已。用户执行一个存储过程,作为其进程的一部分,访问 Server1\Instance2 上的数据库 2。我希望它既安全又简单(两者都很重要)。
更多信息
我的 Windows 凭据可以访问两个实例(位于同一台服务器上)。因此,我可以毫无困难地在我的登录名下执行存储过程。但是,我不想给用户我的访问级别。我还需要使用 SQL 登录,因为用户不在域中。
我想要的是为存储过程提供我对该过程的访问级别。由于我是系统管理员,这将为用户提供该过程所需的一切。如果我让它工作,我可能会为此目的创建一个帐户而不是使用我的帐户,但无论哪种方式都是安全的,因为我控制了存储过程的作用。
我尝试将“WITH EXECUTE AS”语句放在我的存储过程中,但无法获取我的 Windows 登录信息。当我把它放进去时,我会在编译存储过程时得到以下错误:
无法以用户 'domain\jdoe' 身份执行,因为它不存在或您没有权限。
用户在两台服务器上都是系统管理员,就像我说的那样,所以我不确定它还需要什么。
我研究了以下内容:
我觉得我错过了一些明显的东西,但我不确定它是什么。因为我整天都在用头撞墙,所以我可能离得太近了,看不到它。如果这里有人能帮我一把或指出我正确的方向,我将不胜感激。我会说我已经阅读了很多 MSDN 文章(我讨厌他们 - 他们似乎从来没有告诉我我想知道什么)。我真正想要的是一个简单、易于遵循的教程,它会引导我了解如何做到这一点。除此之外,即使是我需要走的方向的一般指示也会有所帮助。
我发现的只是一个DateFormat我可以选择的预定义列表,就像这样
我记得在 MySQL(还有 PostgeSQL?)你可以定义你的日期格式:
DATE_FORMAT(now(),'&m_%Y') --for 02_2012 etc.
Run Code Online (Sandbox Code Playgroud)
SQL Server 有同样的东西吗?我看到人们必须编写一个函数来做这样的事情,它有内置的吗?
编辑:
我刚刚找到了这个DatePart功能。它可以以月份为数字,但总是返回 1 位数字,即使我使用 datePart(MM, getdate())
我的公司在能源行业,我需要想出一个好方法来表示测量单位的转换。我已经做了一些搜索,但还没有找到一篇很好的文章,在我需要的深度上涵盖了这一点。大多数关于单位转换的信息都假设给定单元 1 有一个已知的(硬编码)转换率可以到达单元 2,这是简单的数学运算(这是我发现的最复杂的例子,但仍然无济于事)。然而,这在现实世界中并不总是正确的,对于我们必须处理的事情当然也不是这样。(抱歉写了这么长的文章——我正在尝试提供尽可能多的信息!)
棘手的示例 1: 某些转换会随时间变化,例如将 5 美元转换为欧元,反之亦然。这听起来似乎与能源无关,但它确实与能源商品市场有关(想想股票市场)。
棘手的例子 2:( 过度简化)一些天然气比其他天然气燃烧得更热。此外,天然气可以基于气体中的能量(例如Therms)或基于所述气体的体积(例如1000 立方英尺的MCF)来测量/存储,还有其他可能性(例如作为吨用于质谱)。汽油的一个类比是 1 加仑 87 辛烷无铅提供的能量比 1 加仑 93 辛烷无铅提供的能量少。
棘手的例子 3: 除了这些计量单位之外,我们还经常需要处理费率,例如$ per Therm或€ per MCF。因此,我们需要一些方法来与这些利率和如何将它们与基本单位工作,所以如果我们需要从转换$每千卡至每MCF€,我们可以和它们使用同样的发布速率转换从千卡至MCF。
棘手的例子 4: 以前,我非常松散地使用术语能源,有时可能是错误的。从现在开始,这种情况正在发生变化。所以最后一个曲线球是我们同时处理Energy和Power。对于电力,这意味着千瓦时与千瓦(尽管是雅虎问答,但这是一个相当好的解释)。数据类比:这就像比较下载的总MB数据与您的Mbps您的 ISP 为您提供的带宽。与数据一样,能源需要时间才能交付。继续进行数据类比,我们可能需要计算一段时间内消耗的平均有效带宽,因此假设在 1 …
我们在我们的数据库中发现了一些违反活动约束的行。这怎么可能?
约束处于活动状态,因为我们不能手动添加绕过此约束的行。但是,当我们运行 时CHECKCONSTRAINTS(Files),我们发现它在我们的测试运行期间有几次被绕过了。有问题的行都是在半秒内创建的,表明存在某种竞争条件。
这是应用于表的约束。该规则旨在确保给定父文件夹中的名称唯一性:
ALTER TABLE Files ADD CONSTRAINT UniqueNameInParentFolder CHECK
CheckUniqueNameInFolder(ParentFoldersID, Name) = 1;
Run Code Online (Sandbox Code Playgroud)
此约束调用如下所示的函数:
-- first check for the new name in the Folders table
IF ((SELECT COUNT(*) FROM Folders
WHERE ParentFoldersID = @FoldersID AND Name = @Name) = 0)
BEGIN
-- then check for it in the Files table
IF ((SELECT COUNT(*) FROM Files
WHERE ParentFoldersID = @FoldersID AND Name = @Name) <= 1)
RETURN 1
END
RETURN 0
Run Code Online (Sandbox Code Playgroud)
在事务中添加了单独的行,所以我很难理解重复的行是如何绕过这个限制的。
将数据库快照用于报告目的的性能优势是什么?
在我看来,它可能会降低性能,因为对于原始数据库中的每次写入,都必须为快照本身进行另一次写入。
我可以看到,只要您想报告当时为止的数据,就会使用快照,但这不属于性能类别。
再说一遍,有性能优势吗?
sql-server ×10
performance ×3
scalability ×2
date-format ×1
datetime ×1
index ×1
maintenance ×1
query ×1
reporting ×1
schema ×1
snapshot ×1