This is a possibility: define a key-value interface for CD and modify how the vertical arrows are built.
However, using a dedicated package such as xy or the more recent TikZ based tikz-cd is recommended.
\documentclass{article}
\usepackage{amscd,keyval}
\makeatletter
\define@key{modCD}{cols}{\setlength{\minCDarrowwidth}{#1}}
\define@key{modCD}{rows}{\setlength{\modCD@rowsep}{#1}}
\newlength{\modCD@rowsep}
\renewenvironment{CD}[1][]
{\modCD@rowsep=20\ex@ % default
\setkeys{modCD}{#1}%
\CDat
\bgroup\relax\iffalse{\fi\let\ampersand@&\iffalse}\fi
\CD@true\vcenter\bgroup\let\\\math@cr\restore@math@cr\default@tag
\tabskip\z@skip\baselineskip20\ex@
\lineskip3\ex@\lineskiplimit3\ex@\halign\bgroup
&\hfill$\m@th##$\hfill\crcr}
{\crcr\egroup\egroup\egroup}
\atdef@ V#1V#2V{\CD@check{V..V..V}{%
\llap{$\m@th\vcenter{\hbox{$\scriptstyle#1$}}$}%
\left\downarrow\vbox to.5\modCD@rowsep{}\right.\kern-\nulldelimiterspace
\rlap{$\m@th\vcenter{\hbox{$\scriptstyle#2$}}$}&&}}
\atdef@ A#1A#2A{\CD@check{A..A..A}{%
\llap{$\m@th\vcenter{\hbox{$\scriptstyle#1$}}$}%
\left\uparrow\vbox to.5\modCD@rowsep{}\right.\kern-\nulldelimiterspace
\rlap{$\m@th\vcenter{\hbox{$\scriptstyle#2$}}$}&&}}
\makeatother
\begin{document}
\[
\begin{CD}
A @>f>> B \\
@VxVV @AAyA\\
C @>g>> D
\end{CD}
\]
\[
\begin{CD}[rows=30ex,cols=10em]
A @>f>> B \\
@VxVV @AAyA\\
C @>g>> D
\end{CD}
\]
\end{document}
The row separation is approximately what's specified in rows=, while cols= specifies the minimum horizontal arrow width.
