Questions tagged «query-performance»

有关改善数据库查询的性能和/或效率的问题。

1
为什么不能使用sys.query_store_plan加入消除功能?
以下是查询存储遇到的性能问题的简化: CREATE TABLE #tears ( plan_id bigint NOT NULL ); INSERT #tears (plan_id) VALUES (1); SELECT T.plan_id FROM #tears AS T LEFT JOIN sys.query_store_plan AS QSP ON QSP.plan_id = T.plan_id; 该plan_id列被记录为的主键sys.query_store_plan,但是执行计划未按预期使用联接消除: 没有从DMV投影任何属性。 DMV主键plan_id不能复制临时表中的行 使用A LEFT JOIN,因此无法T消除中的任何行。 执行计划 为什么会这样?在这里如何做才能消除连接?

2
每一批都会导致编译
我们有一个第三方应用程序,它可以批量发送T-SQL语句。 该数据库托管在SQL Server 2016 Enterprise SP1 CU7、16核和256GB内存上。启用即席优化。 这是正在执行的查询的虚拟示例: exec sp_executesql N' IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT select field1, field2 from table1 where field1=@1 option(keep plan, keepfixed, loop join) select field3, field4 from table2 where field3=@1 option(keep plan, keepfixed, loop join)', N'@1 nvarchar(6)',@1=N'test' 当我监视数据库并查看批处理/秒和编译/秒时,我注意到它们始终相同。在高负载下,这可以是1000批/秒和1000编译/秒。在平均负载下,有150个批次/秒。 我分析了最近编译的计划的查询缓存: SELECT TOP …

1
优化2,135,044,521行表上的索引
我有一张大桌子的I / O问题。 一般统计 该表具有以下主要特征: 环境:Azure SQL数据库(层为P4 Premium(500个DTU)) 行:2,135,044,521 1,275个已使用的分区 聚集和分区索引 模型 这是表的实现: CREATE TABLE [data].[DemoUnitData]( [UnitID] [bigint] NOT NULL, [Timestamp] [datetime] NOT NULL, [Value1] [decimal](18, 2) NULL, [Value2] [decimal](18, 2) NULL, [Value3] [decimal](18, 2) NULL, CONSTRAINT [PK_DemoUnitData] PRIMARY KEY CLUSTERED ( [UnitID] ASC, [Timestamp] ASC ) ) GO ALTER …

2
不相关的列会影响select语句的查询时间吗?
我只是好奇。 假设您有一个包含100万条记录/行的表。 select order_value from store.orders 该表在实际查询时间内是1个字段,2个字段还是100个字段是否有所不同?我的意思是除“ order_value”以外的所有字段。 现在,我正在将数据推送到数据仓库。有时我将字段转储到表中,“将来可能在某天使用”-但是现在没有任何查询。这些“外部”字段会直接或间接影响不包含它们的选择语句吗(否*我的意思是)?

1
为什么READPAST提示导致索引视图被忽略?
我正在研究使用READPAST提示来减少应用程序财务子系统中的资源锁定。 这似乎是个好方法,因为金融交易记录仅被添加,从未更新或删除。唯一会被跳过的行是在事务内部插入的全新行。在交易落实之前,它们实际上不存在于外界。 但是,我注意到使用READPAST提示的索引视图的查询性能较差。比较查询计划时,它看起来像是带有提示,查询优化器选择不使用索引视图,而是退回到将其视为常规视图。 我不确定为什么会这样。我想象索引视图与任何其他索引一样,可以在操作期间锁定键,并且添加操作READPAST也可以类似。 SELECT TOP 1 isa.InvoiceId FROM Financial_InvoiceSummaryAmounts isa WITH (READPAST) WHERE isa.TotalOwedAmount = 0.0 SELECT TOP 1 isa.InvoiceId FROM Financial_InvoiceSummaryAmounts isa WHERE isa.TotalOwedAmount = 0.0 添加NOEXPAND提示似乎也可以,但是我有兴趣了解更多有关为什么可能READPAST导致查询优化器首先做出选择的原因(作为完整答案的一部分)。

3
仅当过滤的部分位于JOIN而不是WHERE时才使用过滤的索引
我在下面创建了过滤索引,但是当我进一步向下运行2个查询时,该索引仅在JOIN中具有END_DTTM而不是where子句的第一个示例中用于查找(这是查询中的唯一区别) 。谁能解释为什么会这样? 索引创建 CREATE NONCLUSTERED INDEX [ix_PATIENT_LIST_BESPOKE_LIST_ID_includes] ON [dbo].[PATIENT_LIST_BESPOKE] ( [LIST_ID] ASC, [END_DTTM] ASC ) WHERE ([END_DTTM] IS NULL) 查询 DECLARE @LIST_ID INT = 3655 --This one seeks on the index SELECT PATIENT_LISTS.LIST_ID FROM DBO.PATIENT_LISTS LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID AND PATIENT_LIST_BESPOKE.END_DTTM IS NULL WHERE PATIENT_LISTS.LIST_ID = @LIST_ID …

