我有一个简单的 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) 当 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
我有一个包含这些字段的表结果:
每个 number_* 列可以包含一个从 01 到 90 的数字。
我有一个带有 90 个复选框的搜索表单。用户最多可以勾选 5 个复选框。
一旦用户选择 n 复选框,我需要构建一个查询来查找包含所有这些值的行,但数字可以位于五列中的任何一列。
例子:
用户勾选复选框 02、12 和 20。我需要检索所有三个数字的所有行,但我的数字可以在任何 number_* 列中。20 可以在 number_one 列中,02 可以在 number_three 列中,12 可以在 number_four 列中。如何构建此查询?
另外,使用一列而不是五列会更好吗?结果表:
列号包含 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 进行此设置:
我有一个包含 1.000.000 多个条目的表。只有最新的 100.000 个条目被频繁使用。其他 90% 很少使用。
将此表拆分为包含 100.000 个条目的常用表和一个存档表有用吗?
我将不得不移动大约。每天有 10.000 个元素到存档表。
查找元素的服务器逻辑是:
背景
我已经对一个小表和一个大表(数据量多 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) 我有一个不会在生产服务器上运行但它在测试服务器上运行的查询。查询计划似乎无法编译或编译的查询计划非常糟糕。我已经用全扫描更新了所有统计信息,并重建了所有相关表的索引,但没有成功,任何表中的行都没有那么多。我无法更改查询,因为它是 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
我正在编写一个表值函数来根据其郊区、州和邮政编码对地址进行地理编码。我尝试使用不同的方法对地址进行地理编码,以降低准确性的顺序:
(我用的地理区域,其中郊区,邮政编码国家的关系是工作的所有。许多一对多换句话说,一个郊区可以有多个邮政编码;一个邮政编码可以有多个郊区,在不同的国家可能存在)
以下是表值函数的摘录:
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
我最初在 Twitter #sqlhelp 中将此作为一个不同的问题发布,但想以不同的方式发布在这里。
我正在尝试使用 DMV dm_exec_query_stats、dm_exec_cached_plans和dm_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) 我只想清除一个数据库的过程缓存,而不是整个 SQL Server。有办法吗?
performance sql-server-2008 sql-server sql-server-2008-r2 query-performance
我已经阅读了相同架构/查询的 MySQL 和 PostgreSQL 之间的性能差异。以下是对文章的简要复述:
PostgreSQL 表是堆表(意味着没有聚集索引)......(Postgres)表的主键查找需要点击索引,查找文件中的位置,然后点击堆表并拉出记录。这意味着随机磁盘 I/O 的数量... InnoDB 使用不同的方法。使用 InnoDB,表是一个 b 树索引(聚集,物理排序)...... PK 查找所需的随机磁盘 I/O 更少......同时,索引扫描需要遍历两个索引而不是一个(index -> PK index -> table row ),这意味着使用主键以外的任何索引最终都会变慢,而顺序扫描仍然更慢。
哪种查询使用 Postgres 比使用 MySQL InnoDB 快得多?
我理解为什么 PK 查找对于 MySQL 来说要好得多。我不明白:
PS Internet 说 Postgres 更适合复杂查询和子查询,但我仍然不明白为什么它更好?
mysql rdbms postgresql performance query-performance postgresql-performance
过去 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) performance ×10
sql-server ×6
mysql ×4
select ×2
dmv ×1
memory ×1
postgresql ×1
rdbms ×1
subquery ×1
t-sql ×1
where ×1