标签: sql-server

在子查询中使用 DISTINCT 作为提示有用吗?

DISTINCT在下面的例子中添加对查询运行时间有什么影响吗?
有时将其用作提示是否明智?

SELECT *
FROM   A
WHERE  A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B) 
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

如何在 Sql Server 中存储“n”天的 Web 服务器日志?

为了更快的报告和性能分析,我们希望将我们的 Web 服务器日志插入到 Sql Server 中。这将使我们能够近乎实时地查看流量模式、问题和减速情况。

我们有一个守护进程,它监听来自负载均衡器的请求/响应事件并批量插入数据库。

但是,我们每天会获得大约 1 GB 的日志,而且我们只需要保留大约一周的时间(至少以这种原始形式)。

存储这些数据的最佳方法是什么,删除旧条目的最佳方法是什么?

我们已经讨论过将每天的数据存储在它自己的表中,例如,Log_2011_04_07将拥有当天的所有条目,然后删除最旧的表。可以创建一个视图来跨越所有日表,以便于查询。可行吗?

sql-server-2008 sql-server logs web-server

18
推荐指数
2
解决办法
1297
查看次数

依赖 mdf 和 ldf 文件的卷影备份是否安全?

我们正在考虑用基于 VSS 的 mdf 和 ldf 文件备份替换传统的 SQL 服务器备份。作为一名 db 人员,我对此感到有些不安,但我找不到任何证据表明这行不通?

任何人都可以建议我可以设置的试验来证明我们可以在哪些地方丢失使用此策略的交易?[在长时间运行的事务期间拔掉电源线是可以的]。

我们正在查看的系统创建 mdf 和 ldf 文件的初始快照,然后跨更改复制。我无法想象这会让我们失望的场景。

希望您能帮助我说服我的老板我们需要保留传统备份!

sql-server

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

将表格导出到文本文件的最快方法是什么

我将拥有一个 SQL Server 2012 数据库和一个包含 300 万行和 50 列的表。无人值守后台 .net 进程(可能发出一些 SQL 或 Powershell 命令)将其导出到文本文件的最快方法是什么,每行数据一行?.net 进程应该知道导出何时完成或是否有任何错误。数据类型将为 allintnvarchar

我假设纯 C# 代码使用 ado.net 执行select *命令并循环遍历数据读取器并为每个记录写入文件会很慢,我无法并行化它。

理想情况下,将导出到远程共享网络文件夹,而不是 SQL Server 计算机上的本地文件夹。SQL Server 将是一个 HA 群集。SSIS 是否更适合于此,不需要数据转换?

.Net 进程将在机器 A 上运行,在机器 B 上运行 SQL Server,最终文件目的地是网络共享。一种选择是 SQL 服务器将文件直接写入网络共享。另一个选项是 SQL Server 写入机器 A,然后在写入文件时,.net 进程将其复制到网络共享。我没有正式的 SLA,但预计文件写入需要 30 分钟 - 1 小时。

sql-server export sql-server-2012

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

使用 GUID 作为主键修复数据库设计的最佳解决方案

我对这个想法进行了一些确认,以修复性能不佳的数据库或更好的建议(如果有人有的话)。始终对更好的建议持开放态度。

我有一个非常大的数据库(20 多万条记录,每天增长约 1/2 百万),它使用 GUID 作为 PK。

我的疏忽,但 PK 聚集在 SQL 服务器上并导致性能问题。

guid 的原因 - 此数据库与 150 个其他数据库部分同步,因此 PK 需要是唯一的。同步不是由 SQL Server 管理的,而是构建了一个自定义过程,使数据保持同步以满足系统的要求——所有这些都基于该 GUID。

150 个远程数据库中的每一个都不存储中央 SQL 数据库中存储的完整数据。他们只存储他们实际需要的数据的一个子集,并且需要的数据对他们来说不是唯一的(150 个数据库中有 10 个可能有一些来自其他站点数据库的相同记录,例如 - 他们共享)。此外 - 数据实际上是在远程站点生成的 - 而不是在中心点 - 因此需要 GUID。

中央数据库不仅用于保持所有内容同步,而且将针对这个非常大的碎片数据库执行来自 3000 多个用户的查询。这在初始测试中已经是一个大问题。

幸运的是,我们还没有上线 - 所以我可以进行更改并在需要时将事情脱机,这至少是一些事情。

远程数据库的性能不是问题 - 数据子集非常小,数据库的总大小通常不会超过 1GB。记录会定期反馈到主系统,并在不再需要时从较小的 BD 中删除。

作为所有记录的管理员的中央数据库的性能是可悲的 - 由于聚集的 GUID 作为许多记录的主键。索引碎片不在图表之列。

所以 - 我解决性能问题的想法是创建一个新列 - Unsigned BIGINT IDENTITY(1,1) 然后更改表 BIGINT 列的 Clustered PK。

我会在作为主键的 GUID 字段上创建一个唯一的非聚集索引。

较小的远程 150 数据库不需要知道中央 SQL Server 数据库上的新 PK …

