我有一个表Employee,其中包含列 ID、加入日期和名称
加入日期是一DATETIME栏。
我想知道十月份有多少用户加入?
执行proc1时,出现如下错误:
更新失败,因为以下 SET 选项的设置不正确:“ANSI_WARNINGS”。验证 SET 选项是否正确用于计算列上的索引视图和/或索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。
我知道这是因为我在客户表上有一个过滤索引,这需要 SET ANSI_WARNINGS ON。
甚至我们需要一些 ANSI 选项,在创建过滤索引和存储过程时需要注意这些选项。这些事情我都处理过了。
我已经通过在 proc1 中设置 ansi_warning 解决了这个问题,我认为这是理想的解决方案。
但我的问题是,即使在 proc2 中设置了所有必需的 ANSI 选项之后,为什么我会收到此错误?任何的想法?
下面是我的示例代码:
create Customers
(
id int,
name varchar(100),
[Stats] BIT NOT NULL DEFAULT 1,
)
go
CREATE NONCLUSTERED INDEX [IX_Customers_Stats]
ON [dbo].[Customers]([Stats])
WHERE [Stats] = 0
go
CREATE PROC proc1
as
BEGIN
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
....
...
.. some code .....
....
...
EXEC proc2 @customerId
END
go
createPROCEDURE [dbo].[proc2 ]
@customerId …Run Code Online (Sandbox Code Playgroud) 我刚刚下载了 SQL Server 2012 'Performance Dashboard Reports',并且在解释其中一个结果显示的数据并将其链接回 DMV 时遇到了一些问题sys.dm_exec_query_stats。
根据 CPU 报告,我执行最差的查询是已运行约 27K 次的插入语句。
当我使用query_hashfor 查询并将其放入下面的查询中时,我得到 62 个结果,每个结果都相同query_hash,query_plan_hash但具有不同的plan_handle值。
SELECT * FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS dest
WHERE query_hash = 0x1561B563078359C1
Run Code Online (Sandbox Code Playgroud)
根据BOL,execution_count显示:
自上次编译计划以来执行的次数。
并creation_time显示
编制计划的时间。
我 99.9% 确定查询每 5 分钟运行一次,但结果集中的每个查询都有creation_time今天早上的计划,但每个查询都execution_count显示约 400。
SQL Server 如何确定这个数字?这些数字是通过某种方式联系起来的plan_hash还是每个人都是独一无二的plan_handle?
performance sql-server dmv sql-server-2012 performance-tuning
PATIENTS 表中的 SURNAME 上有一个索引,我们运行以下查询但该索引没有被使用。
DECLARE @SURNAME VARCHAR(30) = 'test'
SELECT SURNAME
FROM PATIENTS AS PAT
WHERE (PAT.SURNAME LIKE @SURNAME + '%' OR @SURNAME IS NULL)
Run Code Online (Sandbox Code Playgroud)
这似乎是因为我们检查变量是否NULL就像我删除了它然后我得到了一个常量扫描、计算标量、索引查找和嵌套循环。
我们需要检查参数是否NULL为我们然后在 where 子句中忽略它。
有没有办法做到这一点并让 SQL 使用索引?
跑步:
DBCC CHECKDB(DatabaseName) with NO_INFOMSGS
Run Code Online (Sandbox Code Playgroud)
给了我以下错误:
消息 824,级别 24,状态 2,第 1 行
SQL Server 检测到基于逻辑一致性的 I/O 错误:pageid 不正确(预期为 1:7753115;实际为 0:0)。它发生在读取文件 'K:\UAT Databases\dbname.MDF' 中数据库 ID 11 中偏移量 0x00000ec9b36000 的页面 (1:7753115) 期间。SQL Server 错误日志或系统事件日志中的其他消息可能会提供更多详细信息。这是威胁数据库完整性的严重错误情况,必须立即纠正。完成完整的数据库一致性检查 (DBCC CHECKDB)。此错误可能由多种因素引起;有关详细信息,请参阅 SQL Server 联机丛书。
我还在dbo.suspect_pages 中找到了一个条目
请指教。
我正在使用 SQL Server 2008。
我有两张桌子PARTITIONTESTTABLE和PARTITIONTESTTABLESUB. PARTITIONTESTTABLESUB有一个外键PARTITIONTESTTABLE。我创建了分区,这两个表都已分区。我还从管理分区向导创建了临时表。
当我跑....
ALTER TABLE PARTITIONTESTTABLESUB SWITCH PARTITION 10 to [staging_PARTITIONTESTTABLESUB];
Run Code Online (Sandbox Code Playgroud)
...它运行成功。
但...
ALTER TABLE PARTITIONTESTTABLE SWITCH PARTITION 10 to [staging_PARTITIONTESTTABLE];
Run Code Online (Sandbox Code Playgroud)
...失败,错误:
ALTER TABLE SWITCH 语句失败。不允许 SWITCH,因为源表“Enterprise.MSH2.PARTITIONTESTTABLE”包含约束“staging_PARTITIONTESTTABLESUB_PARTITIONTESTTABLESUB_FK”的主键。
DDL:
CREATE TABLE [PARTITIONTESTTABLE](
[pkcol] [int] IDENTITY(1,1) NOT NULL,
[datacol1] [int] NULL,
[datacol2] [int] NULL,
[datacol3] [varchar](50) NULL,
[partitioncol] [datetime] NOT NULL,
CONSTRAINT [PK_PARTITIONTESTTABLE] PRIMARY KEY CLUSTERED
(
[pkcol] ASC,
[partitioncol] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, …Run Code Online (Sandbox Code Playgroud) 我需要将每日 XML 文件集成到我的系统中。
XML 文件具有与此类似的架构:
create table txml(id int identity, data xml);
insert into txml (data) values ('
<order>
<trans DTrans="20170102" HTrans="10:52"></trans>
<head Id="552665566"></head>
<lin headId="552665566">
<dLin Id="00001" CoArt="1111111" CoArtCust="05220001" NameArt="Product1" dateVal="20161115" />
<acum DCalAcm="20170101" DIniAcm="20161115"><qtyAcm Qty="1101163.00" /></acum>
<lastOrd Id="95767" QtyLastOrd="12000.00" DLastOrd="20170101" />
<pLin LType="4"><uni Qty="24000.00"/><dIni Date="20170104"/><dEnd Date="20170108"/></pLin>
<pLin LType="4"><uni Qty="20000.00"/><dIni Date="20170109"/><dEnd Date="20170112"/></pLin>
<pLin LType="4"><uni Qty="24000.00"/><dIni Date="20170113"/><dEnd Date="20170116"/></pLin>
</lin>
<lin headId="552665566">
<dLin Id="00002" CoArt="2222222" CoArtCust="05269958" NameArt="Product2" dateVal="20161101" />
<acum DCalAcm="20170101" DIniAcm="20161101"><qtyAcm Qty="552652.00" /></acum>
<lastOrd Id="49956" QtyLastOrd="5000.00" DLastOrd="20170101" />
<pLin LType="4"><uni …Run Code Online (Sandbox Code Playgroud) 我的公司有一些使用大量动态查询(无参数)的遗留系统。在较新的系统中,我们使用存储过程和参数化 SQL。然而,我们发现我们的存储过程经常出现性能峰值。
我查看了它,似乎计划缓存会定期清除存储过程计划,但在计划缓存中保留了大量动态 SQL 语句。
我对 SQL Server (SQL Server 2017) 这样做的原因有点困惑。SQL Server 如何决定删除哪一个?
我正在调整 SQL Server 2012 中的查询,该查询由于DATENAME()在列上使用该函数检查数据是周末还是工作日时基数估计不正确而溢出到 tempdb 。由于使用该函数,查询是不可sargable的,并且错误估计了行数(估计1700,实际38000)。
where 子句很简单:
WHERE DATENAME(WEEKDAY, vqc.DateRecorded) NOT IN ('Saturday', 'Sunday')
Run Code Online (Sandbox Code Playgroud)
我希望使用持久计算列,然后对其进行索引:
ALTER TABLE <table_name> ADD IsWeekend AS DATENAME(WeekDay, DateRecorded) PERSISTED;
Run Code Online (Sandbox Code Playgroud)
但是得到错误:
无法保留表中的计算列“IsWeekend”,因为该列是不确定的。
根据BOL,大量 Date 函数无法持久化,因为它们是不确定的。
这是因为结果取决于服务器会话的 LANGUAGE 和 DATEFORMAT 设置。例如,表达式 CONVERT (datetime, '30 listopad 1996', 113) 的结果取决于 LANGUAGE 设置,因为字符串 '30 listopad 1996' 表示不同语言的不同月份。同样,在表达式 DATEADD(mm,3,'2000-12-01') 中,数据库引擎根据 DATEFORMAT 设置解释字符串 '2000-12-01'。
有一个有趣的方法来解决这个问题,该MONTH()函数使用CASE发布在Stack Overflow上的声明,但这对DATENAME由于SET DATEFIRST和LANGUAGE设置不起作用。
除了在我的查询中加入日历表然后从那里过滤周末之外,有没有办法确定日期是否是周末,以便它可以被持久化然后索引?
还是我想把情况复杂化?
有什么方法可以让维护计划在单个实例上检查我的所有数据库?保养计划Check Database Integrity Task够吗?
sql-server-2008 maintenance sql-server-2008-r2 corruption maintenance-plans
sql-server ×8
consistency ×1
corruption ×1
datetime ×1
dbcc-checkdb ×1
determinism ×1
dmv ×1
group-by ×1
maintenance ×1
partitioning ×1
performance ×1
plan-cache ×1
t-sql ×1
xml ×1