标签: query-performance

TSQL SVF 调用中的障碍

我有一个简单的 Products 数据表,其中包含 100k 条记录(仅生成一些随机数据):

set nocount on

create table dbo.temp_Products
(
    [ProductID] int,
    [Type] tinyint,
    [Price] float,
    [Weight] float 
)

declare @rowcnt int = 0
while (@rowcnt <= 100000)
begin
    insert into dbo.temp_Products
    select @rowcnt, 1+rand()*4, 1+rand()*100, 1+rand()*10

    set @rowcnt = @rowcnt + 1
end
Run Code Online (Sandbox Code Playgroud)

以及进行简单逻辑计算的标量值函数:

create function dbo.usvf_CalculateShipping
(
    @PricePerKG float = 1,
    @Type tinyint,
    @WeightInKG float = 1
)
returns float
as
begin

    return  /*get the appropriate factor to apply*/
            case
                when @Type = 1 then 0.1 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql query-performance

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

查询处理和缓冲池

当 SQLServer Server 2008r2开始处理查询时,我知道它需要解析 SQL 文本并创建计划,以及其他一些步骤。

它是在缓冲池之外的内存中完成所有这些工作的,对吗?

在实际执行查询以检索/操作数据之前,缓冲池不会发挥作用,对吗?

设想:服务器不是我配置的)

SQL Server 2008r2 SP1 - 是的,它需要打补丁,这是在雷达上 96 GB 的 RAM 最大内存设置为 92 GB 缓冲池,位于 80 GB 以下 使用 PLE 超过 4 小时 查看 resource_semaphore WAITS

如果我理解用于处理查询的内存授予不是来自缓冲池,而是来自剩余的可用内存,那么减少 MAX Memory 应该有助于重新调整 WAIT 类型。我的想法是将 MAX Memory 设置为 72 GB。你的意见?

谢谢!

performance sql-server memory sql-server-2008-r2 query-performance

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

在多列中搜索多个值

我有一个包含这些字段的表结果:

  • ID
  • 结果 ID
  • number_one (int)
  • number_two (int)
  • number_three (int)
  • number_four (int)
  • 数字五(整数)

每个 number_* 列可以包含一个从 01 到 90 的数字。

我有一个带有 90 个复选框的搜索表单。用户最多可以勾选 5 个复选框。

一旦用户选择 n 复选框,我需要构建一个查询来查找包含所有这些值的行,但数字可以位于五列中的任何一列。

例子:

用户勾选复选框 02、12 和 20。我需要检索所有三个数字的所有行,但我的数字可以在任何 number_* 列中。20 可以在 number_one 列中,02 可以在 number_three 列中,12 可以在 number_four 列中。如何构建此查询?

另外,使用一列而不是五列会更好吗?结果表:

  • ID
  • 结果 ID
  • 数字(字符串)

列号包含 02-12-20-57-84,其中 - 是分隔符。

示例:用户勾选复选框 02、12 和 20。所以我的查询将是

SELECT * 
FROM results 
WHERE numbers LIKE "%02%" 
    AND numbers LIKE "%12%" 
    AND numbers LIKE "%20%";
Run Code Online (Sandbox Code Playgroud)

更新:我目前正在使用 MySQL 进行此设置:

  • ID
  • 结果 ID
  • number_one …

mysql performance select where query-performance

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

将表拆分为常用表和存档表有用吗?

我有一个包含 1.000.000 多个条目的表。只有最新的 100.000 个条目被频繁使用。其他 90% 很少使用。

将此表拆分为包含 100.000 个条目的常用表和一个存档表有用吗?

我将不得不移动大约。每天有 10.000 个元素到存档表。

查找元素的服务器逻辑是:

  1. 在常用表中搜索。
  2. 如果在那里找不到,请在存档表中搜索。

背景

我已经对一个小表和一个大表(数据量多 10 倍)中的随机数据进行了一些测试。一个SELECT为一个特定的元素查询了0.6倍以上的时间在大表比小的一个。我相信这会对每秒 1000 多个查询的整体性能产生影响。


@里克詹姆斯

创建是

CREATE TABLE IF NOT EXISTS `note` (
  `note_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `title` varchar(100) NOT NULL,
  `content` text NOT NULL,
  `date_added` datetime NOT NULL,
  `date_modified` datetime NOT NULL,
  PRIMARY KEY (`note_id`),
  KEY `FK_note_user` (`user_id`),
  CONSTRAINT `FK_note_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE NO ACTION
) ENGINE=InnoDB …
Run Code Online (Sandbox Code Playgroud)