sql-server primary-key

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

更改表时“无法创建大小为 8074 的行,该行大于允许的最大行大小 8060”

我正在尝试更改表中的列。现有的表是这样的:

CREATE TABLE [dbo].[table](
   [id1] [int] NOT NULL,
   [id2] [int] NOT NULL,
   [id3] [int] NOT NULL,
   [name] [nvarchar](255) NOT NULL,
   [id4] [int] NOT NULL,
   [xmlData] [xml](CONTENT [dbo].[xml_schema]) NULL,
   [booleanData1] [bit] NOT NULL,
   [notes] [varchar](4096) NULL,
   [id5] [int] NULL,
   [booleanData2] [bit] NULL,
   [id6] [int] NULL,

   CONSTRAINT [PK_table] PRIMARY KEY CLUSTERED 
   ([id1] ASC, [id2] ASC, [id3] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

现在我试图在这个表上执行这个 sql:

ALTER TABLE [table] ALTER COLUMN [xmlData] XML
Run Code Online (Sandbox Code Playgroud)

这样我就可以删除 xml 模式并用新的模式替换它。

但我收到此错误:

无法创建大于允许的最大行大小 8060 的大小为 8074 的行。

谁能告诉我这里有什么问题?

sql-server sql-server-2012

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

内存优化表 - 它们真的很难维护吗?

我正在研究从 MS SQL 2012 升级到 2014 的好处。SQL 2014 的一大卖点是内存优化表,这显然使查询速度超快。

我发现内存优化表有一些限制,例如:

  • 没有(max)大小的字段
  • 每行最大 ~1KB
  • timestamp字段
  • 没有计算列
  • 没有UNIQUE限制

这些都属于麻烦事,但如果我真的想解决这些问题以获得性能优势,我可以制定计划。

真正的问题是您无法运行ALTER TABLE语句,并且每次向索引列表添加字段时都必须经历这些繁琐INCLUDE的过程。此外,您似乎必须将用户拒之门外,才能对实时数据库上的 MO 表进行任何架构更改。

我觉得这简直太离谱了,以至于我实际上无法相信 Microsoft 会在此功能上投入如此多的开发资金,却让其维护起来如此不切实际。这使我得出结论,我一定是拿错了棍子的一端;我一定误解了内存优化表的某些内容,这让我相信维护它们比实际困难得多。

那么,我误解了什么?你用过MO表吗?是否有某种秘密开关或过程使它们易于使用和维护?

index sql-server alter-table sql-server-2014 memory-optimized-tables

18
推荐指数
2
解决办法
4402
查看次数

EXCEPT 运算符与 NOT IN

EXCEPT运营商已在SQL Server 2005中引入的,但之间有什么区别NOT INEXCEPT

它也这样做吗?我想用一个例子做一个简单的解释。

sql-server-2005 sql-server sql-server-2008-r2 operator except

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

如何衡量或查找创建查询计划的成本?

我有一个典型的例子,参数嗅探导致一个“坏”的执行计划进入计划缓存,导致我的存储过程的后续执行非常缓慢。我可以用局部变量OPTIMIZE FOR ... UNKNOWN、 和来“解决”这个问题OPTION(RECOMPILE)。但是,我也可以深入查询并尝试优化它。

我正在尝试确定我是否应该:鉴于解决问题的时间有限,我想知道这样做的成本。在我看来,如果我坚持使用OPTION(RECOMPILE),净效果是每次运行查询时都会重新创建查询计划。所以,我想我需要知道:

如何找出创建查询计划的成本是多少?

为了回答我自己的问题,我在谷歌上搜索过(例如使用这个查询),并且我已经浏览了dm_exec_query_statsDMV列的文档 。我还检查了 SSMS 中的“实际查询计划”的输出窗口以找到此信息。最后,我搜索了 DBA.SE。这些都没有得到答案。

谁能告诉我?是否可以找到或测量创建计划所需的时间?

sql-server execution-plan

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

T-SQL 中奇怪的 JOIN ON 子句

我正在解开一些遗留代码,而且我多年来从未见过这个:

Select * 

FROM GLAccounts
INNER JOIN GLCharts
    ON glaGLChartID = glcGLChartID
LEFT JOIN GLCategories
    ON glcGLCategoryID = gltGLCategoryID
INNER JOIN GLDepartments
    ON glaGLDepartmentID = gldGLDepartmentID
INNER JOIN GLDivisions
    ON glaGLDivisionID = glvGLDivisionID
        ,GLFiscalYearPeriods                --<this comma>
INNER JOIN GLFiscalYears
    ON glfGLFiscalYearID = glzGLFiscalYearID


ORDER BY glcGLCategoryID
    ,glcParentGLChartID
    ,glaGLChartID
Run Code Online (Sandbox Code Playgroud)

连接有效,但我没有在 ON 子句的任何 T-SQL 语法参考中找到逗号的这种用法。

这里发生了什么事?TIA

join sql-server t-sql

18
推荐指数
3
解决办法
1592
查看次数