小编Jam*_*s Z的帖子

用户定义函数的优化问题

我有一个问题理解为什么 SQL 服务器决定为表中的每个值调用用户定义的函数,即使只应提取一行。实际的 SQL 要复杂得多,但我能够将问题简化为:

select  
    S.GROUPCODE,
    H.ORDERCATEGORY
from    
    ORDERLINE L
    join ORDERHDR H on H.ORDERID = L.ORDERID
    join PRODUCT P  on P.PRODUCT = L.PRODUCT    
    cross apply dbo.GetGroupCode (P.FACTORY) S
where   
    L.ORDERNUMBER = 'XXX/YYY-123456' and
    L.RMPHASE = '0' and
    L.ORDERLINE = '01'
Run Code Online (Sandbox Code Playgroud)

对于此查询,SQL Server 决定为 PRODUCT 表中存在的每个值调用 GetGroupCode 函数,即使从 ORDERLINE 返回的估计行数和实际行数为 1(它是主键):

查询计划

显示行数的计划资源管理器中的相同计划:

计划浏览器 表格:

ORDERLINE: 1.5M rows, primary key: ORDERNUMBER + ORDERLINE + RMPHASE (clustered)
ORDERHDR:  900k rows, primary key: ORDERID (clustered)
PRODUCT:   6655 rows, primary key: PRODUCT (clustered)
Run Code Online (Sandbox Code Playgroud)

用于扫描的索引是: …

sql-server-2005 sql-server

26
推荐指数
2
解决办法
5058
查看次数

Slot Time Challenge - 医生预约数据库架构

我正在尝试建立一个医生预约系统,在线患者将有两个选择:

  1. 第一次访问(这次访问应该是 20 分钟)
  2. 跟进访问(此访问应为 10 分钟)

约束:

  1. 价格会根据第一次/后续枯萎而有所不同
  2. 医生可能在插槽之间有休息时间
  3. 系统界面将在预订插槽时支持这两个选项
  4. 我们需要插槽之间的最小间隙时间才能达到最大值。医生可用性的使用

到目前为止我们完成的模型是基于创建一个如下所示的 Doctor Slot 表 Doctor Slots 表架构

如果 DoctorSlot 为 N 且 N=10 分钟,请考虑以下示例

案例 第一次 if(N*2)== Free 保留块两个插槽而不是一个

案例跟进 if(N)==Free Make Reservation Block 1 slot

示例医生:9:00 至 9:10 医生:9:10 至 9:20 医生:9:20 至 9:30

病例首次向患者展示 9:00 至 9:20

挑战:

  • 附加时间从 9:00 到 9:20(医生的插槽之间可能有一个缓冲时间(医生休息))
  • 我们将从数据库中获得两个插槽 ID 而不是一个(哪个 SlotID 将与 Order 一起使用)
  • 如何在运行时根据用户的情况向用户显示我们将在哪个时间使用通用模型并相应地稍后更新价格
  • 如果用户预订了第一个时间段,然后另一个用户预订了跟进,则会出现间隙以及如何在数据库中的 SQL Server 中处理时间

问题:

  1. 实现满足所有可能场景的解决方案的最佳数据库模式是什么?
  2. 处理来自 SQL Server/ASP.NET POV 的时间实体的最佳方法是什么?

schema database-design sql-server

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

SQL Server FCI 安装与装载点权限问题

请帮我解决这个安装问题。

我正在尝试在两个 Windows Server 2012 R2 VM 上安装 SQL Server 2016(SP1 集成)故障转移群集实例 (FCI)。

我有 3 个集群磁盘。

  • 数据驱动器:E:\
  • 日志挂载点:E:\MSSQL\Log\L1
  • Tempdb 挂载点:E:\MSSQL\Data\Tempdb1

我首先尝试直接安装到这些根目录。失败后,我创建了要安装的子目录。服务帐户和我自己是 VM 的本地管理员,我明确授予对每个子目录的完全控制权。最后,我暂时尝试忽略挂载点,只安装到 E: 上的子目录。所有尝试都失败并出现以下错误。