mysql performance database-design query-performance

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

查询不会编译/运行

我有一个不会在生产服务器上运行但它在测试服务器上运行的查询。查询计划似乎无法编译或编译的查询计划非常糟糕。我已经用全扫描更新了所有统计信息,并重建了所有相关表的索引,但没有成功,任何表中的行都没有那么多。我无法更改查询,因为它是 AOS (AX 2012) 创建的。我应该怎么做才能按原样使用查询?

询问

DECLARE @P1 AS BIGINT = 5637144576
DECLARE @P2 AS NVARCHAR(4) = N'1003'
DECLARE @P3 AS INT = 212
DECLARE @P4 AS BIGINT = 5638885273
DECLARE @P5 AS BIGINT = 5637144576
DECLARE @P6 AS INT = 865
DECLARE @P7 AS BIGINT = 5637144576
DECLARE @P8 AS BIGINT = 5637144576

SELECT     t1.balance01, 
           t1.recid, 
           t2.amountcur, 
           t2.dataareaid, 
           t2.recid, 
           t3.recid, 
           t3.voucher, 
           t3.accountnum, 
           t3.approved, 
           t3.closed, 
           t3.dataareaid, 
           t4.party, 
           t4.dataareaid, 
           t4.recid 
FROM       spectrans T1 
CROSS JOIN custtransopen T2 
CROSS JOIN custtrans T3 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan sql-server-2014 query-performance

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

UNION ALL 或其他方式返回结果集的第一行

我正在编写一个表值函数来根据其郊区、州和邮政编码对地址进行地理编码。我尝试使用不同的方法对地址进行地理编码,以降低准确性的顺序

  1. 独特的郊区-邮政编码-州组合的精确匹配
  2. 独特的郊区邮政编码组合的精确匹配
  3. 独特的郊区-州组合的精确匹配
  4. 与唯一邮政编码完全匹配
  5. 非唯一邮政编码的近似匹配,其中具有此邮政编码的所有郊区彼此相距在 5 公里以内。

(我用的地理区域,其中郊区,邮政编码国家的关系是工作的所有。许多一对多换句话说,一个郊区可以有多个邮政编码;一个邮政编码可以有多个郊区,在不同的国家可能存在)

以下是表值函数的摘录:

