小编IT *_*her的帖子

数据库碎片整理和自动增长设置

我们确实为 SQL Server 2008 r2 express 制定了一些维护计划。如果任何表的页数超过 50 并且平均碎片超过 20,我们每个月都会对数据库进行碎片整理。

如果数据库日志大小>2MB,则恢复模式为简单,收缩,恢复模式重新设置为FULL。如果 Page_count>50 且 avg_fragmentation_in_percent > 30,则索引为 REBUILD。

如果 Page_count>50 且 avg_fragmentation_in_percent > 5 且 <30,则索引为 REORGANIZE。

这就是我们目前正在做的事情。但是我们发现自增长事件是资源密集型的,不应重复发生。现在,对于所有数据库,mdf 文件的自动增长设置为 MB,ldf 文件设置为 10%,这是创建新数据库时的默认值。我们计划根据每天变大的数据库数量来增加数据库的自动增长值。但是我想知道有多少自动增长事件对数据库来说是理想的。我应该设置自动增长以便它每天、每周或每月等只发生一次吗?所以请帮助我为我的数据库设置自动增长值。还有另一个问题,如果我每月对数据库进行碎片整理,那么它就会缩小。因此,在此之后,对于所有我确实收缩过的数据库,在写入新数据时都会发生一次自动增长。所以会有很多自动增长事件。那么会不会有问题呢?请告诉我一个解决方案。

sql-server maintenance shrink sql-server-2008-r2

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

只有 db_datareader 的数据库显示索引的无效属性

如果SQL Server数据库的用户只有public在同意server roles且仅用于特定的数据库db_datareader,并public随后试图允许script index as CREATE To在SSMS选项,生成的脚本不正确。

我的意思是,如果索引具有过滤条件,则不会显示该过滤条件

所以对于拥有所有者权限的用户script index as CREATE To将显示

USE [test]
GO

/****** Object:  Index [filtered]    Script Date: 12/30/2013 18:54:19 ******/
CREATE NONCLUSTERED INDEX [filtered] ON [dbo].[Table_1] 
(
    [b] ASC
)
WHERE ([Table_1].[b] IS NULL)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

对于只有 …

index sql-server ssms sql-server-2008-r2

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

执行计划百分比加起来不是 100%

我指的是 SQL Server 查询执行计划来获取查询成本,然后通过查看计划来优化所需的东西。

但单个查询成本的总和超过 100%。

这是我的查询:

DECLARE @date SMALLDATETIME