详细结果:功能:数据库引擎服务状态:失败:有关详细信息,请参阅日志失败原因:在功能的设置过程中发生错误。下一步:使用以下信息解决错误,卸载此功能,然后再次运行安装过程。组件名称:
SQL Server 数据库引擎服务实例功能组件错误代码:0x84CF0004 错误描述:更新文件夹“E:\MSSQL\Data\TempDB1\System Volume Information”的权限设置时,文件“E:\MSSQL\Data\”的权限设置更新失败TempDB1\系统卷信息\ResumeKeyFilter.Store'。文件夹权限设置应该设置为 'D:P(A;OICI;FA;;;BA)(A;OICI;FA;;;SY)(A;OICI;FA;;;CO)(A; OICI;FA;;;S-1-5-80-419818685-2113908795-3893829424-1849583840-1690709397)'。错误帮助链接:http :
//go.microsoft.com/fwlink?LinkId=20476&ProdName=Microsoft+SQL+Server&EvtSrc=setup.rll&EvtID=50000&ProdVer=13.0.4001.0&EvtType=0x88792597%400x72597%400x720000000000x8000x8700x8700000

下面是用于安装的配置文件的匿名版本。

;SQL Server 2016 Configuration File
[OPTIONS]

ACTION="InstallFailoverCluster"
SUPPRESSPRIVACYSTATEMENTNOTICE="False"
IACCEPTROPENLICENSETERMS="False"
IAcceptSQLServerLicenseTerms="True"
ENU="True"
QUIET="False"
QUIETSIMPLE="True"
UpdateEnabled="True"
USEMICROSOFTUPDATE="False"
FEATURES=SQLENGINE,REPLICATION,FULLTEXT,DQ,CONN,BC,SDK,SNAC_SDK
UpdateSource="MU"
HELP="False"
INDICATEPROGRESS="True"
X86="False"
INSTANCENAME="InstName"
INSTALLSHAREDDIR="C:\Program Files\Microsoft SQL Server"
INSTALLSHAREDWOWDIR="C:\Program Files (x86)\Microsoft SQL Server"
INSTANCEID="InstName"
INSTANCEDIR="C:\Program Files\Microsoft SQL Server"
FAILOVERCLUSTERDISKS="Cluster Disk 7"
FAILOVERCLUSTERGROUP="SQL Server (InstName)"
FAILOVERCLUSTERIPADDRESSES="IPv4;10.10.10.17;Cluster …
Run Code Online (Sandbox Code Playgroud)

sql-server clustering sql-server-2016 mount-point

6
推荐指数
1
解决办法
3510
查看次数

MySQL - 使用 IN 子句删除需要更多时间

在 MySQL 5.6 中,我有大约 6000 万行。我想根据 Id 删除行。这里的Id是主键。

我今天有一个奇怪的行为。

delete from tbl where id=1;
Run Code Online (Sandbox Code Playgroud)

它以毫秒为单位执行。

然后我就这样做了。

CREATE TEMPORARY TABLE DELETE_ID (ID int);
Insert into DELETE_ID select id from (subery1(subquery2(subquery3)));
Run Code Online (Sandbox Code Playgroud)

DELETE_ID 大约有 150 个 ID。

Delete from tbl where id in (select id from DELETE_ID);
Run Code Online (Sandbox Code Playgroud)

花费了 30 多分钟,但删除了一行。

没有锁或死锁。

在 innodb_trx 中,状态有时是fetching rows有时unlocking rows

谁能帮助我理解为什么会发生这种情况?

mysql innodb delete

5
推荐指数
1
解决办法
3164
查看次数

Mysql中Text和Varchar的性能差异

我正在 mysql 5.7 中试验 text 和 varchars。我创建了一个简单的 mysql 表,如下所示

创建表small_table(
   pkint(11) NOT NULL AUTO_INCRMENT,
   varcvarchar(255) DEFAULT NULL,
   txttext,
  首要的关键 (pk)
) 引擎=InnoDB AUTO_INCRMENT=103925 默认字符集=utf8

该表大约有 100k 行。

我已经执行了以下查询并对两者进行了分析

查询 1(对 varchar 列进行分组)

通过varc从small_table组中选择varc,count(*);

配置文件 1 结果

+----------------------+----------+
| 状态 | 持续时间 |
+----------------------+----------+
| 开始| 0.000064 | 0.000064
| 检查权限 | 0.000004 |
| 开桌 | 0.004812 |
| 初始化| 0.000026 | 0.000026
| 系统锁| 0.000005 | 0.000005
| 优化| 0.000006 | 0.000006 …

