sql—在只有100多万条记录的表上运行缓慢:索引是否错误?

xesrikrc  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(248)

我被要求研究一个应用程序的性能问题,这个应用程序正在变得越来越慢。很快,我就把问题缩小到了一个数据库表。结构糟糕的c代码我擅长优化。但是对于sql表,我就没有那么自信了。所以我在这里希望得到一些帮助!
该表存储应用程序中使用的某些关键字的多语言翻译。这是一张生长表。随着它的增长,基本选择和连接的性能开始急剧下降。现在,表中只有100多万条记录,其实并不多。
例如:

SELECT * FROM PE_TranslationPhrase WHERE Phrase = 'ABC-123'

这可能需要8到32秒来完成。
该表托管在azure sql上。以下是ssms中的一个示例:

所以这张table没那么复杂。主键结构不仅仅是普通的自动递增整数。 TranslationId 以及 CultureName 一起组成主键(这很好)。
在处理性能问题时,首先要看的当然是索引。现在摆在table上的是:

CLUSTERED:
 - [TranslationId] ASC,
 - [CultureName] ASC

STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF

NON-CLUSTERED:
 - [CultureName] ASC,
 - INCLUDE ([Phrase])

STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF

非聚集索引的原因 Phrase 以及 CultureName 是因为这些列一直用于筛选器和联接。例子:

LEFT JOIN 
    PE_TranslationPhrase TP 
    ON A.Description COLLATE Latin1_General_CS_AS = TP.Phrase COLLATE Latin1_General_CS_AS 
    AND A.CULTURENAME = TP.CultureName

我试过的,还有问题:
我试图重建索引:

ALTER INDEX ALL ON dbo.PE_TranslationPhrase REBUILD

这似乎对绩效没有明显的影响。
我的问题是:这是坏的吗 CultureName 作为两个索引的一部分?如何更改这些索引?
谢谢!!

cnh2zyt3

cnh2zyt31#

对于此查询:

SELECT * FROM PE_TranslationPhrase WHERE Phrase = 'ABC-123'

你想要一个索引 Phrase 是索引中的第一个键。
你的索引都没有 Phrase 作为第一列,所以数据库需要扫描整个表。

相关问题