ALTER FUNCTION [geocode].[tvfn_Customer_Suburb_From_Address]
(   
    @Suburb NVARCHAR(100),
    @State NVARCHAR(100),
    @Postcode NVARCHAR(100),
    @Country NVARCHAR(100)
)
RETURNS TABLE 
AS
RETURN 
(

    SELECT TOP 1 *
    FROM (

            -- Unique suburb-postcode-state combinations
            SELECT   s.Suburb_DID
                    ,s.Suburb
                    ,s.State
                    ,s.Postcode
                    ,Geocode_DID = 4 -- Exact match by unique Postcode, Suburb and State
                    ,s.Geocode_Latitude
                    ,s.Geocode_Longitude
            FROM geocode.tSuburbs_XX s
            INNER JOIN [geocode].[tGeocode_Methods] gm
                ON s.Geocode_DID = gm.Geocode_DID

            WHERE s.[Is_Active] = 1
            AND s.[Suburb] = @Suburb …
Run Code Online (Sandbox Code Playgroud)

performance sql-server set-returning-functions query-performance

6
推荐指数
2
解决办法
6193
查看次数

对连接到 sys.databases 的查询统计和执行计划运行针对 DMV 的查询

我最初在 Twitter #sqlhelp 中将此作为一个不同的问题发布,但想以不同的方式发布在这里。

我正在尝试使用 DMV dm_exec_query_statsdm_exec_cached_plansdm_exec_sql_text以及最初的sys.databases创建一个跟踪各种统计数据(例如读取、写入、CPU、执行计数等)性能最差的语句的作业。

发生的情况是,这个查询有时(并非总是)在繁忙的服务器上运行需要超过 8 分钟,但是一旦我删除了对sys.databases的连接,只需要 9 秒。这段时间的大部分时间是 CPU 时间,几乎没有等待,没有阻塞,没有扫描,只有 13406 次逻辑读取和 1562 次 lob 读取。

所以我想知道的是,为什么加入 sys.databases导致巨大的性能下降?为什么不一致?

发生的情况是,当我运行以下测试查询时,有时会无缘无故地花费超过 8 分钟,而其他时间则在 11 秒内完成。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
DECLARE @snapshot_timeoffset AS datetimeoffset(3) = CAST(SYSDATETIMEOFFSET() AS datetimeoffset(3));

SELECT
    @snapshot_timeoffset AS [snapshot_timeoffset]
    ,db.name AS [database_name]  
    ,OBJECT_SCHEMA_NAME(st.objectid, st.dbid) [schema_name] 
    ,OBJECT_NAME(st.objectid, st.dbid) [object_name]   
    ,cp.objtype
    ,cp.usecounts
    ,cp.refcounts
    -- find the offset of the actual …
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan dmv query-performance

6
推荐指数
2
解决办法
539
查看次数

如何清除单个数据库中的所有计划?

我只想清除一个数据库的过程缓存,而不是整个 SQL Server。有办法吗?

performance sql-server-2008 sql-server sql-server-2008-r2 query-performance

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

Postgres 的哪些查询比 MySQL InnoDB 更快

我已经阅读了相同架构/查询的 MySQL 和 PostgreSQL 之间的性能差异。以下是对文章的简要复述:

PostgreSQL 表是堆表(意味着没有聚集索引)......(Postgres)表的主键查找需要点击索引,查找文件中的位置,然后点击堆表并拉出记录。这意味着随机磁盘 I/O 的数量... InnoDB 使用不同的方法。使用 InnoDB,表是一个 b 树索引(聚集,物理排序)...... PK 查找所需的随机磁盘 I/O 更少......同时,索引扫描需要遍历两个索引而不是一个(index -> PK index -> table row ),这意味着使用主键以外的任何索引最终都会变慢,而顺序扫描仍然更慢。

哪种查询使用 Postgres 比使用 MySQL InnoDB 快得多?

我理解为什么 PK 查找对于 MySQL 来说要好得多。我不明白:

  1. 为什么通过两个索引(InnoDB,通过非 PK 索引查找)查找要慢得多?它是否需要两倍以上的 I/O 或 CPU?它可以弥补 PK 查找提升的巨大好处吗?
  2. 为什么 InnoDB 顺序扫描更慢?

PS Internet 说 Postgres 更适合复杂查询和子查询,但我仍然不明白为什么它更好?

mysql rdbms postgresql performance query-performance postgresql-performance

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

检索尚未分配到工作的车辆驾驶员的数据

过去 24 小时都在为某事挣扎。需要一些天才来发光。我正在尝试为驱动程序显示每周工作循环/日志,它将显示:

  • 尚未分配给司机的工作
  • 已分配给司机的工作
  • 如果作业已分配给驱动程序,则显示当天可用的驱动程序
  • 如果当天没有工作,则显示所有可用驱动程序的列表

最后2点是我真正挣扎的地方。

我有以下表格:

drivers ('driver_id', 'driver_name')

vehicles ('vehicle_id', 'vehicle_make', 'vehicle_model')

jobs ('job_id', 'collection_address', 'collection_datetime', 'delivery_address', 'deliver_datetime', 'driver_id', 'vehicle_id') 
Run Code Online (Sandbox Code Playgroud)

我附上了下面的输出屏幕:

在此处输入图片说明

例如,如果您查看 23/09/2016,司机 Keith 正在工作,但 Nick 有空。但是,如果我执行子查询,它会显示两个驱动程序,这不是正确的结果。我的 SQL 语句如下,如果有人可以提供帮助,我将不胜感激。

    SELECT listofdays.job_date, j.job_id, IF( j.driver_id > 0 AND j.job_id > 0, (SELECT driver_name FROM t_drivers WHERE driver_id = j.driver_id LIMIT 1), '') as job_driver, IF( j.vehicle_id > 0, (SELECT vehicle_reg FROM t_vehicles WHERE vehicle_id = j.vehicle_id LIMIT 1), 'no') as job_vehicle, j.collection_town, j.collection_postcode, j.delivery_town, j.delivery_postcode, j.job_status
 FROM …
Run Code Online (Sandbox Code Playgroud)

mysql performance subquery select query-performance

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