小编Jer*_*oyd的帖子

哪个更有效,where 子句或与百万多行表的连接?

我们运行的网站在一个表中具有 250 MM 的行,而在另一个表中,我们将其连接到大多数查询中的行不到 15 MM。

示例结构:

MasterTable (Id, UserId, Created, Updated...) -- 15MM Rows
DetailsTable (Id, MasterId, SomeColumn...) -- 250MM Rows
UserTable (Id, Role, Created, UserName...) -- 12K Rows
Run Code Online (Sandbox Code Playgroud)

我们必须定期对所有这些表进行一些查询。一种是抓取免费用户(~10k 免费用户)的统计数据。

Select Count(1) from DetailsTable dt 
join MasterTable mt on mt.Id = dt.MasterId 
join UserTable ut on ut.Id = mt.UserId 
where ut.Role is null and mt.created between @date1 and @date2
Run Code Online (Sandbox Code Playgroud)

问题是这个查询有时会运行很长时间,因为连接发生在 where 之前很久。

在这种情况下,使用 wheres 而不是 joins 或可能更明智where column in(...)吗?

join best-practices

22
推荐指数
2
解决办法
11万
查看次数

如何从 SQL Server 2008 R2 的备份集中删除备份

标题几乎总结了它。我们的备份磁盘空间不足,需要从集合中删除旧备份。我似乎无法找到任何有关此的信息。

backup sql-server-2008-r2 disk-space

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

每秒数千次的插入更新和选择

我有一个表,可以在一秒钟内从数千次中插入、更新和选择。不过我遇到了死锁问题。

  1. 数据库有 2-5 个同时使用 Linq to Sql 的 1000+ 行插入。
  2. 每秒 40 次,还有一个来自该表的选择语句,如果条件为真(95% 的时间为真),则使用类似于以下的代码进行更新:

    创建过程 AccessFile (@code, @admin) AS

    声明@id int、@access 日期时间、@file 字符串

    从代码 = @code 的文件中选择 @id=Id、@accessed = 访问、@file = 文件

    IF @admin<> 0 IF @accessed 为空开始

    设置事务隔离级别读取未提交

    更新文件集访问 = getdate() 其中 id = @id

    设置事务隔离级别读取已提交

    结尾

    选择@id 作为Id,@file 作为文件

似乎是更新与导致死锁的插入冲突。

该示例是一个 1 比 1 的存储过程,唯一的区别是名称。假定为 1 和 2,无论存储过程名称如何。

sql-server-2008 deadlock

7
推荐指数
1
解决办法
801
查看次数

SELECT * WHERE VarCharColumn IN (...) 优化

我有一个包含 3000 个字符串的列表,我将它们(一次 20 个)传递到参数化的 IN 子句中。它绝对没有得到我希望每次执行 500 毫秒的结果。

该列是一个索引。你知道比这更好的方法吗:

SELECT * FROM [ohb].[dbo].[MasterUrls] WITH (NOLOCK) WHERE Hash 
IN(@p0,@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,@p10,@p11,@p12,@p13,@p14,@p15,@p16,@p17,@p18,@p19)
Run Code Online (Sandbox Code Playgroud)

3000 个列表需要 3 到 5 分钟。我真的需要把它缩短到大约 30 秒。这可能吗?

我在具有 24 gigs RAM 的服务器上使用 MSSQL 2008 R2,并在 6HDD (@15k/rpm) RAID 10 ISCSI 上运行双 8 核 NUMA Xeons @2.4Ghz。

该表有 140 万行,索引为非聚集索引。

执行计划将索引扫描显示为总执行的 90%。

index sql-server-2008 sql-server

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

检查 Compact Insert 语句上的重复

我不确定这是否是正确的术语“紧凑插入语句”,这正是我一直听到的。它是这样的:

INSERT INTO [tblUsers]
       ([username], [password]) 
VALUES ('user1', 'pass1'), 
       ('user2', 'pass2')
Run Code Online (Sandbox Code Playgroud)

无论如何,我们有一个超过 500 万行的表,并且即将导入一些数据,但是大约 75% 的数据被复制的可能性很高(我们从多个来源购买数据,但它们共享大约 30-40% 的数据)我们的每个来源:/)。

如果我对列执行唯一约束,则从该点开始整个插入都会失败(当然,除非包含在事务中)。

我只是不知道如何有效地做到这一点以及如何使用可以重用的代码。

sql-server-2008 insert import

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

对于每个插入语句,我在 SQL Server Profiler 中看到 sp_executesql

在调整我们的数据库和查询我们的一种产品时,我决定在 QA 环境中打开 Profiler 并查看它显示的内容。

我看到对于我调用的每个插入,都会使用插入语句的文本对 sp_executesql 进行调用。

这似乎很受欢迎,有没有办法关闭它?

环境:

  • SQL Server 2008 R2 标准版
  • Windows Server 2008 R2 企业版
  • 32 GB 内存
  • 2x4 至强

performance sql-server-2008 profiler

4
推荐指数
2
解决办法
1675
查看次数

多列全文搜索速度非常慢

我在表上有一个articles列的全文索引contenttitle并且keywords

在对每一列进行搜索时,像这样select count(1) from articles where match(content,title,keywords) against ('cats' in boolean mode),结果需要 12 到 15 秒。

但是单独处理这些列 ( select count(1) from articles where match(content) against ('cats' in boolean mode)) 通常需要不到 50 毫秒。

为什么搜索 3 列的时间比单独搜索所有列的时间长 100 多倍?

这不是如何让它更快的问题,而是更多地问“为什么这么慢?”

表/索引

id           int(30)       PK       auto_increment
url          varchar(1024)
title        varchar(255)  FULLTEXT
content      text          FULLTEXT
keywords     varchar(1024) FULLTEXT
comments     text
created_date int(11)
posted_date  int(11)
Run Code Online (Sandbox Code Playgroud)

说明

第一个是多列查询:

在此处输入图片说明

第二个是新的更快的查询,它分别运行 3 列然后合并它们(查询缓存已清除)。

在此处输入图片说明

全文列顺序

在此处输入图片说明

使用/强制索引与解释

在此处输入图片说明

mysql performance optimization full-text-search

3
推荐指数
1
解决办法
8919
查看次数