我们有一个第三方分析平台,允许最终用户从选择的预定义视图中创建自己的表格和图表。这将查询 MS SQL 数据库。
不幸的是,根据我的知识和理解,该软件注入数据库以查询数据的 SQL 语法似乎非常低效,或者看起来如此。
例如,以下是将两个表连接在一起的查询的样子:
SELECT tblOne.ColumnOne, tblOne.ColumnTwo, tblTwo.ColumnThree
FROM (SELECT * FROM tblOne) AS tblOne
JOIN (SELECT * FROM tblTwo) AS tblTwo ON tblOne.id = tblTwo.id
Run Code Online (Sandbox Code Playgroud)
现在想象这些表每个都有很多列,或者有更多连接到附加表,每个表都遵循相同的模式 - 我假设这将在子查询中执行全表扫描,有效地读取比实际需要的更多的数据是否正确?我是否也正确地假设以下内容实际上会更有效?
SELECT tblOne.ColumnOne, tblOne.ColumnTwo, tblTwo.ColumnThree
FROM tblOne
JOIN tblTwo ON tblOne.id = tblTwo.id
Run Code Online (Sandbox Code Playgroud)
在我给这个分析解决方案的开发人员写一封措辞强硬的电子邮件之前,我只是想要第二个意见,以防万一我误解了引擎将如何处理这样的查询。
提前致谢。
我在整个互联网上搜索堆栈溢出,但我找到的每个示例都只有一行,或者根本不起作用。
我有这张桌子:
TBL_RELATORIOS_TAMANHOS
table_catalog
table_name
column_name
data_type
character_maximum_length
numeric_precision
numeric_scale
Run Code Online (Sandbox Code Playgroud)
在它里面我有所有表中的所有列。我只需要找到那些具有不同精度、大小等的列。
使用 row_number 我得到了这个:
;WITH CTE AS
(
SELECT DISTINCT table_name 'Tabela',
column_name 'Coluna',
character_maximum_length as 'Tamanho',
numeric_precision as 'Precisao_Numerica',
numeric_scale 'Escala_Numerica'
FROM TBL_RELATORIO_TAMANHOS
)
SELECT *,
ROW_NUMBER() over ( partition by Tabela,Coluna order by Tabela,Coluna)
FROM CTE
ORDER BY 1,2
Run Code Online (Sandbox Code Playgroud)
有了这个,我可以看到上面有一个的列2,所以这个是重复的(相同的列,不同的大小,精度等)。
| table_Name | Column_name | character_maximum_length | numeric_precision | numeric_scale | Row_number |
|-------------------------|------------------|--------------------------|-------------------|---------------|------------|
| ACOES | ID_BMF | 20 | NULL | NULL | 1 …Run Code Online (Sandbox Code Playgroud) 一周前我制定了一个维护计划,并且每晚都执行得很好。现在数据库收缩任务已停止工作并抛出此错误:
属性大小不可用于数据库“[foo]”。此对象可能不存在此属性,或者可能由于访问权限不足而无法检索。
昨天我安装了几个由 Windows 更新提供的 SQL Server 修补程序(4411 和 4457,如果有的话)。这是我可能做出的唯一改变。
我的任务是这样的:
我的一些发现:
问题是什么?
在我的情况下,我有一个文件file_01.mdf并且file_02.ndf在 1 个文件组下,如果file_01.mdf已经满了(没有启用自动增长),file_01.mdf如果尝试在其中添加数据,它会出错吗?
考虑以下两个查询。
SELECT Col1, Col2
FROM TblA
UNION
SELECT Col1, Col2
FROM TblB
Run Code Online (Sandbox Code Playgroud)
和
SELECT DISTINCT Col1, Col2
FROM TblA
UNION
SELECT DISTINCT Col1, Col2
FROM TblB
Run Code Online (Sandbox Code Playgroud)
这些在逻辑上是等价的。我的问题是数据库引擎是否对它们进行了相同的处理。SQL Server 是否识别冗余并忽略DISTINCT运算符?
我试图确定用户所描述的应用程序性能缓慢。我有一种预感,它可能与应用程序本身有关,而不是 SQL 服务器的问题。我已经检查了许多常见的疑点,以确定常见的瓶颈。
MS SQL 服务器 (11.0.5058) 在 Hyper-V, 2012r2 上运行,并为来宾分配了以下内容:72GB 内存、16 个处理器、4 个带有 tempDB、OS、DB、程序文件的磁盘控制器,它们都在单独的 VHD 上。
在一天中运行 perfmon
% 处理器时间< 40% 最大值
平均磁盘 Q 长度0.003 平均 - 0.41 最大值
% 磁盘时间平均0.0038
平均可用字节数5010
缓冲区高速缓存命中率99.996 平均 98.614 分钟
我没有看到磁盘、内存或处理器有任何问题。我接下来应该看哪里?
我正在处理一个 django 项目,我想将它连接到本地服务器。我下载了 Microsoft Server Management Studio 但不知如何创建服务器和数据库?
如果我没记错的话,对象资源管理器选项卡只允许您连接到现有服务器。那正确吗?如果不是,如何在 SMSS 中创建新服务器和数据库?
此外,我已经从 azure 云导入了一个 .bacpac 文件,并希望在我的本地机器中复制该云数据库,这样我就不会在测试时弄乱云上的实际数据库。(我按照这个链接/sf/ask/383271451/)
那么如何使用 SMSS 在本地计算机上创建服务器/数据库并使用 .bacpac 文件加载它以备份我的 django 站点?
感谢您的帮助
我如何说服我的 DBA 存在 SQL Server 的零星问题?
问题:基本上,主要减速......一些查询,生成执行计划,甚至生成现有数据库对象的脚本有时可能需要永远。即使是应该没有性能问题的操作,比如生成创建表脚本,有时也可能需要很长时间。
情况 - 我有一个 SQL Server 数据库,我可以在其中创建表/视图/等。
该数据库托管在由公司 IT 管理的 SQL Server (MS SQL Server 2016) 上。
我已经让他研究一下,我相信他一直在认真检查日志,他说服务器上的负载有时我注意到大量的性能问题没有显示出任何异常。事实上,他说这都在 5% 以下(非常低)。
我在暂存和开发环境中运行完全相同的代码和查询,在那里很好 - 相对于生产环境,它甚至超快。
老实说,我不知道这可能是什么问题。我不知道从哪里开始。
我在我的数据库中记录了最慢的查询,其中一个让我感到惊讶,在列表中显示了很多次,并且执行通常需要很多秒。
UPDATE books SET last_read='2018-12-31 11:23:45' WHERE book_id='15'
Run Code Online (Sandbox Code Playgroud)
book_id 是 int 身份 PK(集群),last_read 是日期时间。查询是用单引号中的 15 编写的,因此需要转换,但我无法想象这是一个大问题,因为每个查询只进行一次转换。表上有 6 个索引,但列 last_read 未涉及或包含在其中任何一个中。PK 在 book_id 上,没什么特别的。
估计的执行计划告诉我:
UPDATE: 0%
Clustered Index Update (on the PK constraint): 100%
Run Code Online (Sandbox Code Playgroud)
我不希望查询更新任何索引,因为 last_read 没有以任何方式编入索引,并且 book_id 没有更改。
我错过了什么?
我在 MS SQL 中将字符串转换为日期有点困难。希望你能指导我。
这是我的场景:
我的表中有一个名为 ExpDt 的列。它是产品的保质期。格式为 mm/dd。
现在我想知道什么产品会在 5 天前过期。所以我要做一个datediff。但问题是 ExpDt 列不是有效日期。如何将其转换为有效日期?
因此输出将类似于:2018-01-20,这是一个有效日期。不是字符串。
这是我尝试过的。
-- Outputs 2018-01-31
-- select @expDate = cast(datepart(year, getdate()) as nvarchar(5))
-- + '-' + substring(ExpDt, 1, 2)
-- + '-' + substring(ExpDt, 4, 5)
-- from BigEMerchandiser.dbo.tbl_Abis_D
Run Code Online (Sandbox Code Playgroud)
它返回一个字符串,但我无法使用 convert 函数将其转换为日期。我将附上表格的屏幕截图,以便您可以看到 ExpDt 列的数据。希望我清楚地解释了自己。任何帮助将非常感激。谢谢你。
sql-server ×10
performance ×3
ssms ×2
datetime ×1
distinct ×1
filegroups ×1
optimization ×1
t-sql ×1
union ×1