SELECT Reffd AS NAME
    ,(
        SELECT (
                (
                    SELECT count(*)
                    FROM [cal_reg].[dbo].[customer]
                    WHERE upper(Reffd) = upper(main.reffd)
                        AND cast(DATE AS SMALLDATETIME) = @date
                    ) + (
                    SELECT count(*)
                    FROM [cal_reg].[dbo].[rep]
                    WHERE upper(Reffd) = upper(main.Reffd)
                        AND cast(DATE AS SMALLDATETIME) = @date
                    )
                )
        ) AS Completed
    ,(
        SELECT (
                (
                    SELECT count(*)
                    FROM [cal_reg].[dbo].[customer]
                    WHERE upper([call Attnd]) = upper(main.[Reffd])
                        AND cast(DATE AS SMALLDATETIME) = @date
                    ) + (
                    SELECT count(*)
                    FROM [cal_reg].[dbo].[rep] …
Run Code Online (Sandbox Code Playgroud)

sql-server ssms execution-plan sql-server-2008-r2

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

从局域网访问 SQL Server Express LocalDB

我正在开发一个需要 sql server 的软件。但是对于 50 MB 的应用程序,告诉客户安装 SQL Server 并不是一个好主意。所以我认为最好使用 SQL Server Express LocalDB。

我想提供从局域网访问我的应用程序的功能。但我没有得到任何相关的主题来做到这一点。

是否可以在局域网上访问 SQL Server Express LocalDB?

与 SQL Server 相比,SQL Server Express LocalDB 有哪些限制?

sql-server sql-server-localdb

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

优化/加速查询

下面的查询用于插入和更新 SQL Server 数据库中的表。第一次在 SSMS 中执行时,XQuery 很慢。

询问

插入新的 <ROW>

Update BalanceTable  set [daily_balance].modify('
  insert <Row><date>2007-05-10</date><Balance>-8528</Balance><Transactiondr>835</Transactiondr><Transactioncr>9363</Transactioncr><Rowid>2</Rowid></Row>  
  as first into (/Root)[1]') 
where [daily_balance].exist('/Root/Row[date=''2007-05-10''] ')=0 
and [daily_balance].exist('/Root')=1 
and  [AccountID]=61 
and [Date] = '31-May-2007';
Run Code Online (Sandbox Code Playgroud)

修改余额

Update BalanceTable 
set   [daily_balance].modify('
  replace value of (/Root/Row[date=''2007-05-10'']/Balance/text())[1] 
  with (/Root/Row[date=''2007-05-10'']/ Balance)[1] -3510')   
where [AccountID]=577 
and [Date]='31-May-2007'  
and [daily_balance].exist('/Root/Row[date=''2007-05-10'']')=1;
Run Code Online (Sandbox Code Playgroud)

修改事务

Update BalanceTable 
set   [daily_balance].modify('
  replace value of (/Root/Row[date=''2007-05-10'']/Transactioncr/text())[1] 
  with (/Root/Row[date=''2007-05-10'']/ Transactioncr)[1] +3510')   
where [AccountID]=577 
and [Date]='31-May-2007'  
and  [daily_balance].exist('/Root/Row[date=''2007-05-10'']')=1;
Run Code Online (Sandbox Code Playgroud)

表模式

USE [Fitness Te WM16]                       
GO                                                              
SET ANSI_NULLS ON                       
GO                                              
SET …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 xquery query-performance

6
推荐指数
2
解决办法
226
查看次数

在 SSMS 中附加数据库会出错

我正在使用 SSMS 和具有足够权限的用户访问 SQL Server。

当该用户尝试使用 SSMS 附加数据库时(通过右键单击数据库节点,然后单击附加),他们会收到一条错误消息:

无法显示请求的对话框。

参数名称:nColIndex

实际值为 -1。(Microsoft.SqlServer.GridControl)

  在 Microsoft.SqlServer.Management.UI.Grid.GridControl.SetColumnWidthInternal
(Int32 nColIndex, GridColumnWidthType widthType, Int32 nWidth)
...
  在 Microsoft.SqlServer.Management.SqlManagerUI.AttachDatabase.SetGridColumnWidth
(SqlManagerUIDlgGrid grid, Double[] columnWidthRatio, Int32 columnIndex)
...

如果同一个用户使用如下的 T-SQL 命令,那么它工作正常:

CREATE DATABASE [hgnx] ON 
( FILENAME = N'E:\db\hgnx.mdf' ),
( FILENAME = N'E:\db\hgnx_log.ldf' )
FOR ATTACH
Run Code Online (Sandbox Code Playgroud)

sql-server permissions ssms sql-server-2008-r2

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

导入数据将 NULL 替换为 0

我正在使用 sql server 2008 r2 express。当我使用导入数据功能将数据从一个数据库导入到另一个数据库时,我遇到了一些问题。我正在使用 SSMS 来做到这一点。在使用向导时,我选择“选择身份插入”选项来复制身份元素属性。通过使用此标识元素可以正确导入。但是导入后我比较了源数据库和目标数据库,发现了一些变化!!表中的所有 NULL 值都被 0 替换。那么我该如何避免它。在使用导入数据向导时,是否有任何选项可以将其复制为它?请帮忙

sql-server ssms sql-server-2008-r2 import

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

锁定“读提交的快照”

如果在具有“读取已提交快照”隔离级别的表上运行更新并且提交未决

例如:

  1. update table1 set col1 = col1 + 1 where PKcol < 3
  2. update table1 set col1 = col1 + 1 where PKcol = 3
  3. update table1 set col1 = col1 + 1 where NonPKcol < 3
  4. update table1 set col1 = col1 + 1 where NonPKcol = 3
  5. update table1 set col1 = col1 + 1 where PKcol < 3 and NonPKcol = 5

在上述情况下,PKcol 是表中的主键,而 NonPKcol 是非主键。

是否只为满足“where”条件的行锁定更新?它是基于值、索引还是主列?

sql-server transaction locking snapshot-isolation

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

仅将数据库收缩到创建数据库后设置的初始大小

在 SQL Server 中,每个数据库都有一个属性Initial Size (MB),可以在 SSMS 的数据库属性中看到。默认情况下,mdf 文件为 3 MB,ldf 文件为 1 MB。

所以现在如果创建一个新数据库,那么它将被设置为默认大小(即 mdf 为 3 MB,ldf 文件为 1 MB)。但是在创建数据库后,我将初始大小更改为其他一些值,例如 For mdf 10 MB 和 ldf 5 MB。(实时某些数据库管理员可能希望在创建数据库后更改初始大小)

但是现在如果缩小数据库,它将缩小到我在创建后设置的初始大小之外(考虑数据库中没有数据,否则它将缩小到其实际内容大小)。它会缩小到创建数据库时的初始大小(即 mdf 为 3mb,ldf 为 1mb)。我希望缩小到我设置的初始大小(即 mdf 为 10 mb,ldf 为 5mb)。可以做到吗?如果可能,那么如何?

在一些文章中,我看到 dbcc SHRINKFILE 可用于缩小超过初始大小,而 dbcc SHRINKDATABASE 不能缩小超过初始大小。但我只想缩小到我设置的初始大小。

注意:我知道收缩不好,不应该做。但我想知道怎么做?如果sql server只考虑创建数据库时设置的初始大小,那么创建数据库后设置初始大小有什么用?

编辑:

来自微软收缩相关文章:使用 DBCC SHRINKDATABASE 您不能将数据库收缩到其初始大小以下。

我的问题是我可以更改现有数据库本身的初始大小吗?

编辑:

我有大约 5 个 sql server 实例。创建的所有数据库的数据默认大小为 3 mb,日志大小为 1 mb(大约 3 年前)。现在所有的数据库都在 100-1000 mb 的范围内。我不会正常收缩数据库,因为这不是一个好习惯。但是一些数据库增长超过 10 GB(mdf 文件本身,因为我在其中插入了如此多的数据)。因此,当数据库很大时,我会将不重要的旧内容从该数据库转移到另一台服务器,因为该服务器不需要我。这样数据库大小从 10 GB …

sql-server maintenance shrink sql-server-2008-r2

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

自动增长、收缩和数据库性能

我已经问过一些关于自动增长和收缩的问题。但我对此有一些疑问。

  1. 我有一个每月增长约 300 MB 的数据库。那么最好将 Autogrowth 设置为 300 MB 吗?现在设置了 10 MB。

  2. 我有很多小型数据库,它们确实有大约 50 MB 的数据。但它的物理大小约为 900 MB。(所以 850 是可用空间)。我没有缩小这个数据库。好像我在添加数据时再次缩小它会发生自动增长。但是向这个数据库添加数据是很少见的。所以我认为未来一年它不会增长超过 200MB。

    那么我应该缩小数据库吗?如果我保持原样?这会导致任何性能问题吗?或者在数据库中有更多的可用空间(超过 90%)会导致任何问题?我认为大多数人认为大的物理尺寸会导致性能问题。那么这是真的还是假的?

  3. SQL Server 2008 R2 Express 数据库大小限制为 10 GB。那么它是 mdf 和 ldf 文件的物理大小吗?因为如果我应该在任何时候缩小数据库,我需要考虑这一点。

sql-server shrink sql-server-2008-r2

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