我正在为应用程序用户创建一个伪随机数据集进行训练。
我很惊讶,如果我用 1、2、3 等为 RAND() 函数设置种子,我从种子函数中得到几乎相同的结果。但是,当未提供种子时,这似乎是“适当随机”但可重复的值。
SELECT RAND(1) AS R1A, RAND() AS R1B, RAND(2) AS R2A, RAND() AS R2B,
RAND(3) AS R3A, RAND() AS R3B, RAND(4) AS R4A, RAND() AS R4B
0.713591993212924
0.472241415009636
0.713610626184182
0.217821139260039
0.71362925915544
0.963400850719992
0.713647892126698
0.708980575436056
Run Code Online (Sandbox Code Playgroud)
乍一看,我似乎可以评估 RAND(@seed) 并丢弃结果,然后评估 RAND() 以获得我的训练数据的几个真正“随机”的数字 - 到目前为止,我计划每条记录使用四个;我可能还需要一些。
那个计划能正常运作吗?而且,我在看什么,在这里?而且,它应该在文档中吗?我还没找到
文档说明了这一点,这可能是一个线索:
RAND 函数是一个伪随机数生成器,其运行方式类似于 C 运行时库 rand 函数。如果没有提供种子,系统会生成自己的可变种子编号。
C 中的 rand 函数是否为相似的种子输入产生相似的输出?
我认为文档还可以更清楚地说明 RAND(@number) 后跟 RAND() 总是生成相同的数字。但这就是我想要的,也是任何有经验的计算机程序员都会期望的。
我想我可以用从https://www.random.org/获得的随机数据键来填充表格以 用于此目的 - 但这有缺点。
我对 RAND() 有以下结论,现在我想我会继续下去,但要记住替代方案。
RAND(@int) 使用给定的整数值设置随机数生成器的种子,并返回一个在统计上不独立的浮点结果,因为 RAND(@int) 和 RAND(@int+1) …
如果答案是“不”,我可以接受...
我想看看这是否可以优化......它是更大的存储过程的一部分。CGCode是 varchar(50),Year并且Month是smallint,FEIN是char(9)
select max(id)
from Table
where 1=1
and cgcode = 123
and datefromparts(cast(year as char(4)),cast(month as char(2)),'01') < getdate()
and totalcount > 0
group by cgcode, year, month, fein
Run Code Online (Sandbox Code Playgroud)
实际执行计划的逻辑读取:1,566,473
源表原始数据 3200万+条记录
估计行数:640K,实际 55K,在 Group By 开始之前
上的隐式转换警告Year/Month/CGCode(作为bigint)
执行时间大约为 7.5 秒,执行非聚集索引查找:
最终结果集是 114 行(为此,CGCode我们测试...其他各不相同)
Prod 的性能在比 Dev box 明显更好的硬件上大致相同。随着时间的推移,这只会变得更糟,因为它会提取比当前月份更旧的所有内容,以在 UI 中填充历史图表。
我还能提供哪些其他信息?
当前使用的索引:
CREATE NONCLUSTERED INDEX [COIX_Table_TotalCount] ON [dbo].[Table]
( …Run Code Online (Sandbox Code Playgroud) 我想监控事务日志的使用情况,涉及以下所有方面:
什么 Task\Job\Query 使它填充驱动器\文件。
日志文件使用百分比。
交易发生的时间。
任何经过测试的相关方法都会有所帮助。
我有一个 C# 计划任务,它每晚运行,并包含一个 kill 命令来删除现有数据库,以便可以重新创建它。它大约每周随机生成一次此错误。
杀死数据库失败。用户无权更改数据库“Foo”、数据库不存在或数据库未处于允许访问检查的状态。杀死数据库失败。
使用的C#如下。
srv.KillAllProcesses;
srv.KillDatabase;
Run Code Online (Sandbox Code Playgroud)
所以我已经在尝试终止所有进程。在执行 kill 命令之前是否还有其他检查或命令可以确保它成功执行?这不可能是用户权限问题,因为该操作大部分时间都在工作,那么什么可能导致“未处于允许访问检查的状态”?
我不确定这是否是一个奇怪的问题,所以请让我知道我在下面描述的内容是否可行。
我们有一个服务器,它是由其他人配置的,我们没有人“添加到其中”。
截至目前,我只sa登录了所述服务器。
我正在通过
SQLCMD -E -S ".\SQLServer"
Run Code Online (Sandbox Code Playgroud)
然后通过
SELECT name FROM sys.syslogins
Run Code Online (Sandbox Code Playgroud)
输出是
sa
Run Code Online (Sandbox Code Playgroud)
我只想对表运行 SELECT 语句以查看值。
题
有什么我可以做的吗?
我曾尝试 DB 更改和可信赖,但由于我根本不是会员,因此我的访问被拒绝。
我只需要运行 SELECT 语句。
我正在使用 SQL Server 默认导入工具导入大小约为 48 GB 的巨大数据文件。它继续为应用程序正常执行。13000000 行插入,但在此之后任务失败并出现以下错误。我无法打开 csv,因为它太庞大了,我也不能在其中逐行移动并分析统计数据。我真的很困惑如何处理这个。
使用 Forrest 的这个解决方案:
DECLARE @XML xml =
'<?xml version="1.0" encoding="UTF-8"?>
<Orders>
<Order>
<OrderID>334</OrderID>
<AmountPaid currencyID="EUR">17.10</AmountPaid>
<UserID>marc58</UserID>
<ShippingAddress>
<Name>Marc Juppé</Name>
<Address>Rue garçonneé III° arrondissement</Address>
<City>Paris</City>
<StateOrProvince></StateOrProvince>
<Country>FR</Country>
<Phone>333333333</Phone>
<PostalCode>22222</PostalCode>
</ShippingAddress>
<ShippingCosts>4.50</ShippingCosts>
<Items>
<Item>
<Details>
<ItemID>3664</ItemID>
<Store>47</Store>
<Title>MCPU DDA010</Title>
<SKU>mmx</SKU>
</Details>
<Quantity>1</Quantity>
<Price currencyID="EUR">6.2</Price>
</Item>
<Item>
<Details>
<ItemID>3665</ItemID>
<Store>45</Store>
<Title>MCPU DFZ42</Title>
<SKU>mmy</SKU>
</Details>
<Quantity>2</Quantity>
<Price currencyID="EUR">3.2</Price>
</Item>
</Items>
</Order>
</Orders>'
SELECT
x.value('./ItemID[1]','int') AS ItemID,
x.value('./Store[1]','int') AS Store,
x.value('./Title[1]','nvarchar(100)') AS Title,
x.value('./SKU[1]','nvarchar(100)') AS SKU,
x.value('../Quantity[1]','int') AS Qty,
x.value('../Price[1]','decimal(11,2)') AS Price,
x.query('//OrderID[1]').value('.','int') AS OrderID, …Run Code Online (Sandbox Code Playgroud) 我注意到当天的第一个事务日志备份,在 0700 时就像 3GB。我们在每晚 22:00 运行完整备份。我们是一家朝九晚五的商店,所以一夜之间没有真正的活动。我们在白天每小时进行一次 TLog 备份,它们平均大约 30 MB。我怎样才能找出为什么这个第一个日志备份如此之大?谢谢!
我创建了一个扩展事件会话来捕获登录和注销信息。会话设置为将事件存储到文件中。我知道使用事件文件(而不是环形缓冲区)的优点之一是事件历史记录将在重新启动时保持不变。但是,当 SQL Server 重新启动并且历史记录丢失时,似乎会创建一个新的事件文件。这是预期的吗?如果是这样,使用文件而不是环形缓冲区的优势是什么?
我已经阅读了关于索引的隐式转换影响性能的内容,因此在以下查询中
select count(*)
from fpc
where SKey in (201701, 201702)
Run Code Online (Sandbox Code Playgroud)
因为 SKey 是 int 类型,如果我将上面的查询更改为
select count(*)
from fpc
where SKey in ('201701', '201702')
Run Code Online (Sandbox Code Playgroud)
性能会下降。
我在一个表(有数百万行)上测试了这个。问题是为什么我没有看到执行计划和时间上的任何差异。
我在 SKey 上有非聚集列存储索引。
每个 SKey 大约有 2000 万行,我有大约 100 个不同的 SKey
sql-server-2014 ×10
sql-server ×9
performance ×2
backup ×1
csv ×1
import ×1
logins ×1
permissions ×1
random ×1
security ×1
t-sql ×1
xml ×1