小编Aar*_*and的帖子

INNER JOIN 使 COUNT(*) 变慢

我有一个非常简单的查询:

SELECT COUNT(*)
FROM messages
INNER JOIN users ON messages.user_id = users.user_id
Run Code Online (Sandbox Code Playgroud)

加入需要 1146 毫秒,没有加入需要 220 毫秒(220 毫秒对我来说仍然很慢)。在包含 1,000,000+ 行的消息表上进行测试。

我在两个表 ( message_idand user_id)上都设置了主键,并设置了连接messages.user_idand的外键users.user_id

此查询的原因是为分页系统提供记录总数。

我还能做些什么来加速查询?

performance sql-server-2008 join foreign-key sql-server

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

架构更改后 SQL Server 表保持大

我在 SQL Server 2012 中有一个包含 460.000 行的表。

该表具有以下架构:

架构:

我们的应用程序有问题,所以所有 500.000 行都是Comments用空格填充的。

这导致表大小约为 3.7GB:

在此处输入图片说明

在此之后,我执行以下操作来修复结尾空格,但数据库保持在 3.7GB。

update voucher set comments = ltrim(rtrim(comments))
Run Code Online (Sandbox Code Playgroud)

一个快速计算显示,一个完全填充的行大约有 280 个字节的原始数据,一个空行(所有 varchars 为空)有 32 个字节。

这意味着对于 460.000 行,我的表应该在 32MB-122MB 之间。

为什么表是3.7GB?我怎样才能收回空间?

sql-server database-size size

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

AlwaysOn 架构 - 用于创建开发环境的 SQL Server 2012?

我在想,除了使用相同的架构设置 HADR 之外,是否可以以某种方式利用 SQL Server 2012 中的 AlwaysOn 架构为 DEV 和 QA 环境正确创建副本?

sql-server architecture sql-server-2012 high-availability availability-groups

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

数据库和日志文件的自动增长

我很困惑这个自动增长属性对 SQL Server 中的任何数据库或日志文件的作用。

根据我的理解:

  1. 如果我们将数据库的 autgrowth 设置为受限,那么它的大小将随着数据的增加而增加到此限制,并且在停止增加其大小后将导致数据库故障。
  2. 如果我们将数据库的 autgrowth 设置为不受限制,那么它将一直增长到磁盘空间已满。
  3. 如果我们将日志文件的 autgrowth 设置为受限,那么日志大小将增加到指定的限制,然后它将开始丢弃旧日志,新日志将存在于日志中。
  4. 如果我们将日志文件的 autgrowth 设置为不受限制,那么它将一直增长,直到磁盘空间已满。

请帮助我知道这个假设是否正确,如果是错误的,请纠正我。

sql-server

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

索引重建/重组频率

我是一个偶然的 dba。我正在做索引重建/重组。一旦我适应了这些任务,我很想使用一些脚本。我确实浏览了一些有关此主题的论坛页面。我有一个 sql server 2008R2 实例,它有大约 25 个不同大小和需求的数据库。我被指派为 8 个数据库进行索引调整。由于大小和碎片级别以及索引的数量以及碎片整理发生的速度因数据库而异,我知道有些数据库需要每月进行一次索引维护,而其他一些则需要每周进行一次索引维护。我有两个问题:

我应该多久安排一次重建/重组过程? 例如:上个月我为高于 30% 的片段级别重建了索引,并为 5-30% 的片段级别重新组织和更新了统计信息。然后我一周后检查,我发现一两个碎片索引,一个月后我检查它,我发现大约10个碎片索引..是不是再次安排索引维护的合适时间?

如果我为实例开发一个通用脚本,我应该如何使它适用于实例上的所有数据库,因为不是每个数据库都需要同时进行索引维护。

index sql-server maintenance sql-server-2008-r2 fragmentation

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

AVG 函数返回错误的平均值

我有一个带有 REAL 类型列的简单表。

表中有 2 行,值分别为 0.23 和 0.24。如果我运行以下命令:

SELECT AVG(MyColumn) FROM dbo.MyTable
Run Code Online (Sandbox Code Playgroud)

我希望得到 0.235 的结果,但实际上我得到 0.2349999901234。

有人可以告诉我为什么吗?

sql-server-2008 functions

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

无效的对象名称 'sys.dm_os_volume_stats'

我正在尝试选择服务器中 15% 的可用磁盘空间。

 SELECT DISTINCT
            s.volume_mount_point [Drive],
            CAST(s.available_bytes / 1048576.0 as decimal(20,2)) [AvailableMBs],
           ((CAST(s.total_bytes / 1048576.0 as decimal(20,2)))*15)/100 AS [FifteenpercentAvailableMBs]  

            FROM 
                    sys.master_files f
                    CROSS APPLY sys.dm_os_volume_stats(f.database_id, f.[file_id]) s
Run Code Online (Sandbox Code Playgroud)

此查询在 Microsoft SQL Server 2008 R2 (SP2) 中运行良好

但它不适用于 Microsoft SQL Server 2008 R2 (RTM)

我怎样才能使这个查询在 2008 R2 RTM 中工作?(我的意思是有没有其他查询可以用来获得 15% 的可用空间?)

sql-server sql-server-2008-r2 dmv

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

如何存储每个产品的版本序列

我需要创建一个如下所示的表:

+----+---------+---------+
| Id | Product | Version |
+----+---------+---------+
|  1 |       1 |       1 |
|  2 |       1 |       2 |
|  3 |       2 |       1 |
|  4 |       1 |       3 |
|  5 |       2 |       2 |
+----+---------+---------+
Run Code Online (Sandbox Code Playgroud)

哪里IDIdentity(1,1)我需要的Version是自动填充这取决于插入Product

SELECT使用ROW_NUMBER()with可以达到类似的效果PARTITION

SELECT ID, Product,
ROW_NUMBER() OVER(PARTITION BY Product ORDER BY ID) AS Version
FROM Products
Run Code Online (Sandbox Code Playgroud)

我有哪些选择?

database-design sql-server t-sql identity ddl

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

在具有特定命名模式的表上授予选择权

如何在所有以 开头的表上授予选择权VVC_

grant select on VVC_* to user1
Run Code Online (Sandbox Code Playgroud)

sql-server permissions

0
推荐指数
2
解决办法
401
查看次数

查询日期范围

我查询此 SQL 查询:

SELECT * FROM [DB].[dbo].[Table]
WHERE [DATE] BETWEEN '01-01-2016' AND '31-03-2016'
AND ([TIME] >= '00:00:00' OR [DATE] > '01-01-2016')
AND ([TIME] <= '00:00:00' OR [DATE] < '31-03-2016');
Run Code Online (Sandbox Code Playgroud)

但在 SQL Studio 中,结果为另一个日期和时间。

在此处输入图片说明

[DATE] = VARCHAR(10) (DD-MM-YYYY)
[TIME] = VARCHAR(10) (HH:MM:SS) 24h
Run Code Online (Sandbox Code Playgroud)

怎么修 ?

sql-server sql-server-2000 date time

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