因此,我们有一个客户站点抱怨性能严重下降。我看了一眼,很明显问题是因为别人 (grrrr) 设计了一个表,其中包含大约 2000 万多条记录,而没有聚集索引。
现在我想在该表上创建一个聚集索引 - 但在我的测试环境中 create index命令已经运行了一个小时,但仍未完成。客户站点是一个 24/7 全天候工作的车间,在我创建索引时无法承受一个小时的停机时间。
是否有一些不那么强力的创建索引的方法可以快速完成工作,或者以某种不会在服务器繁忙时完全杀死服务器性能的聪明方式来完成?
我们正在使用 SQL Server 企业版。
我想知道两件事:
每个内核是 1 个文件吗?那么四核 = 4 个 tempdb 文件,创建三个新文件?
我们需要创建 nvarchar 数据的哈希值以进行比较。T-SQL 中有多种哈希算法可用,但在这种情况下,最好选择哪一种?
我们希望确保两个不同的 nvarchar 值具有重复哈希值的风险最小。根据我对互联网的研究,MD5 似乎是最好的。那正确吗?MSDN 告诉我们(下面的链接)有关可用算法的信息,但没有说明哪一种适用于什么条件?
我们需要在两个 nvarchar(max) 列上连接两个表。可以想象,执行查询需要很长时间。我们认为最好保留每个 nvarchar(max) 数据的散列值并对散列值进行连接,而不是 nvarchar(max) 值是 blob。问题是哪种哈希算法提供了唯一性,这样我们就不会遇到一个哈希值对应多个 nvarchar(max) 的风险。
[我是初级 T-SQL 程序员]
[..希望我在正确的堆栈交换站点上]
我想获得我执行的所有查询的列表(至少,我从早上开始执行的那些查询)。我需要报告查询的执行时间。
在线搜索并没有给我带来太多有用的信息。我在网上找到的唯一一个看起来很接近的查询是
SELECT
deqs.last_execution_time AS [Time],
dest.TEXT AS [Query]
FROM
sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY
deqs.last_execution_time DESC
Run Code Online (Sandbox Code Playgroud)
这个查询返回了一些奇怪的结果(其中大部分是一堆 sproc)。此外,所有这些结果都显示了从今天下午开始执行的查询(我需要从早上开始查询)。
我在之前的问题中找不到任何东西(如果已经问过类似的问题,请指点我)。
我看到了一些关于 SQL Profiler 的建议,但我想 Profiler 只有在我已经开始跟踪时才会帮助我(如果我错了,请纠正我)。
有人可以建议我如何获取从早上开始在数据库上执行的所有查询的列表(包括查询执行时间)。
[如果我也能以某种方式获得执行查询的用户的用户名,这将是有帮助的(不是必需的)]
我们的用户需要能够查询大部分是最新的数据库。数据可能会过时长达 24 小时,这是可以接受的。使用生产副本获取和保持第二个数据库最新的最低成本方法是什么?有没有我没有想到的方法?
我们有一个第三方应用程序用于监控股票交易活动。白天,作为各种工作流程的一部分,会发生许多小的变化(是的,这笔交易是有效的。不,这是可疑的,等等)。晚上,我们执行基于大集合的操作(加载前一天的交易)。
我们使用数据库快照。晚上 10 点,我们删除并重新创建快照。然后开始 ETL 处理。这显然对我们的磁盘造成了负担,但允许我们的用户能够在不锁定数据库的情况下查询数据库(他们使用 Access 前端)。他们在深夜和清晨使用它,因此他们会注意到停机时间。
这种方法的问题有两方面。首先,万一夜间处理失败,这种情况并不少见,我们可以恢复导致快照被删除的数据库。另一个问题是我们的处理时间超过了 SLA。在确定了写得不好的查询和缺乏索引后,我们正试图通过与供应商合作来解决这个问题。数据库快照也是造成这种放缓的罪魁祸首,这一点可以从存在与不存在时的速度差异中得到证明——我知道,这令人震惊。
我们打开了数据库集群,但这并没有解决使数据可用的需求,而且通常只会使管理员的生活变得复杂。它已被关闭。
我们上周开始研究复制。我们的理论是,我们可以建立第二个目录并与生产数据库同步。在 ETL 开始之前,我们将切断连接,只有在 ETL 过程完成后才重新启用它。
管理员从快照复制开始,但他担心需要多天的高 CPU 使用率来生成快照以及所需的磁盘消耗。他表示,它似乎在向订阅者发送之前将所有数据写入物理文件,因此我们的 .6TB 数据库将花费 1.8TB 的存储成本。此外,如果生成快照需要数天时间,则它不符合所需的 SLA。
阅读完这篇好文章后,似乎 Snapshot 可能是初始化订阅者的方式,但之后我们希望切换到事务复制以保持同步。我假设打开/关闭事务复制不会强制完全重新初始化?否则,我们将打破我们的时间窗口
我们的数据库处于完全恢复模式,因此数据库镜像是一种选择,但我对它的了解甚至比复制还要少。我确实找到了指示“数据库镜像阻止直接访问数据,镜像数据只能通过数据库快照访问”的SO 答案。
听起来日志传送也可能是一种选择,但这是我一无所知的另一件事。它会是比其他任何解决方案(实施和维护)成本更低的解决方案吗?基于 Remus 的评论“日志传送允许对副本副本进行只读访问,但在应用收到的下一个备份日志时(例如,每 15-30 分钟)将断开所有用户的连接。” 我不确定停机时间会转化为多长时间,因此可能会导致用户有些焦虑。
我上周末才听说使用Sync,还没有研究它。我不想为像这个问题那样具有高知名度的东西引入新技术,但如果它是最好的方法,那就这样吧。
我们在这里做了大量的 SSIS,所以生成几百个 SSIS 包来保持辅助同步对我们来说是一种选择,尽管这是一个丑陋的选择。我不喜欢这样做,因为我不希望我的团队承担很多维护开销。
过去,我听说我们的管理员使用一些 SAN 技术对整个磁盘进行即时备份。也许有一些 EMC …
我正在对性能不佳的存储过程的点点滴滴进行故障排除。程序的这一部分抛出了一个 NO JOIN PREDICATE 警告
select
method =
case methoddescription
when 'blah' then 'Ethylene Oxide'
when NULL then 'N/A'
else methoddescription
end,
testmethod =
case methoddescription
when 'blah' then 'Biological Indicators'
when NULL then 'N/A'
else 'Dosimeter Reports'
end,
result =
case when l.res is null or l.res <> 1 then 'Failed'
else 'Passed'
end,
datecomplete = COALESCE(CONVERT(varchar(10), NULL, 101),'N/A')
from db2.dbo.view ls
join db1.dbo.table l
on ls.id = l.id
where item = '19003'
and l.id = '732820'
Run Code Online (Sandbox Code Playgroud)
视图 ( …
我必须跟踪 SQL Server 2008 R2 中的数据。SQLFiddle
架构:
创建表 [dbo].[ICFilters](
[ICFilterID] [int] IDENTITY(1,1) 非空,
[ParentID] [int] NOT NULL DEFAULT 0,
[FilterDesc] [varchar](50) NOT NULL,
[Active] [tinyint] NOT NULL DEFAULT 1,
约束 [PK_ICFilters] 主键聚集
( [ICFilterID] ASC ) 与
PAD_INDEX = 关闭,
STATISTICS_NORECOMPUTE = 关闭,
IGNORE_DUP_KEY = 关闭,
ALLOW_ROW_LOCKS = 开,
ALLOW_PAGE_LOCKS = 开
) 在 [主要]
) 在 [主要]
INSERT INTO [dbo].[ICFilters] (ParentID,FilterDesc,Active)
价值观
(0,'产品类型',1),
(1,'ProdSubType_1',1),
(1,'ProdSubType_2',1),
(1,'ProdSubType_3',1),
(1,'ProdSubType_4',1),
(2,'PST_1.1',1),
(2,'PST_1.2',1),
(2,'PST_1.3',1),
(2,'PST_1.4',1),
(2,'PST_1.5',1),
(2,'PST_1.6',1),
(2,'PST_1.7',0),
(3,'PST_2.1',1),
(3,'PST_2.2',0),
(3,'PST_2.3',1),
(3,'PST_2.4',1), … 我有两台运行 SQL Server 的服务器。
据我所知,SQL Server 2008 R2 Express 应该只使用一个核心。
SQL Server 2012 Developer 版本应使用所有 8 个内核。
但是,如果我在 SQL Server 2008 R2 Express 上的 SQL 查询中运行以下命令,它会显示 4 个内核。
select scheduler_id, cpu_id, status, is_online
from sys.dm_os_schedulers
where status = 'VISIBLE ONLINE'
Run Code Online (Sandbox Code Playgroud)
我是否使用正确的命令来衡量使用情况?
我正在通过源服务器上的视图从链接服务器查询数据。该视图必须包含几个标准化列,例如Created,Modified和Deleted,但在这种情况下,源服务器上的表没有任何合适的信息。因此,列被显式转换为它们各自的类型。我更新了视图,从
NULL AS Modified
Run Code Online (Sandbox Code Playgroud)
到
CAST(NULL as DateTime) as Modified
Run Code Online (Sandbox Code Playgroud)
但是,执行此更新后,视图会触发以下错误消息:
消息 7341,级别 16,状态 2,第 3 行无法从链接服务器“”的 OLE DB 提供程序“SQLNCLI11”获取列“(用户生成的表达式)。Expr1002”的当前行值。
我们已经在源服务器上完成了这种“显式转换” - 无需担心,我怀疑这个问题可能与所涉及的服务器版本有关。我们真的不需要应用这个演员表,但感觉更干净。现在我只是好奇为什么会发生这种情况。
服务器版本(来源):
Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 2014 年 5 月 14 日 18:34:29 版权所有 (c) Microsoft Corporation Enterprise Edition(64 位),Windows NT 6.1(内部版本 7601:Service Pack 1)(管理程序)
服务器版本(链接):
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 2011 年 6 月 17 日 00:54:03 版权所有 (c) Microsoft Corporation Enterprise …
当我遇到这个东西时,我正在研究其他东西。我正在生成包含一些数据的测试表并运行不同的查询,以了解编写查询的不同方式如何影响执行计划。这是我用来生成随机测试数据的脚本:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('t') AND type in (N'U'))
DROP TABLE t
GO
CREATE TABLE t
(
c1 int IDENTITY(1,1) NOT NULL
,c2 int NULL
)
GO
insert into t
select top 1000000 a from
(select t1.number*2048 + t2.number a, newid() b
from [master]..spt_values t1
cross join [master]..spt_values t2
where t1.[type] = 'P' and t2.[type] = 'P') a
order by b
GO
update t set c2 = null
where c2 < 2048 * 2048 …Run Code Online (Sandbox Code Playgroud) sql-server ×10
hashing ×1
hierarchy ×1
index ×1
order-by ×1
replication ×1
ssms ×1
t-sql ×1
tempdb ×1
warning ×1