1 Eylül 2024'ten itibaren Database Autonomy Service (DAS) içindeki SQL şablonu algoritması, şablon doğruluğunu ve toplama başarısını artırmak için iyileştirilmiştir.
Arka plan bilgileri
DAS, yavaş sorgu ve SQL denetimi senaryolarında analiz ve toplama yapmak üzere SQL deyimlerini şablonlara dönüştürmek için SQL şablonu algoritmasını kullanır. Önceki algoritma kesilmiş SQL deyimlerini yeterince iyi işleyemiyordu. Örneğin, öngörülemeyen konumlardaki kesmeler şablonun gereksiz yere çoğalmasına neden olabilir ve bu durum toplamayı zorlaştırır.
Etkinlik tarihi
1 Eylül 2024'ten itibaren yavaş sorgular ve SQL denetimleri için kullanılan SQL şablonu algoritması iyileştirilmiştir.
1 Eylül 2024'ten sonra SQL şablonu algoritmasındaki yinelemeli iyileştirmeler için ek bildirim gönderilmez. API yanıtları en son değişiklikleri yansıtır.
Kapsam
İyileştirme aşağıdaki veritabanı motorları için geçerlidir: ApsaraDB RDS for MySQL, ApsaraDB RDS for PostgreSQL, ApsaraDB RDS for SQL Server, ApsaraDB RDS for MariaDB ve PolarDB for MySQL.
İçerik
Aşağıdaki iyileştirmeler uygulanmıştır:
-
$$ifadesi ApsaraDB RDS for PostgreSQL için bir dize sabiti sınırlayıcısı olarak tanınır; tanımlayıcılar artık yanlışlıkla soru işaretleriyle (?) değiştirilmez.Örneğin, aşağıdaki özgün SQL deyimi kullanılmıştır:
UPDATE "study" SET "name" = 'xiaoming', "ext" = $${"math":90,"english":91}$$ where id=128;İyileştirmeden önce aşağıdaki SQL şablonu oluşturulurdu:
UPDATE ? SET ? = ?, ? = $${?:?,?:?}$$ where id=?;İyileştirmeden sonra aşağıdaki SQL şablonu oluşturulur:
UPDATE "study" SET "name"=?,"ext"=? WHERE id=?; -
Tablo ve sütun adlarındaki sayısal son ekler yer tutucularla değiştirilerek şablon sayısı azaltılır.
Örneğin, aşağıdaki özgün SQL deyimi kullanılmıştır:
select * from [school_3].[class].[student_25];İyileştirmeden önce aşağıdaki SQL şablonu oluşturulurdu:
select * from [school_3].[class].[student_25];İyileştirmeden sonra aşağıdaki SQL şablonu oluşturulur:
SELECT * FROM [school_?].[class].[student_?]; -
ApsaraDB RDS for SQL Server örneklerinde SQL deyimi ön ekleri kaldırılarak deyim türü ayrıştırması iyileştirilir.
Örneğin, aşağıdaki özgün SQL deyimi kullanılmıştır:
(@P0 nvarchar(4000))select id, name from student WHERE name = @P0;İyileştirmeden önce aşağıdaki SQL şablonu oluşturulurdu:
Generated SQL template: (@P0 nvarchar(?))select id, name from student WHERE name = @P0; Parsed type of the SQL statement: p0İyileştirmeden sonra aşağıdaki SQL şablonu oluşturulur:
Generated SQL template: SELECT id,name FROM student WHERE name=?; Parsed type of the SQL statement: select -
Gereksiz boşluklar kaldırılır ve sözdizimini etkilemeden özgün anahtar kelime büyük/küçük harf kullanımı korunur.
Örneğin, aşağıdaki özgün SQL deyimi kullanılmıştır:
select `name` from `student` where `id` = 1 and (`name` = 'xiaoming' or `class` = 2);İyileştirmeden önce aşağıdaki SQL şablonu oluşturulurdu:
SELECT `name` FROM `student` WHERE `id` = ? AND (`name` = ? OR `class` = ?)İyileştirmeden sonra aşağıdaki SQL şablonu oluşturulur:
SELECT `name` FROM `student` WHERE `id`=? AND (`name`=? OR `class`=?); -
Özgün SQL deyimindeki tüm parantezler (()) korunur.
Örneğin, aşağıdaki özgün SQL deyimi kullanılmıştır:
select `name` from `student` where `id` = 1 and (`name` = 'xiaoming');İyileştirmeden önce aşağıdaki SQL şablonu oluşturulurdu:
SELECT `name` FROM `student` WHERE `id` = ? AND `name` = ?İyileştirmeden sonra aşağıdaki SQL şablonu oluşturulur:
SELECT `name` FROM `student` WHERE `id`=? AND (`name`=?); -
CASE ifadesini çevreleyen parantezler (()) artık "AS" ifadesine dönüştürülmez.
Örneğin, aşağıdaki özgün SQL deyimi kullanılmıştır:
select `name`, ( CASE WHEN score > 90 THEN 'A' END ) `grade` from `student`;İyileştirmeden önce aşağıdaki SQL şablonu oluşturulurdu:
SELECT `name` , CASE WHEN score > ? THEN ? END AS `grade` FROM `student`İyileştirmeden sonra aşağıdaki SQL şablonu oluşturulur:
SELECT `name`,(CASE WHEN score>? THEN ? END)`grade` FROM `student`; -
Diyez işareti (#) sonrası içerik doğru şekilde ayrıştırılabilir.
Örneğin, aşağıdaki özgün SQL deyimi kullanılmıştır:
select `name`, `#grade` from `student`;İyileştirmeden önce aşağıdaki SQL şablonu oluşturulurdu:
SELECT `name`, `İyileştirmeden sonra aşağıdaki SQL şablonu oluşturulur:
SELECT `name`,`#grade` FROM `student`; -
Kesilmiş SQL deyimlerinde eşleşmemiş parantezlerdeki içerik atılarak şablon sayısı azaltılır.
Örneğin, aşağıdaki özgün SQL deyimi kullanılmıştır:
select `name`, `grade` from `student` where id = (select uid fromİyileştirmeden önce aşağıdaki SQL şablonu oluşturulurdu:
select `name`, `grade` from `student` where id = (select uid fromİyileştirmeden sonra aşağıdaki SQL şablonu oluşturulur:
SELECT `name`,`grade` FROM `student` WHERE id= -
Benzer ifadeler birleştirilerek şablonun gereksiz yere çoğalması önlenir.
Örneğin, aşağıdaki özgün SQL deyimi kullanılmıştır:
SELECT CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 70 THEN 'C' WHEN score >= 60 THEN 'D' ELSE 'F' END AS grade FROM students;İyileştirmeden önce aşağıdaki SQL şablonu oluşturulurdu:
SELECT CASE WHEN score >= ? THEN ? WHEN score >= ? THEN ? WHEN score >= ? THEN ? WHEN score >= ? THEN ? ELSE ? END AS grade FROM studentsİyileştirmeden sonra aşağıdaki SQL şablonu oluşturulur:
SELECT CASE WHEN score>=? THEN ? ELSE ? END AS grade FROM students;
Etki
İyileştirmeden sonra DescribeSlowLogs veya DescribeSlowLogRecords işlemini çağırdığınızda belirli bir SQLText için SQLHash değeri değişir.
İyileştirmeden sonra GetFullRequestStatResultByInstanceId veya GetAsyncErrorRequestListByCode işlemini çağırdığınızda SqlId değeri değişir.