任何人都可以建议如何提高以下查询的性能.注意,问题似乎是由where子句引起的.
数据(表包含一组巨大的行--500K +,调用的参数集,每个查询返回2-5K记录,当前需要8-10分钟):
USE [SomeDb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Data](
[x] [money] NOT NULL,
[y] [money] NOT NULL,
CONSTRAINT [PK_Data] PRIMARY KEY CLUSTERED
(
[x] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
查询
select top 10000
s.x as sx,
e.x as ex,
s.y as sy,
e.y as ey,
e.y - s.y as y_delta,
e.x - …Run Code Online (Sandbox Code Playgroud) 我们现在有一个数据库,它位于15000 RPM驱动器上,它只是一个日志记录数据库,我们希望将其移动到10000 RPM驱动器.虽然我们可以轻松分离数据库,移动文件并重新附加,这将导致我们试图避免的轻微中断.
所以我们正在考虑使用DBCC ShrinkFile with EMPTYFILE.我们将在10000 RPM驱动器上创建一个比15000 RPM驱动器上的现有文件略大的数据和事务文件,然后执行DBCC ShrinkFile with EMPTYFILE迁移数据.
会产生什么样的影响?
我试图加快一个查询,大约需要60秒才能完成约2000万行的表.
对于此示例,该表有三列(id,dateAdded,name).id是主键.我添加到表中的索引是:
(dateAdded)
(name)
(id, name)
(id, name, dateAdded)
Run Code Online (Sandbox Code Playgroud)
我试图运行的查询是:
SELECT MAX(id) as id, name
FROM exampletable
WHERE dateAdded <= '2014-01-20 12:00:00'
GROUP BY name
ORDER BY NULL;
Run Code Online (Sandbox Code Playgroud)
日期在查询之间是可变的.
这样做的目的是在添加日期或之前获取每个名称的最新条目.
当我在查询上使用explain时,它告诉我它正在使用(id,name,dateAdded)索引.
+----+-------------+------------------+-------+------------------+----------------------------------------------+---------+------+----------+-----------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------+------------------+----------------------------------------------+---------+------+----------+-----------------------------------------------------------+
| 1 | SIMPLE | exampletable | index | date_added_index | id_element_name_date_added_index | 162 | NULL | 22016957 | Using where; Using index; Using temporary; Using …Run Code Online (Sandbox Code Playgroud) 在写字
session.createCriteria(Person.class)
.add(Restrictions.eq("id", personId))
.setMaxResults(1)
.uniqueResult();
比写作更好
session.createCriteria(Person.class)
.add(Restrictions.eq("id", personId))
.uniqueResult();
从优化的角度来看?第一个查询会更快吗?
我有以下链式 CTE 查询(简化):
;WITH CTE1
AS(
SELECT * FROM TableA
),
CTE2
AS(
SELECT * FROM TableB b INNER JOIN CTE1 c ON b.id = c.id
)
SELECT * FROM CTE2
Run Code Online (Sandbox Code Playgroud)
如果我打破 CTE 链并将 CTE1 的数据存储到临时表中,则整体查询的性能会提高(从 1 分 20 秒缩短到 8 秒)。
;WITH CTE1
AS(
SELECT * FROM TableA
)
SELECT * INTO #Temp FROM CTE1
;WITH CTE2
AS(
SELECT * FROM TableB b INNER JOIN #Temp c ON b.id = c.id
)
SELECT * FROM CTE2
DROP TABLE #Temp …Run Code Online (Sandbox Code Playgroud) 例如,我需要使用SQLDataAdapter的Fill()方法填充大量DataTable:
DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....
Run Code Online (Sandbox Code Playgroud)
即使所有的dataadapter对象都使用相同的SQLConnection,每个Fill方法都会打开和关闭连接,除非在方法调用之前连接状态已经打开.
我想知道的是,如何不必要地打开和关闭SQLConnections会影响应用程序的性能.需要扩展多少才能看到此问题的不良影响(100,000个并发用户?).在中型网站(每天50000个用户)中,是否值得烦恼并搜索所有Fill()调用,将它们保存在代码中并在任何Fill()调用之前打开连接并在之后关闭?
我有一个表如下所示..它有多个列用于不同的延迟
Date API Latency1_Avg Latency1_Min Latency1_Max Latency2_Avg Latency2_Min Latency2_Max
---- --- ------------ ------------ ------------ ------------ ------------ ------------
7/26/13 Foo 12 35 45 453 433 435
7/26/13 Bar 33 33 33 234 243 234
Run Code Online (Sandbox Code Playgroud)
我想输出一个表,将每行分成多行,如下所示
Date API Latency Aggregation Value
---- ---- ------- ----------- -----
7/26/13 Foo Latency1 Avg 12
7/26/13 Foo Latency1 Min 35
7/26/13 Foo Latency1 Max 45
7/26/13 Foo Latency2 Avg 453
7/26/13 Foo Latency2 Min 433
7/26/13 Foo Latency2 Max 435
Run Code Online (Sandbox Code Playgroud)
.....
现在,我正在做的是这个
SELECT
Date,
API,
"Latency1" …Run Code Online (Sandbox Code Playgroud) 我有一个包含 500 万行的数据库表。聚集索引是自增标识列。PK 是生成 256 字节的代码VARCHAR,它是 URL 的 SHA256 哈希,这是表上的非聚集索引。
表格如下:
CREATE TABLE [dbo].[store_image](
[imageSHAID] [nvarchar](256) NOT NULL,
[imageGUID] [uniqueidentifier] NOT NULL,
[imageURL] [nvarchar](2000) NOT NULL,
[showCount] [bigint] NOT NULL,
[imageURLIndex] AS (CONVERT([nvarchar](450),[imageURL],(0))),
[autoIncID] [bigint] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_imageSHAID] PRIMARY KEY NONCLUSTERED
(
[imageSHAID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX [autoIncPK] ON [dbo].[store_image]
(
[autoIncID] ASC
)WITH …Run Code Online (Sandbox Code Playgroud) 我有一个包含1000万行的表,我需要与另一个表连接并更新所有数据.这花费的时间超过1小时,并且我的事务日志增加了10多GB.还有另一种方法可以提高这种性能吗?
我相信每次更新后,都会检查索引和约束,并记录所有信息.有没有办法告诉SQL Server仅在更新完成后检查约束并最小化更新操作?
我的查询如下.我修改了一些名字,因此更容易阅读.
UPDATE o
SET o.Info1 = u.Info1, o.Info2 = u.Info2, o.Info3 = u.Info3
FROM Orders o
INNER JOIN Users u
ON u.ID = o.User_ID
Run Code Online (Sandbox Code Playgroud)
编辑:如评论中所述,表定义类似于以下内容(再次简化以创建一般问题).
ID int PK
OrderNumber nvarchar(20)
User_ID int FK to table Users
Info1 int FK to table T1
Info2 int FK to table T2
Info2 int FK to table T3
Run Code Online (Sandbox Code Playgroud)
ID int PK
UserName nvarchar(20)
Info1 int FK to table T1
Info2 int FK to table T2
Info2 int FK …Run Code Online (Sandbox Code Playgroud) 你觉得什么更好.即使没有更改所有值,也会每次更新表的所有列,或仅更新具有多个更新的已更改列.这个想法是,而不是立即更新每个更改,等待一些更改,然后更新所有列,但我不想实现一个逻辑谁确定哪些列已被更改.
UPDATE myTable
SET col1 = newVal1,
col2 = oldVal2,
col3 = newVal3,
...
WHERE x = y
Run Code Online (Sandbox Code Playgroud)
与
UPDATE myTable SET col1 = newVal1 WHERE x = y
UPDATE myTable SET col3 = newVal3 WHERE x = y
...
Run Code Online (Sandbox Code Playgroud)
我正在使用SQL Server 2014 Express.
sqlperformance ×10
sql ×8
sql-server ×6
fill ×1
hibernate ×1
java ×1
merge ×1
mysql ×1
self-join ×1
sql-function ×1
sql-update ×1
t-sql ×1