我正在尝试提高由实体框架自动生成的特定查询的性能。我已经通过 SSMS 运行了查询,它建议创建两个缺失的索引。有问题的表:
CREATE TABLE [dbo].[PackageEvents]
(
[EventID] [int] NOT NULL IDENTITY(1, 1),
[PackageID] [char] (24) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[EventDescription] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[EventDate] [datetime] NOT NULL,
[UserName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Notes] [varchar] (max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[IsSynchronized] [bit] NOT NULL CONSTRAINT [DF_AmazonPackageEvents_IsSynchronized]
DEFAULT ((0)),
[LastSyncDate] [datetime] NULL,
[Version] [timestamp] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
SSMS 建议了以下两个索引:
CREATE NONCLUSTERED INDEX [IX_IsSynchronized] ON [dbo].[PackageEvents]
([IsSynchronized]) INCLUDE ([PackageID])
CREATE NONCLUSTERED INDEX [IX_Covering] ON [dbo].[PackageEvents] ([PackageID])
INCLUDE …Run Code Online (Sandbox Code Playgroud) 最近几天,从主数据库运行的服务代理命令消耗的资源比以前多得多。对数据库的影响很大(从不好的方面来看),它会导致内部等待。在 2014 年 7 月 10 日之前和之后,我没有对数据库进行任何更改(您可以在图表中看到此开始日期)。我检查了是否在任何数据库中启用了服务代理,发现它是在 Tempdb 和 Msdb 中。什么会导致这些变化?
我附上了一张图表,你可以看到行为的变化。

我附上了另一个屏幕截图,你可以从 sp_who2 看到,我不明白的是,你可以看到“LastBatch”是非常旧的,从 10/12 07:55 开始(这个结果来自今天 10/ 20/2014 10:23 当地时间)。为什么会话没有关闭。?
昨天我们有一个查询,旨在翻阅结果,但在结果的第一页上,查询只返回 4 条记录,而不是预期的 25 条。以任何方式更改查询都会导致 25 条记录,这对我来说意味着这是一次执行计划问题。我不熟悉在生产中查看执行计划的方法,并且在 sql studio 中运行查询没有导致相同的问题,可能是由于细微的差异。
我阅读了一些建议,认为这种事情可能是由损坏的索引引起的。我在数据库上运行了 checkdb 并没有发现错误。最后我清除了执行计划,一切都很好。
如果它不是某种类型的损坏问题,而只是非常具体的执行计划的问题,那么这是否意味着执行计划中存在错误并且我们在 SQL Server 中遇到了错误?我们在 SQL Server 2012 RTM 上没有更新,所以我查看了累积更新和服务包中所有修复的文档,但没有一个问题似乎与我们自己的相关。
关于可能导致这种情况的任何其他想法或想法?
(@P1 varchar(8000),@P2 bit,@P3 varchar(8000),@P4 bit,@P5 varchar(8000))
SELECT e.*
FROM (
SELECT
TOP 25
ROW_NUMBER() OVER (
ORDER BY AddedDate DESC
) AS Row,
ID
, Prefix
, FirstName
, LastName
, Company
, Address
, City
, State
, Zip
, Country
, WorkPhone
, HomePhone
, MobilePhone
, Email
, MailingLists
, AddedDate
, AwaitingOptin
, …Run Code Online (Sandbox Code Playgroud) 我在我的 SQL Server 的 tempdb 之一上有一个奇怪的行为。
它有六个 tempdb 文件,根据 SSMS 和查询,都指向 S 目录。他们每个人都有 ~5gb 的初始大小。
奇怪的是 S 是法定人数,实际上只有 2GB 的可用空间。Tempdb 文件根本不存在于 S 及其子目录中。
问题是 tempdb 文件在哪里?:) 我怎样才能看到它们?
谢谢你。
sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012 tempdb
我必须UPDATE在具有 50 万条记录的实时在线数据库上运行一条语句。我想知道哪个语句运行得更快:
Update Table set REC_ID = isnull(REC_ID,'')
Update Table set REC_ID = '' where REC_ID is null
Run Code Online (Sandbox Code Playgroud)
我正在使用 Microsoft SQL Server 2012
从其他位列计算位列的公式是什么?
例如:
CREATE TABLE #Employee
(
[empNumb] [INT] identity(1,1) PRIMARY KEY,
[IsOk] [BIT] NOT NULL, -- This is computed from other three columns.
[HasValidHours] [BIT] NOT NULL,
[NoDemerits] [BIT] NOT NULL,
[NoAccidents] [BIT] NOT NULL
);
ALTER TABLE #Employee ADD CONSTRAINT [DF_Employee_HasValidHours]
DEFAULT ((0)) FOR [HasValidHours];
ALTER TABLE #Employee ADD CONSTRAINT [DF_Employee_NoDemerits]
DEFAULT ((0)) FOR [NoDemerits];
ALTER TABLE #Employee ADD CONSTRAINT [DF_Employee_NoAccidents]
DEFAULT ((0)) FOR [NoAccidents];
Run Code Online (Sandbox Code Playgroud)
IsOk将根据,和的和-ing计算。HasValidHoursNoDemeritsNoAccidents
我有2个表,我想更新table2与的标准table1和table2。标准是:
1.table1.amount > 10000
2.table2.flag为空或table2.flag = '0'
因此,如果 2 个条件为真,则更新table2.flag = '1'和table2.flagdate = getdate()
table2.flag是一个检查每个支付超过10,000的人的标志。但是如果已经标记了,我不想再次标记,因为我不能丢失原始的table2.flagdate. 但是我尝试了很多东西,没有任何效果是我想要的。有任何想法吗?
我有一个工作正常的查询:
SELECT
month_date= month(SendTime) ,year_date =year(sendtime) ,MessageType
,COUNT(MessageType) AS MESSAGE_COUNT
FROM Message
WHERE year(SendTime)= 2014
and messagetype NOT LIKE '%test%'
and messagetype NOT LIKE '%ANOTHER THING%'
and messagetype NOT LIKE '%STUFF%'
GROUP BY month(SendTime),year(sendtime), MessageType
Run Code Online (Sandbox Code Playgroud)
我注意到的是LIKE有条件它使流逝时间变慢。
使用上面的查询,它在经过时间 0.550 运行,没有它们 0.154。
有没有其他方法可以缩短这次时间并使查询更快?
没有消息类型不是索引,我不允许更改它。
我在这些服务器上有 SQL Server 2008 R2 SP2 和 SQL Server 2012 SP2。
我有一个数据库,其中有很多堆索引超过 90% 的碎片。
轻松修复这些堆索引的最佳选择是什么?
我有以下查询。有没有一种方法可以将其放入一个查询中?如果没有,我可以进一步缩小它吗?请指教。
DECLARE @highRegion TABLE(regionId INT, countR INT)
DECLARE @lowRegion TABLE(regionId INT, countR INT)
DECLARE @midRegion TABLE(regionId INT, countR INT)
INSERT INTO @highRegion
SELECT c.fRegionID,
COUNT(1) AS VALUE
FROM census.Country c
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
WHERE ig.Name IN ('High income: nonOECD', 'High income: OECD')
GROUP BY
c.fRegionID
INSERT INTO @lowRegion
SELECT c.fRegionID AS VALUE,
COUNT(1)
FROM census.Country c
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
WHERE ig.Name = 'Upper middle income'
GROUP BY
c.fRegionID
INSERT INTO …Run Code Online (Sandbox Code Playgroud) performance sql-server optimization sql-server-2012 query-performance
sql-server-2012 ×10
sql-server ×9
performance ×2
index-tuning ×1
null ×1
optimization ×1
table ×1
tempdb ×1
update ×1
wait-types ×1