标签: sql-server

如何提高同一表上查询匹配的性能

我需要在同一个表中查找可能匹配的客户记录。逻辑如下。然而,这似乎在 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)

查询计划

performance sql-server t-sql query-performance

2
推荐指数
1
解决办法
106
查看次数

避免在 SQL Server 的联接中使用复杂的字符串?

我将在 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获取与 …

join data-warehouse database-design sql-server t-sql

2
推荐指数
1
解决办法
126
查看次数

NTFS 文件系统碎片和其他影响与数据库文件

可能大家都知道,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。

sql-server storage

2
推荐指数
1
解决办法
178
查看次数

在价格列下方添加总和,而不是在其自己的列中

我在我的数据库上运行这个选择查询:

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 aggregate sql-server-2012

2
推荐指数
1
解决办法
6261
查看次数

统计查询结果中出现的次数

我在我的 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)

sql-server sql-server-2012

2
推荐指数
1
解决办法
1764
查看次数

T-SQL 和 MDX 之间最相关的相似之处是什么?

我使用过 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 learning ssas t-sql mdx

2
推荐指数
1
解决办法
208
查看次数

找出错误日志的日期和/或数量 xp_readerrorlog

我有一些代码可以帮助每天在我们的 SQL Server 上自动检查错误日志。此代码调用xp_readerrorlog 0来检查错误日志,并调用 xp_readerrorlog 0,1来检查 SQL Server 日志。

然而,有时我需要扫描不止一个错误日志。

我希望能够通过 T-SQL 查看日志的日期,或者除此之外,找到存在的日志数量。

我读到我们最多可以有 99 个存档日志,但是当尝试显示不存在的错误日志时,服务器会抛出以下错误消息。

“xp_readerrorlog() 返回错误 2,'系统找不到指定的文件。”

我知道日期信息和数字存在,因为 SSMS 显示它(见下图。)

在此处输入图片说明

sql-server t-sql error-log

2
推荐指数
1
解决办法
1617
查看次数

事务日志每小时还原一次

是否可以每小时将 SQL 事务日志恢复到 MS SQL 数据库,而不必先恢复完整备份?

您可以将数据库设置为无恢复,应用事务日志,然后设置为恢复。每小时都这样做吗?那可能吗?

问题的原因是供应商每天早上发送完整的数据库备份,而不是发送大型备份,而是全天发送 T-Log。

sql-server restore transaction-log

2
推荐指数
1
解决办法
291
查看次数

读取连接命令时出错

我正在尝试运行一个递归更改表,从我的 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)

sql-server t-sql

2
推荐指数
1
解决办法
292
查看次数

什么是 SQL Server 中的“混淆密钥”?

撇开笑话不谈,什么是“混淆密钥”?我只是要离开文档。

sys.sysclsobjs存在于每个数据库中。每个分类实体包含一行,这些实体共享相同的公共属性,包括以下内容:

...

混淆密钥。

这似乎涉及

  • Content/binn/sqllang.dll
  • Content/binn/sqlmin.dll

我想知道密钥的作用和被混淆的内容,以及是否可供用户使用。

sql-server encryption database-internals

2
推荐指数
1
解决办法
513
查看次数