2
启用S​​QL Server全文索引后更新查询的速度变慢
我有一个asp.net网站,其中有许多针对我的数据库运行的插入,更新和删除查询。 几天前,我在一个表的两列上创建了全文索引。之后,我意识到当网站在该表上运行更新查询时,SQL Server进程的内存和磁盘使用率正在跳跃,更新速度变慢。在创建全文索引之前,查询运行没有任何性能问题。 我还意识到以前非常简单的更新查询现在变得很复杂,因为执行计划现在具有全文索引更新之类的功能。这是新的执行计划的一部分,该计划在启用全文本后变得很复杂: 在更新网站内容的几个小时中,我运行了5000个更新查询,并且我认为每次为每行完成全文索引过程。 我应该在开始更新行时禁用全文本扫描,然后重新启用它(如此相关问题所示)吗? 我可以告诉SQL Server在5分钟内停止全文索引编制,然后开始对新数据编制索引吗? 有更好的选择吗?我正在使用SQL Server 2012。

1
为什么在此查询中不使用主键(集群键)?
我有一个SQL Server 2008 R2表,其表结构如下所示: CREATE TABLE [dbo].[CDSIM_BE] ( [ID] [bigint] NOT NULL, [EquipmentID] [varchar](50) NOT NULL, [SerialNumber] [varchar](50) NULL, [PyrID] [varchar](50) NULL, [MeasMode] [varchar](50) NULL, [ReadTime] [datetime] NOT NULL, [SubID] [varchar](15) NULL, [ProbePosition] [float] NULL, [DataPoint] [int] NULL, CONSTRAINT [PK_CDSIM_BE] PRIMARY KEY CLUSTERED ([ID] ASC, [EquipmentID] ASC, [ReadTime] ASC) WITH …

2
MySQL:左外部联接和内部联接之间哪个联接更好
如果所有连接都提供相同的结果,哪个连接比较好执行?例如,我有两个表employees(emp_id,name, address, designation, age, sex)和work_log(emp_id,date,hours_wored)。为了得到一些特定的结果,inner join并left join给出相同的结果。但是,我还有一些疑问,不仅限于这个问题。 在结果值相同的情况下,哪个连接更有效? 申请加入时还必须考虑哪些其他因素? 内部联接和交叉联接之​​间有什么关系吗?

2
由于行估计非常不准确,导致全文搜索速度缓慢
对该数据库进行全文查询(存储RT(请求跟踪程序)票证)似乎需要很长时间才能执行。附件表(包含全文数据)约为15GB。 数据库模式如下,大约有200万行: rt4 =#\ d +附件 表“ public.attachments” 专栏 类型 修饰符| 储存| 描述 ----------------- + ----------------------------- +- -------------------------------------------------- ------ + ---------- + ------------- id | 整数| 不是null默认nextval('attachments_id_seq':: regclass)| 普通 transactionid | 整数| 不为空| 普通 父| 整数| 不为null默认值0 | 普通 messageid | 角色变化(160)| | 扩展| 主题| 字符变化(255)| | 扩展| 文件名| 字符变化(255)| …


4
差距和孤岛:客户端解决方案与T-SQL查询
用于间隙和孤岛的T-SQL解决方案能否比在客户端上运行的C#解决方案运行得更快? 具体来说,让我们提供一些测试数据: CREATE TABLE dbo.Numbers ( n INT NOT NULL PRIMARY KEY ) ; GO INSERT INTO dbo.Numbers ( n ) VALUES ( 1 ) ; GO DECLARE @i INT ; SET @i = 0 ; WHILE @i < 21 BEGIN INSERT INTO dbo.Numbers ( n ) SELECT n + …

1
查询优化:时间间隔
总的来说,我有两种时间间隔: presence time 和 absence time absence time 可以具有不同的类型(例如休息,缺席,特殊日子等),并且时间间隔可能重叠和/或相交。 这是不肯定的,只有间隔的合理组合,原始数据存在,例如。重叠的存在间隔没有意义,但可能存在。我现在尝试通过多种方法来确定出现的时间间隔-对我来说,最舒服的似乎是紧随其后的时间间隔。 ;with "timestamps" as ( select "id" = row_number() over ( order by "empId", "timestamp", "opening", "type" ) , "empId" , "timestamp" , "type" , "opening" from ( select "empId", "timestamp", "type", case when "types" = 'starttime' then 1 else -1 …

3
这两个查询在逻辑上是否等效?
这两个查询在逻辑上是否等效? DECLARE @DateTime DATETIME = GETDATE() 查询1 SELECT * FROM MyTable WHERE Datediff(DAY, LogInsertTime, @DateTime) > 7 查询2 SELECT * FROM MyTable WHERE LogInsertTime < @DateTime - 7 如果它们在逻辑上不是等效的,您可以给我第一个查询的逻辑等效,以便WHERE子句可以有效地使用索引(即消除函数包装)吗?

3
TSQL性能-最小和最大之间的值JOIN
我有两个表存储在其中: IP范围-国家/地区查询表 来自不同IP的请求列表 IP存储为,bigint以提高查找性能。 这是表结构: create table [dbo].[ip2country]( [begin_ip] [varchar](15) NOT NULL, [end_ip] [varchar](15) NOT NULL, [begin_num] [bigint] NOT NULL, [end_num] [bigint] NOT NULL, [IDCountry] [int] NULL, constraint [PK_ip2country] PRIMARY KEY CLUSTERED ( [begin_num] ASC, [end_num] ASC ) ) create table Request( Id int identity primary key, [Date] datetime, IP …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.