Questions tagged «sql-server-2008»

SQL Server 2008(主要版本10.00.xxxx)。请同时用sql-server标记。

4
在索引中包含列的硬性和快速性规则
是否有任何硬性规定来决定应将哪些列以及应以什么顺序放入非聚集索引中。我只是在阅读这篇文章https://stackoverflow.com/questions/1307990/why-use-the-include-clause-when-creating-an-index ,我发现对于以下查询: SELECT EmployeeID, DepartmentID, LastName FROM Employee WHERE DepartmentID = 5 张贴者建议制作这样的索引: CREATE NONCLUSTERED INDEX NC_EmpDep ON Employee(EmployeeID, DepartmentID) INCLUDE (Lastname) 这是我的问题,为什么我们不能像这样做索引 CREATE NONCLUSTERED INDEX NC_EmpDep ON Employee( EmployeeID, DepartmentID, LastName) 要么 CREATE NONCLUSTERED INDEX NC_EmpDep ON Employee( EmployeeID, LastName) INCLUDE (DepartmentID) 什么原因导致发布者决定保留“姓氏”列。为什么不另列?以及如何决定应以什么顺序将列保留在那里?

2
SQL Server不可预测的选择结果(dbms错误?)
下面是一个简单的示例,它返回的结果很奇怪,这些结果是无法预测的,我们无法在团队中进行解释。我们是在做错什么还是SQL Server错误? 经过一番调查,我们将搜索范围缩小为子查询中的union子句,该子查询从“ men”表中选择一条记录 它可以在SQL Server 2000中正常工作(返回12行),但是在2008年和2012年,它仅返回一行。 create table dual (dummy int) insert into dual values (0) create table men ( man_id int, wife_id int ) -- there are 12 men, 6 married insert into men values (1, 1) insert into men values (2, 2) insert into men values (3, …

8
将选择结果写入CSV文件
我们需要将SELECT查询结果写入一个csv文件。如何在SQL Server 2008 r2中使用T-SQL完成?我知道可以在SSIS中完成,但是由于某些原因,我们没有此选项。 我尝试在下面的文章中使用建议的proc,但是当我运行proc时,SQL抱怨无法运行在此proc中调用的sys.sp_OACreate和sys.sp_OADestroy。 您知道我们如何打开这些组件,或者知道使用T-SQL写入文件的更好方法吗? 提前致谢。

6
可能的最小备份…使用SQL Server
每天,我们都会通过WAN运送SQL Server备份。我们需要最小化这些备份的大小,以免花费很长时间。 我们不介意我们的备份过程是否花费更长的时间。就目前而言,我们需要在WAN上移动30gig压缩备份,这需要10多个小时。 我们必须有2种选择来获得较小的每日备份。 日志传送,这意味着我们将不得不重组灾难恢复流程。 将信息剥离到db之外并在另一端重建(删除非聚集索引,将聚集索引打包为100%-在另一端重建) 两者都将涉及我们的大量工作。我们使用的是SQL Server 2008 pro,所有备份均已压缩。 是否有任何商用产品可以为我们提供与选项(2)类似的备份大小? 是否有完善的脚本可以让我们完成(2)?(处理索引视图,过滤索引,外键等)


5
当以前快速的SQL查询开始运行缓慢时,如何查找问题的根源?
背景 我有一个针对SQL Server 2008 R2的查询,该查询联接和/或左联接约12个不同的“表”。该数据库相当大,有许多表超过5000万行和大约300个不同的表。适用于在全国设有10个仓库的大型公司。所有仓库都读取和写入数据库。所以它很大而且很忙。 我遇到的查询看起来像这样: select t1.something, t2.something, etc. from Table1 t1 inner join Table2 t2 on t1.id = t2.t1id left outer join (select * from table 3) t3 on t3.t1id = t1.t1id [etc]... where t1.something = 123 请注意,联接之一是在不相关的子查询上。 问题是从今天早上开始,在没有对系统进行任何更改(我或我的团队中的任何人都知道)的情况下,该查询通常需要运行2分钟左右,而开始需要花一个半小时才能运行-跑了。数据库的其余部分运行正常。我已经从通常运行该程序的过程中取出了此查询,并以相同的慢度在带有硬编码参数变量的SSMS中运行了该查询。 奇怪的是,当我使用不相关的子查询并将其放入临时表中,然后使用该子查询代替子查询时,查询运行良好。另外(这对我来说是最奇怪的),如果我将这段代码添加到查询的末尾,则查询运行良好: and t.name like '%' 我从这些小实验得出的结论(可能是错误的)是,放慢速度的原因是由于如何设置SQL的缓存执行计划-当查询略有不同时,它必须创建一个新的执行计划。 我的问题是这样的:当以前运行快速的查询突然在深夜开始运行,并且除此查询外没有其他影响,我该如何解决它以及如何避免将来发生?我怎么知道SQL在内部做的事情使其变得如此缓慢(如果运行了错误的查询,我可以得到它的执行计划,但它不会运行-也许预期的执行计划会给我一些东西?)?如果此问题与执行计划有关,那么如何避免SQL认为真正糟糕的执行计划是个好主意? 同样,这也不是参数嗅探的问题。我以前见过这种情况,不是这样,因为即使我在SSMS中对变量进行硬编码,性能仍然很慢。

5
为什么仍然有varchar数据类型?
我的许多数据库都有定义为varchars的字段。这一直没有大的问题,因为我生活和工作在美国(其中存在的唯一语言是“美国”。啊哈) 在使用数据库大约5年之后,我发现我最终遇到了varchar字段性质有限的问题,必须修改字段以将数据存储为nvarchars。在不得不对表进行另一次更新,将varchar字段转换为nvarchar之后,我有了一个想法-为什么我们仍然这样做呢?我很早就做出了将所有新的文本字段都定义为nvarchar而不是varchar的明智决定,这是我10年前上学时从教科书中学到的内容。 是2011年,去年有一个新版本的SQL Server。当可以/应该使用nvarchar时,为什么为什么继续支持varchar数据类型? 我知道,经常有人争辩说nvarchars是varchars的“两倍大”,因此存储空间的使用可能是维护varcars的观点之一。 但是,今天的用户如果想节省存储空间,则可以定义其nvarchars将数据存储为UTF-8而不是默认的UTF-16。如果主要需要的话,这将允许8位编码,同时确保插入到其DB中的2-8字节罕见字符不会破坏任何内容。 我想念什么吗?在过去的15到20年中,这种情况没有发生变化,这是否有充分的理由?

4
表格定义中的列顺序重要吗?
定义表时,按目的对逻辑组中的列和组本身进行排序很有帮助。表中列的逻辑顺序将含义传达给开发人员,并且是一个良好样式的元素。 很清楚 但是,尚不清楚的是,表中列的逻辑顺序是否会对存储层的物理顺序有任何影响,或者是否有其他可能影响的影响。 除了对样式的影响之外,列顺序是否重要? 关于堆栈溢出有一个与此有关的问题,但是它缺乏权威性的答案。

1
我应该使用许多单字段索引而不是特定的多列索引吗?
这个问题是关于SQL Server索引技术的有效性的。我认为它被称为“索引交集”。 我正在使用一个存在许多性能和稳定性问题的现有SQL Server(2008)应用程序。开发人员对索引做了一些奇怪的事情。我无法获得有关这些问题的最终基准,也无法在互联网上找到任何非常好的文档。 表格上有许多可搜索的列。开发人员在可搜索列的每个EACH上创建了一个列索引。从理论上讲,SQL Server在大多数情况下将能够组合(相交)这些索引中的每一个以有效地访问表。这是一个简化的示例(实际表具有更多字段): CREATE TABLE [dbo].[FatTable]( [id] [bigint] IDENTITY(1,1) NOT NULL, [col1] [nchar](12) NOT NULL, [col2] [int] NOT NULL, [col3] [varchar](2000) NOT NULL, ... CREATE NONCLUSTERED INDEX [IndexCol1] ON [dbo].[FatTable] ( [col1] ASC ) CREATE NONCLUSTERED INDEX [IndexCol2] ON [dbo].[FatTable] ( [col2] ASC ) select * from …


5
如何在SQL Server中正确处理TimeZone?
我的本地开发服务器在中东,但我的生产服务器在英国。 我需要向用户显示其所在时区的日期。例如,如果用户在沙特阿拉伯,那么我需要根据沙特阿拉伯格式显示时间。 是否应该创建一个名为TimeZone的新数据库表并将时间保存在UTC中?

2
ISO周vs SQL Server周
好的,所以我有一个报告进行了本周与上周的比较,我们的客户注意到他们的数据“很笨拙”。经过进一步调查,我们发现按照ISO标准,它不能正确运行数周。我将此脚本作为测试用例运行。 SET DATEFIRST 1 SELECT DATEPART(WEEK, '3/26/13') , DATEPART(WEEK, '3/27/12') , DATEPART(WEEK, '3/20/12') , DATEPART(WEEK, '1/2/12') SELECT DATEPART(ISO_WEEK, '3/26/13') , DATEPART(ISO_WEEK, '3/27/12') , DATEPART(ISO_WEEK, '3/20/12') , DATEPART(ISO_WEEK, '1/2/12') 运行时,我得到了这些结果。 我认为这很特殊,因此我做了一些进一步的挖掘,发现SQL Server将1月1日视为一年的第一周,而ISO将1月的第一个星期日视为一年的第一周。 然后问题最终变成了两个方面。问题1这是为什么?问题2有什么方法可以更改此设置,因此我不必修改所有代码即可ISO_Week在任何地方使用?



5
逻辑运算符OR AND,条件和条件在WHERE中
让我们检查以下两个语句: IF (CONDITION 1) OR (CONDITION 2) ... IF (CONDITION 3) AND (CONDITION 4) ... 如果CONDITION 1是TRUE,将CONDITION 2被检查吗? 如果CONDITION 3是FALSE,将CONDITION 4被检查吗? 关于以下条件WHERE:SQL Server引擎会优化WHERE子句中的所有条件吗?程序员是否应该以正确的顺序放置条件,以确保SQL Server优化程序以正确的方式解决该问题? 添加: 感谢Jack的链接,这让T-SQL代码感到惊讶: IF 1/0 = 1 OR 1 = 1 SELECT 'True' AS result ELSE SELECT 'False' AS result IF 1/0 = 1 AND 1 = …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.