标签: query-performance

如何在 postgres 中优化窗口查询

我有下表,大约有 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

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

Postgres - 使用索引插入性能

我们在 Postgres 9.2.10 数据库中有一个大约有 20 列的表。为了在某​​些SELECT查询上获得更好的性能,我们计划在数据类型为 的列上添加索引timestamp。由于索引也会降低插入的性能,我们做了以下性能测试:

我们在表中插入了 500 万条记录。那是最大值。我们期望在生产中的记录数。然后我们测量了在时间戳列上插入有索引和没有索引的 10000 条记录的时间。这是我们每天预期的最大插入次数,峰值每秒不超过 5 次插入。

结果如下:

  • 带索引 - 84 441 毫秒
  • 无索引 - 78 000 毫秒

至少对于本次测试,该指数仅略微降低了性能。对于我们的要求,我没有看到添加索引的问题。

但这只是实验室环境中的一项测试,在生产数据库上运行时是否还有其他陷阱?我们是否会遇到INSERT在特定情况下突然需要超过 5 秒的情况?

postgresql performance index index-tuning query-performance

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

过程中意外的隐式转换

我有一个这样的程序(简化):

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

7
推荐指数
2
解决办法
477
查看次数

将日期列表条件中的日期转换为日期范围列表

我想查找发生在特定日期的所有记录。

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 会很棒)

mysql performance condition date query-performance

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

查询在 SQL Server 2014 中很慢,在 SQL Server 2012 中很快

在将我们的一个数据库从 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

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

如何防止大量 SELECT 阻塞其他语句?

我们的 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

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

帮助查找没有谓词的连接

很像swasheck 的一个相关问题,我有一个历史上曾遭受性能问题的查询。我正在查看 SSMS 上的查询计划并注意到Nested Loops (Inner Join)警告:

无连接谓词

根据一些仓促的研究(鼓舞人心的DBABrent 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

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

SQL Server 2008 R2 中的超前/滞后实现:超出最大内存

背景

我正在尝试建立一个“访问”序列,其中如果在基本相同的地方(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 PRECEDINGPARTITIONing 子句中),我正在尝试解决此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

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

改进 DbGeography 查询

我对数据库管理还是个新手,我正在尝试优化搜索查询。

我有一个看起来像这样的查询,在某些情况下需要 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

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

什么是最有效的 SELECTIVE XML 索引?

我正在尝试为 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 index xml sql-server query-performance

6
推荐指数
1
解决办法
1399
查看次数