我有下表,大约有 175k 条记录:
Column | Type | Modifiers
----------------+-----------------------------+-------------------------------------
id | uuid | not null default uuid_generate_v4()
competition_id | uuid | not null
user_id | uuid | not null
first_name | character varying(255) | not null
last_name | character varying(255) | not null
image | character varying(255) |
country | character varying(255) |
slug | character varying(255) | not null
total_votes | integer | not null default 0
created_at | timestamp without time zone |
updated_at | timestamp without time …
Run Code Online (Sandbox Code Playgroud) postgresql performance index-tuning window-functions rank query-performance
我们在 Postgres 9.2.10 数据库中有一个大约有 20 列的表。为了在某些SELECT
查询上获得更好的性能,我们计划在数据类型为 的列上添加索引timestamp
。由于索引也会降低插入的性能,我们做了以下性能测试:
我们在表中插入了 500 万条记录。那是最大值。我们期望在生产中的记录数。然后我们测量了在时间戳列上插入有索引和没有索引的 10000 条记录的时间。这是我们每天预期的最大插入次数,峰值每秒不超过 5 次插入。
结果如下:
至少对于本次测试,该指数仅略微降低了性能。对于我们的要求,我没有看到添加索引的问题。
但这只是实验室环境中的一项测试,在生产数据库上运行时是否还有其他陷阱?我们是否会遇到INSERT
在特定情况下突然需要超过 5 秒的情况?
我有一个这样的程序(简化):
CREATE PROCEDURE test @userName VARCHAR(64)
SELECT *
FROM member M
INNER JOIN order O
ON M.MemberId=O.MemberId
WHERE M.Username = @userName
Run Code Online (Sandbox Code Playgroud)
Member 表的 Username 列上有一个非聚集索引。
计划缓存显示隐式转换如下:
查找键[1]:前缀:[MyDatabase].[dbo].[Member].Username = Scalar Operator(CONVERT_IMPLICIT(varchar(64),[@Username],0))
我只是想知道是什么导致了这种隐式转换,因为参数和字段数据类型“UserName”都是 varchar(64)?
像这样从框架调用 SP:
EXEC test @Username=N'webSite.com'
Run Code Online (Sandbox Code Playgroud)
谢谢你。
performance sql-server stored-procedures execution-plan sql-server-2008-r2 query-performance
我想查找发生在特定日期的所有记录。
SELECT *
FROM table1
WHERE date(column) in ($date1, $date2, ...);
Run Code Online (Sandbox Code Playgroud)
但是,正如你们中的许多人一样,知道这种比较不适用于索引。所以,我想知道是否有一种简单的方法可以将此查询转换为以下查询的样式而无需太多努力(即:不使用外部工具)。
SELECT *
FROM table1
WHERE (column >= $date1 AND column < $date1 + interval 1 day)
OR (column >= $date2 AND column < $date2 + interval 1 day)
...
Run Code Online (Sandbox Code Playgroud)
所以优化器仍然可以使用索引。(我正在使用 MySQL,但 ANSI SQL 会很棒)
在将我们的一个数据库从 SQL Server 2012 (SP1, CU2) 迁移到 SQL Server 2014 (SP1) 的过程中,我们遇到了一些奇怪的问题。
在 SQL Server 2012 上几秒钟内完成的查询之一似乎挂在 SQL Server 2014 上。
SELECT DISTINCT
src.[Id]
FROM
[stg].[BaseVolumes] src
JOIN
[tmp].[Dates] d ON src.[CalWeek_Nmbr] = d.[CalYrWkDense_Nmbr]
WHERE
EXISTS (SELECT *
FROM
(SELECT ctry.[ISOCode] AS [Mkt_Code]
, so.[Code] AS [SlsOrg_Code_AK]
, so.[DistributionChannelCode] AS [DistChnl_Code_AK]
, prd.[SupplierCode] AS [SKU_Code_AK]
, cl6.[Code] AS [CstHierLvl06_Code_AK]
, lp.[BaseDateID] AS [Dte_EK]
FROM [PM_APP].[edw].[BaseVolumeDayCurrent] lp
JOIN [PM_APP].[dbo].[Country] ctry ON lp.[CountryID] = ctry.[ID]
JOIN [PM_APP].[dbo].[SalesOrganisation] so ON lp.[SalesOrganisationID] = so.[ID] …
Run Code Online (Sandbox Code Playgroud) performance sql-server execution-plan sql-server-2014 query-performance
我们的 SQL Azure 数据库包含一个SELECT
每天运行一次的大量语句。沉重的SELECT
语句不包含锁定提示。最近我们观察到生产中的一些停顿,这sys.dm_exec_requests
是那段时间显示的内容......运行时间最长的查询是SELECT
具有PAGEIOLATCH_SH
等待类型的繁重查询。接下来是其他查询——最常见的INSERT
是具有PAGEIOLATCH_EX
等待类型的语句,所有语句都运行了几十秒而不是立即完成。所以基本上,SELECT
只有重才会干扰其他查询。
我该如何解决?我可以接受SELECT
缓慢运行的繁重工作,但不应中断其他查询。
performance sql-server azure-sql-database blocking query-performance
很像swasheck 的一个相关问题,我有一个历史上曾遭受性能问题的查询。我正在查看 SSMS 上的查询计划并注意到Nested Loops (Inner Join)
警告:
无连接谓词
根据一些仓促的研究(鼓舞人心的DBA和Brent Ozar 的信心),看起来这个警告告诉我我的查询中有一个隐藏的笛卡尔积。我已经检查了几次我的查询,但没有看到交叉连接。这是查询:
DECLARE @UserId INT; -- Stored procedure input
DECLARE @Now DATETIME2(7) = SYSUTCDATETIME();
;WITH AggregateStepData_CTE AS -- Considering converting this CTE into an indexed view
(
SELECT
[UA].[UserId] -- FK to the UserId
, [UA].[DeviceId] -- FK to the push device's DeviceId (int)
, SUM(ISNULL([UA].[LatestSteps], 0)) AS [Steps]
FROM [User].[UserStatus] [UA]
INNER JOIN [User].[CurrentConnections] [M] ON
[M].[Monitored] = [UA].[UserId] AND …
Run Code Online (Sandbox Code Playgroud) performance join sql-server azure-sql-database query-performance
我正在尝试建立一个“访问”序列,其中如果在基本相同的地方(General_Location
)检测到动物,则算作一次访问,但如果它去其他地方然后返回,则是对同一位置的额外访问。因此,如果在一个Location
序列
A1, A2, A3, A3, A3, A1, B2, D4, A2
中检测到动物,例如所有 A(n) 位置都属于General_Location
“A”,则前 6 个检测为访问 1 (@A),接下来为访问 2 (@B),接下来为访问 3 (@D),接下来是访问 4(返回 @A)。
由于LAG
并且LEAD
在 SQL Server 2008R2 中不可用(也不UNBOUNDED PRECEDING
在PARTITION
ing 子句中),我正在尝试解决此SQL 权威博客条目中所述的变通方法。
我遇到了以下内存问题(更不用说计算时间了):
WITH s AS (
SELECT
RANK() OVER (PARTITION BY det.Technology, det.XmitID ORDER BY DetectDate ASC, ReceiverID ASC) as DetID,
COALESCE(TA.AnimalID, det.Technology+'-'+cast(da.XmitID AS nvarchar), 'BSVALUE999') as AnimalID,
det.Technology, det.XmitID, DetectDate, det.location as …
Run Code Online (Sandbox Code Playgroud) performance sql-server sql-server-2008-r2 window-functions query-performance
我对数据库管理还是个新手,我正在尝试优化搜索查询。
我有一个看起来像这样的查询,在某些情况下需要 5-15 秒来执行,并且还导致 100% 的 CPU 使用率:
DECLARE @point geography;
SET @point = geography::STPointFromText('POINT(3.3109015 6.648294)', 4326);
SELECT TOP (1)
[Result].[PointId] AS [PointId],
[Result].[PointName] AS [PointName],
[Result].[LegendTypeId] AS [LegendTypeId],
[Result].[GeoPoint] AS [GeoPoint]
FROM (
SELECT
[Extent1].[GeoPoint].STDistance(@point) AS distance,
[Extent1].[PointId] AS [PointId],
[Extent1].[PointName] AS [PointName],
[Extent1].[LegendTypeId] AS [LegendTypeId],
[Extent1].[GeoPoint] AS [GeoPoint]
FROM [dbo].[GeographyPoint] AS [Extent1]
WHERE 18 = [Extent1].[LegendTypeId]
) AS [Result]
ORDER By [Result].distance ASC
Run Code Online (Sandbox Code Playgroud)
该表在 PK 上有一个聚集索引,在geography
类型列上有一个空间索引。
所以当我执行上述查询时,它正在执行扫描操作。
所以我在LegendTypeId
列上创建了一个非聚集索引:
CREATE NONCLUSTERED INDEX [GeographyPoint_LegendType_NonClustered] ON [dbo].[GeographyPoint] …
Run Code Online (Sandbox Code Playgroud) performance index sql-server optimization spatial query-performance
我正在尝试为 1 亿行表中的 XML 列确定最有效的选择性 XML 索引。我的问题类似于:
用于选择性 Xml 索引的 Sql Server 2012 扩展事件未显示结果
但是答案中指定的选择性索引的具体好处没有详细讨论。
以下是查询的简化版本:
;WITH CTE AS
( SELECT 1 AS ID,
CONVERT(XML, '<Root>
<ParentTag ParentTagID="Sample Text">
<ChildTag1>5</ChildTag1>
<ChildTag1>6</ChildTag1>
<ChildTag1>7</ChildTag1>
<ChildTag2>8</ChildTag2>
<ChildTag2>9</ChildTag2>
<ChildTag2>10</ChildTag2>
<OtherTag>LargeIrrelevantData</OtherTag>
</ParentTag>
</Root>'
) AS SampleXML
)
SELECT * INTO dbo.CTE FROM CTE
SELECT ID,
Root.ParentTag.value('@ParentTagID','NVARCHAR(MAX)') AS ParentTagID,
RootParentTag1.ChildTag1.value('(text())[1]', 'NVARCHAR(MAX)') AS ChildTag1,
NULL
FROM CTE
OUTER APPLY CTE.SampleXML.nodes('/Root/ParentTag') as Root(ParentTag)
OUTER APPLY Root.ParentTag.nodes('ChildTag1') as RootParentTag1(ChildTag1)
UNION
SELECT ID,
Root.ParentTag.value('@ParentTagID','NVARCHAR(MAX)') AS ParentTagID,
NULL,
RootParentTag2.ChildTag2.value('(text())[1]', 'NVARCHAR(MAX)') AS …
Run Code Online (Sandbox Code Playgroud) performance ×10
sql-server ×7
index ×3
index-tuning ×2
postgresql ×2
blocking ×1
condition ×1
date ×1
join ×1
mysql ×1
optimization ×1
rank ×1
spatial ×1
xml ×1