Windows 2008R2 Enterprise 上的 SQL Server 2008 R2 标准版(64 位)
即使在大量使用情况下 - CPU 超过 80% 数分钟
专用 SQL Server
将服务帐户设置为在内存中锁定
这是正常的吗?
我可以测试什么?
我可以让 SQL Server 使用更多内存吗?
我正在尝试将远程视图中的几行加入本地表。该视图有大约 3 亿行,所以我想使用 REMOTE 查询提示,以便不必将所有 300 万行传输到我的计算机。
SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER JOIN (
SELECT TOP 100 Something, L_ID FROM [RemoteServer].[RemoteDB].[dbo].[RemoteTable]
) R
ON L.ID = R.L_ID
Run Code Online (Sandbox Code Playgroud)
正如我所料,这将返回 100 行,并且基本上不需要时间,正如我所料。
然而,
SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER REMOTE JOIN (
SELECT TOP 100 Something, L_ID FROM [RemoteServer].[RemoteDB].[dbo].[RemoteTable]
) R
ON L.ID = R.L_ID
Run Code Online (Sandbox Code Playgroud)
开始返回数千行。几秒钟后我退出了它,但它是数万 - 数十万。
查询提示如何更改我的结果集?
这是我需要用一些 T-SQL Magic 解决的难题,我尝试过但失败了。
这是其中之一,在我想到实际解决方案之前,我认为我可以在 3 分钟内使用一些 T-SQL 解决,但是当“橡胶遇到道路”时,我无法在脑海中想象正确的运算符来实现这个逻辑。
我想知道 Stack Exchange 社区中是否有人可以找到一个优雅的解决方案。我想通过使用临时表或游标的 3 或 4 个查询的组合,我可以找到解决方案,但它不会基于 SET...
我有一张看起来像这样的桌子(或多或少......)
CREATE TABLE Computers (
ID int IDENTITY(1,1),
ComputerName varchar(255),
OS varchar(255),
AppName varchar(255),
AppVersion varchar(10)
)
Run Code Online (Sandbox Code Playgroud)
因此,每一行都有一个计算机名称、一个操作系统值(可以是 Windows 7 或 Windows 10),然后是应用程序的描述(例如 AppName = "Notepad++", AppVersion = "7.5.6")
ComputerName | OS | AppName | AppVersion
Computer 1 | Windows 7 | App 1 | 1.0
Computer 1 | Windows 7 | App 2 | 1.0
Computer 1 | Windows 7 | …
Run Code Online (Sandbox Code Playgroud) 请参阅下面的第一个查询。
不能将表提示索引和 forceseek 与两个连接组合在一起,并且连接不在 PK 上。
如何使第一个查询编译?
有趣
- 如果只有一个连接或另一个可以组合索引和 forceseek 提示
- 如果索引是 PK 那么可以组合 2 个连接并有两个提示
-- compiler fails
-- Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.
Select Count(Distinct([docSVsys].[sID]))
From [docSVsys] with (nolock)
Left Join [docSVtext] with (nolock, Index(IX_docSVtext_value_sID), forceseek )
On [docSVtext].[sID] = [docSVsys].[sID]
Left Join [docMVtext] with (nolock, Index(ix_docMVtext_value_sID), forceseek)
On [docMVtext].[sID] = [docSVsys].[sID]
where …
Run Code Online (Sandbox Code Playgroud) 我想从一个名为 Orders 的表中计算几个订单日期之间的平均天数。对于每个 CustomerID,订单之间的平均天数是多少。示例表如下(img):
CREATE TABLE #Orders(CustomerID int, OrderDate datetime);
INSERT #Orders(CustomerID, OrderDate) VALUES
(100,'20170114'),(100,'20170123'),(100,'20170129'),
(101,'20170202'),(101,'20170212');
Run Code Online (Sandbox Code Playgroud)
我试过这个查询:
SELECT CustomerID, AVG(OrderDate - PriorDate)
FROM (SELECT CustomerID, OrderDate
, LAG(OrderDate) OVER (PARTITION BY CustomerID ORDER BY OrderDate) as PriorDate
FROM #Orders where CustomerID = 100)
Run Code Online (Sandbox Code Playgroud)
但是,这会产生:
消息 102,级别 15,状态 1
')' 附近的语法不正确。
有简单的Int Identity
我PK。
表有 220 万行。
删除了零行,从未禁用身份。
一次通过 .NET 插入一行,每次插入都检索SCOPE_IDENTITY()
.
20 与它的一些 FK 关系。
我有 98% 的碎片。
知道是什么原因造成的吗?
我知道修复是重建,今晚会这样做。
我想知道如何避免它。
自从填充以来,我已经添加了 3 列。
一些列几乎修改了每个值。
属性的长度没有太大变化。
表定义
/****** Object: Table [dbo].[docSVsys] Script Date: 02/13/2013 15:52:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[docSVsys](
[sID] [int] IDENTITY(1,1) NOT NULL,
[sParID] [int] NULL,
[docID] [varchar](100) NOT NULL,
[attBeg] [varchar](100) NULL,
[attEnd] [varchar](100) NULL,
[docDate] [smalldatetime] NULL,
[addDate] [smalldatetime] NOT NULL,
[mimeType] [varchar](40) …
Run Code Online (Sandbox Code Playgroud) 我有表 B 和表 A。表 B 包含我需要提取的日期记录。但是,我只想在以下情况下拉动它们:
诀窍是我没有钥匙可以加入表格。所以,我使用 Item 列和 date 列来加入。(注意两个项目可以有相同的日期。也可以有多个相同的项目,但日期也不同。)
所以表 B 可能有:
[Item] [Qty] [Date]
F-001100, 400 7/14/2016
F-002200, 750 7/28/2016
F-000767, 1000 7/28/2016
F-006006, 300 8/01/2016
F-002200, 900 7/30/2016
Run Code Online (Sandbox Code Playgroud)
表A可能有:
[Item] [Status] [Qty] [Date0] [Date2] [Date3] [Date4]
F-001100, 1, 400 7/14/2016 7/15/2016 7/16/2016 7/17/2016
F-002200, 0, 750 7/28/2016 7/29/2016 7/30/2016 7/31/2016
Run Code Online (Sandbox Code Playgroud)
所以结果集应该是:
[Item] [Qty] [Date]
F-002200, 750 7/28/2016
F-000767, 1000 7/28/2016
F-006006, 300 8/01/2016
F-002200, 900 7/30/2016 …
Run Code Online (Sandbox Code Playgroud) 我需要用CASE生成WHERE IN ()语句,我试试这个:
SELECT * FROM table
WHERE tbl_column IN ( CASE
WHEN @val = 1 THEN (SELECT * FROM (VALUES (2), (22)) AS X(a)
WHEN @val = 5 THEN (SELECT * FROM (VALUES (13), (18), (44)) AS X(a)
WHEN @val = 7 THEN (SELECT * FROM (VALUES (7)) AS X(a)
END
)
Run Code Online (Sandbox Code Playgroud)
但我收到错误:子查询返回了 1 个以上的值。
我应该怎么做?