我被要求研究一个应用程序的性能问题,这个应用程序正在变得越来越慢。很快,我就把问题缩小到了一个数据库表。结构糟糕的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
作为两个索引的一部分?如何更改这些索引?
谢谢!!
1条答案
按热度按时间cnh2zyt31#
对于此查询:
你想要一个索引
Phrase
是索引中的第一个键。你的索引都没有
Phrase
作为第一列,所以数据库需要扫描整个表。