我需要在同一个表中查找可能匹配的客户记录。逻辑如下。然而,这似乎在 O(N²) 下执行。有没有办法提高这里的性能?我试过设置索引、散列列并进行比较等,但在大型数据集上的性能仍然很糟糕。我还在下面添加了查询计划。
SELECT
C1.CustomerId AS Customer1,
C2.CustomerId AS Customer2
FROM Customer C1
INNER JOIN Customer C2
ON
C1.CustomerId != C2.CustomerId
AND
(C1.FirstName = C2.FirstName OR C1.BirthDate = C2.BirthDate)
AND
(
C1.EmailAddress = C2.EmailAddress
OR
C1.MobilePhoneNumber = C2.MobilePhoneNumber
OR
(
C1.HomeAddressLine1 = C2.HomeAddressLine1
AND
(
C1.HomePostCode = C2.HomePostCode
OR
C1.HomeSuburb = C2.HomeSuburb
)
)
)
Run Code Online (Sandbox Code Playgroud)
我将在 SQL Server 中为客户端创建几个表。对这个问题特别感兴趣的是FactStoreSale要创建表,并DimProduct在其中的第一个表将包括所有门店的销售情况,并包括例如StoreKey,DateKey,TimeKey,ProductKey和销售数据。
该DimProduct表将在关于产品,使用补充数据,即ProductName,ProductGroup,ProductCategory等这个表将在价格等每个商店而言缓慢改变的尺寸和存储产品的历史。该表将包括列FromDate和ToDate,它们分别描述了输入数据的时间和替换数据的时间(默认值为 2999 年,ToDate直到插入产品的新更新)。
我相信这是很常见的。但是,ProductKeys来自底层数据库的非常复杂的字符串,例如140-xx4449CH-4.44,9.
在我看来,我的替代方案是Checksum在 SQL Server 中使用将复杂字符串转换为整数,并将它们存储在单独的列中,ProductKeyInt
并在执行 JOINS 时使用这些列。但是校验和不保证唯一的整数值,这可能会导致问题。当我在 Virtual PC 和我自己的 PC 上尝试 Checksum 时,对相同值执行 Checksum 会返回不同的结果,这也是一个问题。我相信这两者一起排除了校验和,除非可以以某种方式操纵它以使其更独特?
另一种选择是使用更复杂的函数来确保将字符串值转换为整数,例如在我的问题中提供的此处。诸如这样的解决方案但也有问题,该值100-xx3和1003将例如得到同样的结果。从某种意义上说,如果对 SQL 不那么精通的人需要尝试查找使用该函数的 Query 的任何问题,则可能很难理解正在发生的事情,这也很复杂。
我的第三个选择似乎是使用该DimProduct表并首先从 SQL 代理更新该表,然后在该表上使用索引键并将该索引用作FactStoreSale表中的 ProductKeyInt(例如 ProductKeyInt 将是某种子查询FactStoreSale获取与 …
可能大家都知道,NTFS 在设计上有一个缺陷,它会在文件系统使用过程中导致碎片化。另一方面,MSSQL 使用文件作为数据库存储方法,而且典型的做法是将几个大的数据库放在同一个文件系统上。数据库增长给出了碎片化的完美例子,它肯定会对 SQL 服务器性能产生一些影响。
问题:是否有关于文件系统碎片对数据库/MS SQL Server 性能影响的任何信息?或者是否存在用于 MS SQL Server 数据库存储的 NTFS 优化的隐藏专有层?SQL 服务器数据库真的是 NTFS 或 OS 上的普通文件将其视为特殊对象吗?如果在 NTFS 上工作的磁盘 checkdisk 更改了某些文件系统结构怎么办?在典型情况下,它可能会更改文件系统数据的内容(一旦我在此期间丢失了 Oracle 数据库,在 BSOD 重新启动检查后自动检查。是的,它是在物理突袭中。是的,它是自动检查磁盘文件系统修复,它破坏了回滚日志)。是否有任何已知的安全机制可以防止 MS SQL 发生此类事故?
有已知的原始分区存储技术,但 MSSQL 没有内置这种技术。
我不想就明显的陈述展开激烈的战争,问题是关于技术细节以及 MS 产品添加的两个之间的关系:NTFS 和 MS SQL Server。
我在我的数据库上运行这个选择查询:
Select Item.ItemId, Item.ItemDescription, Bid.BidPrice, bid.BidDate,
Sum(bid.bidPrice) over () as TotalBids
from Bid
inner join Item on bid.ItemId=Item.ItemId
where BidDate between '2016-08-24' and '2017-11-15'
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
ItemId ItemDescription BidPrice BidDate TotalBids
1 Frame 35 2016-08-24 3624
4 Wooden chair 40 2016-10-25 3624
2 Car 3000 2017-10-26 3624
3 Stand Fan 29 2017-10-30 3624
5 Black Sofa 400 2017-11-11 3624
6 Cabinet 120 2017-11-15 3624
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有可能Total Bids在每行的列中得到一个总数,而不是在列的底部得到一个总数BidPrice?
我在我的 sql server 2012 数据库上运行以下查询。
select Appointment.AppointmentDate, Appointment.AppointmentTime, Auctioneer.AuctioneerName, Auctioneer.AuctioneerSurname, Buyer.BuyerName, Buyer.BuyerSurname
from Appointment
inner join Auctioneer on Appointment.AuctioneerId=Auctioneer.AuctioneerId
inner join Buyer on Appointment.BuyerId=Buyer.BuyerId
where AppointmentDate between '2017-01-01' and '2017-12-31'
Run Code Online (Sandbox Code Playgroud)
结果如下:
+-----------------+-----------------+----------------+-------------------+-----------+----------------+
| AppointmentDate | AppointmentTime | AuctioneerName | AuctioneerSurname | BuyerName | BuyerSurname |
+-----------------+-----------------+----------------+-------------------+-----------+----------------+
| 2017-10-23 | 13:00:00 | Mary | Borg | David | Borg |
| 2017-10-24 | 15:30:00 | Mary | Borg | Joseph | Sammut |
| 2017-11-03 | 09:30:00 | Joseph | Smith …Run Code Online (Sandbox Code Playgroud) 我使用过 T-SQL(CTE、窗口函数、递归 CTE、大数据、表值函数、APPLY、PIVOT、存储过程等),但从未查询过 Microsoft SSAS 多维数据集。
对于以下 T-SQL 概念,MDX 中是否有类似的概念?
使用 MDX 的 T-SQL 用户是否有任何陷阱?
我希望 T-SQL 和 MDX 之间有一些共同的类比,这将有助于擅长 T-SQL 的人过渡到 MDX。
如果有一个关于从 T-SQL 进入 MDX 时所犯的常见错误的指南,那就太好了。
我有一些代码可以帮助每天在我们的 SQL Server 上自动检查错误日志。此代码调用xp_readerrorlog 0来检查错误日志,并调用 xp_readerrorlog 0,1来检查 SQL Server 日志。
然而,有时我需要扫描不止一个错误日志。
我希望能够通过 T-SQL 查看日志的日期,或者除此之外,找到存在的日志数量。
我读到我们最多可以有 99 个存档日志,但是当尝试显示不存在的错误日志时,服务器会抛出以下错误消息。
“xp_readerrorlog() 返回错误 2,'系统找不到指定的文件。”
我知道日期信息和数字存在,因为 SSMS 显示它(见下图。)
是否可以每小时将 SQL 事务日志恢复到 MS SQL 数据库,而不必先恢复完整备份?
您可以将数据库设置为无恢复,应用事务日志,然后设置为恢复。每小时都这样做吗?那可能吗?
问题的原因是供应商每天早上发送完整的数据库备份,而不是发送大型备份,而是全天发送 T-Log。
我正在尝试运行一个递归更改表,从我的 sys 表中读取几个参数。
DECLARE @AlterCmd NVARCHAR(MAX)
SELECT top 1
@AlterCmd = 'ALTER TABLE [dbo].[table] ALTER COLUMN ' + COLUMN_NAME + ' NVARCHAR(' + CHARACTER_MAXIMUM_LENGTH + ')'
FROM
information_schema.columns
WHERE
table_name = 'table_name' and DATA_TYPE like '%char%'
print @AlterCmd
Run Code Online (Sandbox Code Playgroud)
在此示例代码中,我只想验证命令是否正确,但由于连接中的错误而无法运行它。根据我收到的错误消息:
Msg 245, Level 16, State 1, Line 63
Conversion failed when converting the varchar value ')' to data type int.
Run Code Online (Sandbox Code Playgroud) 撇开笑话不谈,什么是“混淆密钥”?我只是要离开文档。
sys.sysclsobjs存在于每个数据库中。每个分类实体包含一行,这些实体共享相同的公共属性,包括以下内容:...
混淆密钥。
这似乎涉及
Content/binn/sqllang.dllContent/binn/sqlmin.dll我想知道密钥的作用和被混淆的内容,以及是否可供用户使用。
sql-server ×10
t-sql ×5
aggregate ×1
encryption ×1
error-log ×1
join ×1
learning ×1
mdx ×1
performance ×1
restore ×1
ssas ×1
storage ×1