标签: sqlperformance

简单自我加入查询不良表现

任何人都可以建议如何提高以下查询的性能.注意,问题似乎是由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)

sql sql-server self-join sqlperformance sql-server-2008

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

通过将数据迁移到同一文件组中的其他文件来清空空文件的性能影响

我们现在有一个数据库,它位于15000 RPM驱动器上,它只是一个日志记录数据库,我们希望将其移动到10000 RPM驱动器.虽然我们可以轻松分离数据库,移动文件并重新附加,这将导致我们试图避免的轻微中断.

所以我们正在考虑使用DBCC ShrinkFile with EMPTYFILE.我们将在10000 RPM驱动器上创建一个比15000 RPM驱动器上的现有文件略大的数据和事务文件,然后执行DBCC ShrinkFile with EMPTYFILE迁移数据.

会产生什么样的影响?

sql sql-server-2005 sqlperformance

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

使用MAX,WHERE和GROUP BY在三个不同的列上提高SQL查询的速度

我试图加快一个查询,大约需要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)

mysql sql sqlperformance

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

在uniqueResult()之前使用setMaxResults(1)进行hibernate优化?

在写字

session.createCriteria(Person.class) .add(Restrictions.eq("id", personId)) .setMaxResults(1) .uniqueResult();

比写作更好

session.createCriteria(Person.class) .add(Restrictions.eq("id", personId)) .uniqueResult();

从优化的角度来看?第一个查询会更快吗?

java hibernate sqlperformance

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

链接 CTE 与临时表的性能影响

我有以下链式 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)

sql t-sql sql-server common-table-expression sqlperformance

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

多次打开和关闭SQL连接有多糟糕?有什么确切的效果?

例如,我需要使用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()调用之前打开连接并在之后关闭?

sql-server sqlconnection fill sqlperformance sqldataadapter

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

如何在SQL中将单行拆分为多行

我有一个表如下所示..它有多个列用于不同的延迟

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)

sql sql-server sql-function sqlperformance sql-server-2012

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

SQL Server:合并性能

我有一个包含 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)

sql sql-server merge sqlperformance

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

如何使用SQL Server批量更新?

我有一个包含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)

sql sql-server sqlperformance sql-update

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

执行具有多列和多个更新的一个更新是否更有效

你觉得什么更好.即使没有更改所有值,也会每次更新表的所有列,或仅更新具有多个更新的已更改列.这个想法是,而不是立即更新每个更改,等待一些更改,然后更新所有列,但我不想实现一个逻辑谁确定哪些列已被更改.

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.

sql sqlperformance sql-server-2014-express

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