Unvoreingenommene performancestest für db, der von SQL server in mySQL kloniert wurde

Ich habe eine database von SQL server in mySQL geklont und jetzt brauche ich einen unvoreingenommene Performance-Test, um den Unterschied zwischen ihnen zu zeigen.

Die DBs haben das gleiche Schema und die gleichen data, so dass eine geradlinige Abfrage gut funktionieren sollte.

Ich möchte ein paar Einschränkungen in Betracht ziehen:

  1. Ich möchte keine Lasten von data abrufen, da das testing kann, wie schnell die Netzwerkverbindungen sind, anstatt die DB-Geschwindigkeit – die 2 DBs sind nirgends in der Nähe von mir oder einander im Netzwerk

  2. Ich möchte nicht, dass die Client-Software das Ergebnis potenziell beeinflusst, also verwende ich Kommandozeilen-Clients SQLCMD und mysql.exe

  3. Ich möchte mit Techniken testing, die die tatsächliche Produktionsnutzung widerspiegeln, also vielleicht massive Tischscans sind keine tolle Idee

  4. Ich möchte sicherstellen, dass proprietry Caching oder andere functionalität mich nicht herauskommt, zB habe ich SELECT COUNT (*) Abfragen gesehen, die anfangs 10 Sek. Und dann nur noch 1 Sekunde dauern.

  5. Ich möchte, dass die Abfrage mindestens 100 Sekunden dauert, so dass ich mich auf die Standard-SQLCMD-Down-to-a-Sekunde-Abfrage-Dauer-timeanzeige verlassen kann und sicher sein kann, dass die Netzwerkgeschwindigkeit nur eine minimale Komponente der Dauer ist.

Es gibt eine Tabelle ( data ), die 50 Millionen Zeilen hat, also ich glaube, ich sollte das Ziel ansprechen. Hier sind 2 Tische aus dem Schema, die ich benutzen könnte. Es gibt alte Sachen dort wie die permissions Zeug, die ignoriert werden können.

 CREATE TABLE forecast ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL UNIQUE, globalRead BIT NOT NULL, globalWrite BIT NOT NULL, description VARCHAR(255) NULL, unitId INT UNSIGNED NULL, active BIT NOT NULL DEFAULT 1, actualization_date DATETIME NULL, CONSTRAINT pk_forecast PRIMARY KEY (id), CONSTRAINT fk_forecast_unit FOREIGN KEY (unitId) REFERENCES unit(id) ) MAX_ROWS 123456; CREATE TABLE data ( forecastId INT UNSIGNED NOT NULL, valueDate DATE NOT NULL, modifiedDate DATE NOT NULL, value FLOAT NOT NULL, CONSTRAINT pk_data PRIMARY KEY (forecastId, valueDate, modifiedDate), CONSTRAINT fk_data_forecastid FOREIGN KEY (forecastId) REFERENCES forecast (id) ) MAX_ROWS 123456789; 

Hier ist eine Abfrage und erkläre aus mysql:

 mysql> EXPLAIN SELECT COUNT(*), AVG(d.value) FROM forecast f INNER JOIN data d ON d.forecastId = f.id; +----+-------------+-------+------------+-------+---------------+------------------+---------+-------------+-------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+------------------+---------+-------------+-------+----------+-------------+ | 1 | SIMPLE | f | NULL | index | PRIMARY | fk_forecast_unit | 5 | NULL | 44006 | 100.00 | Using index | | 1 | SIMPLE | d | NULL | ref | PRIMARY | PRIMARY | 4 | tardis.f.id | 374 | 100.00 | NULL | +----+-------------+-------+------------+-------+---------------+------------------+---------+-------------+-------+----------+-------------+ 2 rows in set, 1 warning (0.01 sec) mysql> SELECT COUNT(*), AVG(d.value) FROM forecast f INNER JOIN data d ON d.forecastId = f.id; +----------+--------------------+ | COUNT(*) | AVG(d.value) | +----------+--------------------+ | 54446441 | -192404867.8813079 | +----------+--------------------+ 1 row in set (14.50 sec) 

Hier ist der Abfrageplan von SQL server:

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[globalagg1007],0), [Expr1005]=CASE WHEN [globalagg1009]=(0) THEN NULL ELSE [globalagg1011]/CONVERT_IMPLICIT(float(53),[globalagg1009],0) END)) |--Stream Aggregate(DEFINE:([globalagg1007]=SUM([partialagg1006]), [globalagg1009]=SUM([partialagg1008]), [globalagg1011]=SUM([partialagg1010]))) |--Parallelism(Gather Streams) |--Compute Scalar(DEFINE:([partialagg1008]=[partialagg1006])) |--Stream Aggregate(DEFINE:([partialagg1006]=Count(*), [partialagg1010]=SUM([Tardis].[dbo].[data].[value] as [d].[value]))) |--Clustered Index Scan(OBJECT:([Tardis].[dbo].[data].[PK_data] AS [d])) 

Wie kann ich das verbessern und fehlt diese Abfrage irgendwelche der Vorbehalte?

Ist es ein fairer Maßstab?