performance varchar temporary-tables mysql-5.7

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

SQL Server 2016 到期日期

我有一个关于 SQL Server 2016 安装的问题。

我们安装了 2017/09/19 制作的试用版

根据我在数据库中执行的脚本,到期日期是 2018/03/18 但我们仍然可以毫无问题地使用它。

使用此数据库的 Sharepoint 站点不会给出任何错误或警告图例,说明它已过期或某些功能不再可用。我还可以从 MSQLServer Management Studio 进入并执行脚本、创建新数据库等。

怎样才能准确知道保质期?

SELECT
@@SERVERNAME as SERVERNAME,
CREATE_DATE as INSTALALTIONDATE,
SERVERPROPERTY('EDITION') as Version,
DATEADD(DD, 180, CREATE_DATE) AS "EXPIRY DATE"
FROM SYS.SERVER_PRINCIPALS
WHERE SID = 0X010100000000000512000000

SERVERNAME      INSTALLATIONDATE        Version                                 EXPIRY DATE
SAHARCVSPS02    2017-09-19 13:15:20.967 Enterprise Evaluation Edition (64-bit)  2018-03-18 13:15:20.967
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016

4
推荐指数
2
解决办法
2万
查看次数

一次更新多个值

我的任务是更新数据库中的几行。有两列,其中一列是ID,另一列是CURRENCY。我已经使用下面的更新语句更新了这些行:

update account set currency = 'INR' where id =15;
update account set currency = 'EURO' where id =12;
update account set currency = 'DOLLAR' where id =18;
update account set currency = 'Pound' where id =13; 
-- and so on.
Run Code Online (Sandbox Code Playgroud)

实际上,在这种情况下,由于行数相对较少,我可以使用这些更新语句轻松完成,但是如果有数千或数十万行怎么办?这是更新它们的唯一方法,还是有其他方法或脚本?

postgresql update

3
推荐指数
1
解决办法
5393
查看次数

ISNULL() OR 在 UPDATE 语句中为 NULL

我必须UPDATE在具有 50 万条记录的实时在线数据库上运行一条语句。我想知道哪个语句运行得更快:

Update Table set REC_ID = isnull(REC_ID,'')

Update Table set REC_ID = '' where REC_ID is null
Run Code Online (Sandbox Code Playgroud)

我正在使用 Microsoft SQL Server 2012

null sql-server sql-server-2012 update

1
推荐指数
1
解决办法
5万
查看次数

MySQL 使用我拥有的所有 20 个内核

我目前正在建立一个使用 MySQL 数据库的网站,该数据库拥有超过 4000 万行数据。我使用一台服务器存储文件和单独的 mysql 服务器。两台服务器有20核,64G内存。

同时,我可以看到在执行最长的 SQL 查询时,我的 MySQL 服务器最多使用两个内核,因此执行最长的查询需要超过 38 秒。看看下面的结果。

用户@主机:dev_data @ localhost []

查询时间:38.113460 锁定时间:0.000514

Rows_sent: 10 Rows_examined: 48683733

如何配置我的 MySQL 服务器,以便它使用所有 20 个内核来处理查询?MySQL 版本是 5.6。

在下面的结果之上。

在此处输入图片说明

mysql optimization

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

频繁运行AUTO VACUUM对PostgreSQL数据库有影响吗?

我有10-15个大表,5GB到30GB。其余的都小于1GB。有些表数据很大,每天会产生 500 000 个死元组。大约 7 天后,当死亡元组超过 350 万个时,自动清理就会开始。该数据库大约有 60 个表。这里数据库的阈值是:20%。

我想将 autovacuum 阈值从 20% 更改为 1%。对系统性能有什么影响(因为对于较小的表,它会频繁运行)。maintanance_work_mem 和 work_mem 参数值应该是什么?

postgresql postgresql-performance postgresql-13

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

什么是大于/小于 TSQL 的倍数?

我在www.codemag.com/article/1208111 上阅读了一篇文章,并在 WHERE 子句中看到了将列与

Column1 <<<>> Column2
Run Code Online (Sandbox Code Playgroud)

Column1 <<<= Column2
Run Code Online (Sandbox Code Playgroud)

在清单 13 和清单 14 中的文章

那些是什么意思?

sql-server t-sql

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