Potenza di 2 e prestazioni in SQL Server

0

Molte operazioni matematiche (come divisione, moltiplicazione, ecc.) dovrebbero essere calcolate più velocemente quando si ha a che fare con la potenza di due numeri (C ++, C #?, ...)

Ad esempio 15 * 256 = 0x0e spostato a destra (veloce) 8 bit = 0x0e00 = 3840
Considerando che 15 * 255 = 0x0e moltiplicato per (lento) 0xff = 0x0ef1 = 3825

Questo tipo di ottimizzazione si verifica anche in SQL Server?

Non credo che ci sia, ho provato a misurare una differenza di tempo di esecuzione di query come quelle:

SET STATISTICS TIME ON

SELECT
    AVG(N / 256)
FROM DBO.V_VIRTUAL_NUMBERS
WHERE N < 1048576


SELECT
    AVG(N / 255)
FROM DBO.V_VIRTUAL_NUMBERS
WHERE N < 1000000

SET STATISTICS TIME OFF

che ha provocato:

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 203 ms,  elapsed time = 207 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 218 ms,  elapsed time = 206 ms.
    
posta Serge 25.06.2014 - 10:30
fonte

1 risposta

1

Many mathematical operation (such as division, multiplication, etc.) are supposed to be computed faster when dealing with power of two numbers.

For instance 15 * 256 = 0x0e right shifted (fast) 8 bits = 0x0e00 = 3840

Whereas 15 * 255 = 0x0e multiplied by (slow) 0xff = 0x0ef1 = 3825

Does this kind of optimization even happen in SQL Server?

Ne dubito molto.

Se dovessi usare esplicitamente operatori bit-wise (non riesci a ricordare se SqlServer ha anche ha loro) allora sì, potresti vedere un miglioramento alcuni ma semplicemente passare SqlServer un'espressione aritmetica con cui lavorare allora no; eseguirà semplicemente il calcolo [floating-point] e sarà fatto con esso.

L'alternativa è analizzare ogni espressione cercando operazioni di moltiplicazione o divisione che coinvolgono valori che solo capita di un po 'di potenza di due e quindi di riscrivere quell'espressione per utilizzare operatori bit-wise.
Considerati i processori moderni, questo è probabilmente più di un sovraccarico di un semplice scricchiolio dei numeri in primo luogo.

    
risposta data 25.06.2014 - 13:39
fonte

Leggi altre domande sui tag