我有一个标量函数,它返回一个大的 XML,它是通过一堆发票创建的。
可以使用几种不同的方法计算要提供给函数的确切发票列表,但函数每次都是相同的。出于这个原因,我声明了一个用户定义的表类型来包含表中的主键eInvoice.Header并将其传递给函数。这样我就可以有几个不同的函数来决定要处理哪些发票,并且只有一个函数可以实际生成 XML:
create function eInvoice.GetRelevantLinesInOneWay()
returns table ...
create function eInvoice.GetRelevantLinesInAnotherWay()
returns table ...
create function eInvoice.GetXML(@lines eInvoice.InvoicePrimaryKeys readonly)
returns xml
as
begin
declare @x xml;
with xmlnamespaces(N'important namespace' as pro)
select @x = (
select
...
from
eInvoice.Header h
inner join @lines l on h.ST_PRIMARY = l.invoice_row_id
for xml path(N'pro:Import'), type
);
return @x;
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种设置已被证明是非常脆弱的。
通常@lines包含大约 150 行(大约1min eInvoce.Header)。正确的执行计划是在 上使用索引查找ST_PRIMARY,当我将 的主体eInvoice.GetXML作为临时查询执行时,总是会发生这种情况。
然而,当我将它存储为一个函数时,它会按预期工作一段时间,然后发生了一些事情(太多行@lines,比如大约300 …
performance sql-server execution-plan sql-server-2012 table-valued-parameters query-performance
我注意到我可以在master数据库中创建表、模式、存储过程等。
我不知道是什么授予此权限。这很烦人,因为当我们在 SSMS 中打开一个 *.sql 文件时,它默认与master 相关。如果在CREATE没有注意到并设置正确的数据库上下文的情况下执行操作,则在master 中创建表。
如果我们没有权限,我们会得到一个错误,注意到它并更改数据库上下文。有了权限,表就创建好了,后面我们才看到错误,需要删除重新创建。我注意到在master中已经错误地创建了一些表。
我想撤销每个人类用户的许可,但我害怕破坏某些东西。我不知道某些 SQL Server 例程是否需要在那里创建的权限。
在不破坏 SQL Server 的情况下从master撤销创建权限的最佳方法是什么?
security sql-server permissions sql-server-2012 master-system-database
当我在网络共享驱动器中进行备份时,下面提到了 TSQL。
Use DatabaseName
Go
Backup Database DatabaseName
To Disk=N'H:\DatabaseBackup\DatabaseName.bak';
Go
Run Code Online (Sandbox Code Playgroud)
我在 SSMS 中收到以下错误。
Msg 3201, Level 16, State 1, Line 1
Run Code Online (Sandbox Code Playgroud)
无法打开备份设备'H:\DatabaseBackup\DatabaseName.bak'。操作系统错误 3(系统找不到指定的路径。)。
Msg 3013, Level 16, State 1, Line 1
Run Code Online (Sandbox Code Playgroud)
BACKUP DATABASE 异常终止。
因为我已经通过这个 TSQL 检查了 'xp_cmdshell' 。run_value & config_value 如下:
name minimum maximum config_value run_value
xp_cmdshell 0 1 1 1
Run Code Online (Sandbox Code Playgroud)
注意:这里H是我的网络共享。
任何建议将不胜感激。
我需要以下情况的帮助:
在我的表 SQLServer 2012 中有一个带有 xml 值的字段,我想选择该字段中的数据并在表单列中显示结果。
<row>
<ID_Cota>162986</ID_Cota>
<ID_Taxa_Plano>1000</ID_Taxa_Plano>
<ID_Plano_Venda>1020</ID_Plano_Venda>
<ID_Pessoa>18522</ID_Pessoa>
</row>
Run Code Online (Sandbox Code Playgroud)
谢谢你。
SELECT * FROM RegisteredThumbnail WHERE UserId = 512315
Run Code Online (Sandbox Code Playgroud)
此查询需要大约 6:45 分钟才能获取预期的行。
为了克服这个问题,索引是我唯一的选择吗?
通过将二进制数据替换为图像 url 作为字符串数据来更改图像数据的存储方式会有很大帮助吗?
由于这是当前的操作系统,因此更改列并不是一个好主意。
任何想法将不胜感激。
尚未配置索引。
我是 Always On Availability Groups 的新手,我对创建登录名有点困惑。
让我们假设一个环境 NODE1(Primary) & NODE2(secondary) & NODE3(Stand by) & VAEWI(Listener)。
我需要创建一个 SQL 身份验证登录。
为此,我假设我需要通过连接到将在所有节点中同步的侦听器来创建它。
我需要创建一个 Windows 身份验证。
为此,我认为,因为所有节点在创建可用性组之前都是窗口集群的。因此,我们需要在主节点中创建一个 Windows 用户 1st,然后通过连接到侦听器来创建 Windows 身份验证。
谁能告诉我我的假设是否正确?
sql-server sql-server-2012 availability-groups sql-server-2014
我的同事问我很简单,但对我来说很难的问题:
如果我deleted在INSTEAD OF触发器中有 10 条记录的表并且我删除了其中的 8 条记录,那么我deleted在AFTER触发器中的表中有多少条记录?
我认为它应该是 10,但我不确定。
我有一个包含 OrderId 的表订单(WarehouseId 和 OrderId 是复合主键)。
WarehouseId | OrderId | ItemId | OrderDate
-------------------------------------------
1 | 1 | 1 | 2016-08-01
1 | 2 | 2 | 2016-08-02
1 | 3 | 5 | 2016-08-10
2 | 1 | 1 | 2016-08-05
3 | 1 | 6 | 2016-08-06
Run Code Online (Sandbox Code Playgroud)
(表格已简化,仅显示必填字段)
如何有效地选择特定仓库的最后一个订单?我目前这样做:
SELECT TOP 1 * FROM tblOrder WHERE WarehouseId = 1 ORDER BY OrderId DESC
Run Code Online (Sandbox Code Playgroud)
我担心的是,当我有一个特定仓库的一百万(或更多)订单时,通过排序和选择第一条记录,它会太慢(我认为?)。从我目前得到的建议来看,这不是一项昂贵的操作,因此应该没问题。那正确吗?
或者,有没有更有效的方法来选择最后一个订单记录?
我们有一个针对大型表的本地更新统计作业,它基本上发出 UPDATE STATS 命令。从历史上看,我们一直默认使用 FULL SCAN,但最近我们切换到 SAMPLE 50 PERCENT。奇怪的是,update stats 命令的运行时间要高得多。
举个例子,我们有表 1,它有 6 个统计信息(3 个索引,3 个自动生成)。聚集索引为 1.2 TB;NCI 1 为 2.7 GB;NCI 2 为 2.6 GB
1 个月前使用 FULL SCAN 更新了表上的统计信息,该命令耗时 96 分钟。昨晚更新了统计数据,SAMPLE 50 PERCENT,命令耗时 593 分钟!两次运行之间的表行数大致相同。
我可以从 sys.dm_db_stats_properties 看到聚集索引只占用了 4 分钟的时间。我的问题是,为什么将采样率降低 50% 会导致命令运行时间延长近 5 倍?
命令运行时没有发生任何阻塞(根据 SQL Sentry),也没有任何资源瓶颈(CPU < 40%,IO 延迟 < 10 by-in-large)。
我想知道的一件事是并行性是否在起作用 - 使用完整扫描,SQL 可以使用并行性,但使用示例 % 它是单线程的吗?
我们正在运行 SQL 2012 SP2 CU7
我正在尝试找出具有Probe Residual.
需要了解以下内容
Probe Residual 以下是我的一次尝试——但我被困在获取其他细节上。如何获取这些详细信息?
注意:我使用的是 SQL Server 2012
WITH XMLNAMESPACES
(
DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan'
)
SELECT
DECP.cacheobjtype,
DECP.objtype,
DECP.plan_handle,
DEQP.objectid,
DEQP.query_plan,
DEST.[text]
FROM sys.dm_exec_cached_plans AS DECP
CROSS APPLY sys.dm_exec_query_plan(DECP.plan_handle) AS DEQP
CROSS APPLY sys.dm_exec_sql_text(DECP.plan_handle) AS DEST
WHERE
1 = DEQP.query_plan.exist(
'//RelOp[
@PhysicalOp = "Hash Match"
]')
Run Code Online (Sandbox Code Playgroud)
甲探头残余例
下面引用 Grant Fritkey 和 Rob Farley 的博客/文章
sql-server-2012 ×10
sql-server ×9
performance ×2
xml ×2
backup ×1
permissions ×1
plan-cache ×1
security ×1
statistics ×1
trigger ×1