我在全新的 NUC 上安装了 Windows 11,然后安装了所有更新。安装Visual Studio 2022 CE并SSMS (v 18.10)
我尝试启动 localDB,假设它是作为 Visual Studio 2022/SSMS 的一部分安装的,当(localdb)\\mssqllocaldb在 SSMS 中输入\xc2\xa0 时,它收到错误\xc2\xa0
Cannot connect to (localdb)\\mssqllocaldb.\n\nSQL Network Interfaces, error: 50 - Local Database Runtime error occurred.\xc2\xa0\n\nError Number: -1983577846\nRun Code Online (Sandbox Code Playgroud)\n然后我验证/尝试启动实例,如下所示
\nsqllocaldb stop mssqllocaldb\nsqllocaldb delete mssqllocaldb\nsqllocaldb start "MSSQLLocalDB"\nRun Code Online (Sandbox Code Playgroud)\n当输入最后一个命令时,我收到错误\xc2\xa0
\n由于以下错误,LocalDB 实例“MSSQLLocalDB”启动失败:\n无法创建自动实例。有关错误详细信息,请参阅 Windows 应用程序事件日志。
\n我查看了下找到的日志文件
\n....\\AppData\\Local\\Microsoft\\Microsoft SQL Server 本地 DB\\Instances\\MSSQLLocalDB
\n并查看一些错误文件并按日期选择最新的一个。
\n它包含信息,最后一行是\xc2\xa0
\n2021-12-11 10:48:42.67 spid10s \xc2\xa0 \xc2\xa0 There have been …Run Code Online (Sandbox Code Playgroud) 以下是使用sp_executesql的动态过滤解决方案
IF OBJECT_ID(N'dbo.GetOrders', N'P') IS NOT NULL DROP PROC dbo.GetOrders;
GO
CREATE PROC dbo.GetOrders
@orderid AS INT = NULL,
@custid AS INT = NULL,
@empid AS INT = NULL,
@orderdate AS DATE = NULL
AS
DECLARE @sql AS NVARCHAR(1000);
SET @sql =
N'SELECT orderid, custid, empid, orderdate, filler'
+ N' /* 27702431-107C-478C-8157-6DFCECC148DD */'
+ N' FROM dbo.Orders'
+ N' WHERE 1 = 1'
+ CASE WHEN @orderid IS NOT NULL THEN
N' AND orderid = @oid' ELSE N'' END …Run Code Online (Sandbox Code Playgroud) 我有一个 SQL 查询,它是由一堆嵌套的视图和表值函数组成的,深度至少为 4 层(我没有时间或耐心去完成这一切,它有数百行代码在每个级别)。
我一直试图理解为什么当我使用选项(重新编译)运行基本查询时它运行得非常快,但是当我在没有这个选项的情况下运行它时,它运行得非常慢。
我已确保在发生这种情况之前清除计划缓存,即使在生成新计划时,它也不是最佳的,但是,选项(重新编译)速度很快。
我检查了这两个计划,并注意到对于带有选项(重新编译)的计划,传递的参数。
SELECT [p].[Activity]
,[p].[ActivityType]
,[p].[Company]
,[p].[Flags]
,[p].[Id]
,[p].[Name]
,[p].[Priority]
,[p].[Filters]
,[p].[Priority]
,[p].[Classification]
,[p].[Number]
,[p].[TaskFilter]
,[p].[TaskType]
,[p].[User]
FROM (
SELECT *
FROM [ActivProdStatuses]('ProdJobTask', 0)
) AS [p]
WHERE (
( ([p].[User] = 'some_value') AND (([p].[Flags] & 8) = 0) )
AND ([p].[Activity] = 'unique_value')
)
AND
(CASE
WHEN ([p].[Flags] & 4) <> 0
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT)
END = 1 )
ORDER BY [p].[Priority]
OPTION (RECOMPILE)
Run Code Online (Sandbox Code Playgroud)
在没有 OPTION …
sql-server execution-plan azure-sql-database recompile query-performance
我正在尝试跟踪存储过程的所有执行(包括来自其他存储过程内部)以及该过程的语句 - 这对于扩展事件是否可能?我当前的扩展活动是:
CREATE EVENT SESSION [EVENT_NAME] ON SERVER
ADD EVENT sqlserver.rpc_completed(SET collect_data_stream=(1)
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%MY_STORED_PROCEDURE_NAME%'))),
ADD EVENT sqlserver.sp_statement_completed(
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%MY_STORED_PROCEDURE_NAME%'))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%MY_STORED_PROCEDURE_NAME%')))
ADD TARGET package0.event_file(SET filename=N'TraceData')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用,除非我手动执行该过程。有什么最佳实践方法可以做到这一点?
我正在 SQL Server 2017 中运行扩展事件会话,该会话仅记录module_end特定数据库的事件。出现此痕迹的原因有两个:
在查看一些结果时,我注意到列表中的一些过程执行了数千万次,但从来没有一次大于row_count0。还有很多其他记录的事件row_count似乎填充正确,因此我最初认为那些从未返回结果的应用程序被引用它们的应用程序错误调用了。然而,事实并非如此。
为了更好地查看调用过程所使用的参数,我启动了一个 Profiler 会话,仅监视这些过程调用。我正在检查的特定过程被非常频繁地调用,并且我很快就收到了大量示例调用,并关闭了探查器。从中注意到以下几点:
row_count正确记录1为而不是0。以下是我正在使用的扩展事件的定义:
Create Event Session [Test Event] On Server
Add Event sqlserver.module_end
(
Action (sqlserver.database_name, sqlserver.session_id)
Where
(
sqlserver.database_name = N'TestDatabase'
And object_type = 'P'
)
)
Add Target package0.ring_buffer (Set max_events_limit = 10000, max_memory = 51200)
With
(
Max_Memory = 4096KB,
Event_Retention_Mode = Allow_Single_Event_Loss,
Max_Dispatch_Latency = 30 Seconds,
Max_Event_Size = 0KB,
Memory_Partition_Mode = None, …Run Code Online (Sandbox Code Playgroud) 考虑以下具有多列索引的示例表:
create table BigNumbers (
col1 tinyint not null,
col2 tinyint not null,
col3 tinyint not null,
index IX_BigNumbers clustered (col1, col2, col3)
)
DECLARE @n INT = 100;
DECLARE @x1 INT = 0;
DECLARE @x2 INT = 0;
DECLARE @x3 INT = 0;
SET NOCOUNT ON;
WHILE @x3 <= @n BEGIN
SET @x2 = 0;
WHILE @x2 <= @n BEGIN
SET @x1 = 0;
WHILE @x1 <= @n BEGIN
insert into BigNumbers values (@x1, @x2, @x3);
SET @x1 = …Run Code Online (Sandbox Code Playgroud) Azure SQL 数据库。
我有一个表,我需要从中获取Col1和Col2基于 的第一行和最新行CreateDate。
CREATE TABLE dbo.table1 (
Id INT IDENTITY(1,1) PRIMARY KEY ,
Col1 VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL ,
Col2 VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL ,
CreateDate DATETIME NOT NULL
) ;
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的索引:
CREATE INDEX IX__table1_ASC
ON dbo.table1 (Col1, Col2, CreateDate );
Run Code Online (Sandbox Code Playgroud)
我获取第一行的查询是(计划在这里):
--Get the first row
SELECT TOP (1) WITH TIES
*
FROM table1
ORDER BY ROW_NUMBER()
OVER (PARTITION BY Col1, Col2
ORDER BY CreateDate );
Run Code Online (Sandbox Code Playgroud)
索引扫描使用我创建的索引 ( …
sql-server optimization execution-plan azure-sql-database query-performance
即使我要求一个小样本,在聚集列存储表上构建统计信息似乎总是会读取整个表。为什么是这样?
在阻塞进程报告和死锁 XML 的 SQL Server 扩展事件中,可以获取多个 SQL 句柄值以识别引发事件中涉及的查询。
由于可能涉及 1 个或多个 SQL 句柄,因此可靠地查询 XML 以检索所有这些句柄可能会很困难,并且还会使更简单的 XQuery 不正确,因为它仅检索第一个存储的值。
sqlhandle = bd.value('(process/executionStack/frame/@sqlhandle)[1]', 'varchar(130)'),
Run Code Online (Sandbox Code Playgroud)
用于说明的示例 XML 片段如下所示:
<executionStack>
<frame line="1" stmtend="108" sqlhandle="0x020000008d18260040e407ba48fc247b0cb6121c21c2cf2b0000000000000000000000000000000000000000" />
<frame line="1" stmtend="108" sqlhandle="0x02000000dd847b18dcaa4a09a89f56595186fcf91da8a7f70000000000000000000000000000000000000000" />
</executionStack>
Run Code Online (Sandbox Code Playgroud)
此 SQL Fiddle提供了更完整的示例。
我已经做到了这一点:
SELECT
sql_handle =
@x.query('for $s in //executionStack/frame return $s');
Run Code Online (Sandbox Code Playgroud)
但这并没有得到我所追求的。扩展该查询以使用该@sqlhandle属性会引发错误:
SELECT
sql_handle =
@x.query('for $s in //executionStack/frame/@sqlhandle return $s');
Run Code Online (Sandbox Code Playgroud)
消息 2396,级别 16,状态 1,第 60 行 XQuery [query()]:属性不得出现在元素外部
我怎样才能像这样查询 XML 以将所有列出的 SQL 句柄作为逗号分隔列表返回?
在 Javascript、Excel、Python 和科学计算器中,模运算
-34086.1576962834 % 360.0 <-- python
=MOD(-34086.1576962834, 360.0) <-- Excel function
Run Code Online (Sandbox Code Playgroud)
给出一个值113.84230371659942. (或者非常接近的东西,取决于小数位数和四舍五入。)
但在 T-SQL 中,
Select -34086.1576962834 % 360.0
Run Code Online (Sandbox Code Playgroud)
返回值-246.1576962834.
我尝试过使用
Select cast(-34086.1576962834 as numeric(30,15)) % cast(360.0 as numeric(30,15))
Run Code Online (Sandbox Code Playgroud)
我在想,这可能是浮点与固定十进制数学不匹配的一个例子,但这并不能解决问题。
为什么 SQL Server 不以与计算器/预期结果一致的方式执行此操作?更重要的是,有没有办法让 T-SQL 像我的计算器一样进行算术运算?
我主要使用 SQL Server 2019,但我已经确认 SQL Server 2012 和 2014 也给出相同的 -246... 结果。
Oracle 函数mod(x,y)和 pythonmath.fmod(x,y)给出相同的 -246.nnn 结果。
sql-server ×10
btree ×1
columnstore ×1
dynamic-sql ×1
index ×1
optimization ×1
profiler ×1
recompile ×1
ssms ×1
statistics ×1
t-sql ×1
xml ×1
xquery ×1